Docker容器无法连接宿主机MySQL的解决方案

学习笔记作者:admin日期:2025-06-09点击:30

摘要:总结了Docker容器连接宿主机MySQL数据库时遇到的常见问题及解决方案,包括获取宿主机IP、MySQL权限配置、防火墙设置等。

问题与解决方案

问题描述

      在运行Docker容器时,无法通过宿主机的IP地址(如172.17.0.1)访问宿主机上的MySQL数据库。

解决方案

1. 使用host.docker.internal

      推荐使用Docker提供的host.docker.internal DNS名称,直接设置:

-e MYSQL_HOST="host.docker.internal"

2. 手动获取宿主机IP

      如果host.docker.internal不可用,可通过以下命令获取宿主机IP:

ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1

      然后将其设置为MYSQL_HOST。

3. 配置MySQL

      确保MySQL监听所有IP,修改配置文件:

[mysqld]
bind-address = 0.0.0.0

      重启MySQL服务。

4. 设置MySQL用户权限

      确保用户允许远程连接:

CREATE USER 'waline'@'%' IDENTIFIED BY 'waline';
GRANT ALL PRIVILEGES ON waline.* TO 'waline'@'%';
FLUSH PRIVILEGES;

5. 防火墙设置

      允许Docker子网访问MySQL端口:

ufw allow from 172.17.0.0/16 to any port 3306

6. 自动化脚本

      编写脚本自动获取宿主机IP并启动容器:

#!/bin/bash
HOST_IP=$(ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
docker run -d --name waline -p 8360:8360 \
  -v /root/dockerData/waline/data:/app/data \
  -e MYSQL_HOST="$HOST_IP" \
  ...

最终运行命令

docker run -d --name waline -p 8360:8360 \
  -v /root/dockerData/waline/data:/app/data \
  -e MYSQL_HOST="host.docker.internal" \
  ...

上一篇      下一篇