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" \
...