购买了服务器,没有使用docker部署mysql服务,自己在宿主机中部署了mysql服务,上篇讲解了如果使用工具外网进行连接,后发现docker容器中的后端服务连不上,故此篇用于记录如何解决的。
目前我解决的地方:
将配置文件的数据库中的地址IP 修改为了如下命令IP地址即可。
ip addr show docker0 //使用Docker网桥IP去进行连接

不要去使用阿里云中IP的如图:
宿主机MySQL服务连接Docker容器的解决方案
问题分析
当MySQL直接部署在宿主机(非Docker环境),而Docker容器内的服务无法连接时,通常存在以下核心问题:
- 网络隔离:Docker容器默认使用独立网络命名空间
- 绑定地址限制:MySQL默认仅监听
127.0.0.1 - 防火墙规则:宿主机防火墙可能拦截容器流量
解决步骤
1. 修改MySQL绑定地址
编辑MySQL配置文件(通常位于/etc/mysql/mysql.conf.d/mysqld.cnf):
[mysqld]
bind-address = 0.0.0.0 # 允许所有IP访问
重启MySQL服务:
sudo systemctl restart mysql
2. 创建专用数据库用户
在MySQL中执行:
CREATE USER 'docker_user'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON *.* TO 'docker_user'@'%';
FLUSH PRIVILEGES;
3. 配置容器网络连接
在容器内连接时使用特殊主机名:
- Linux/macOS:
host.docker.internal - Windows:
gateway.docker.internal
示例连接字符串:
# Docker Compose配置示例
services:
backend:
environment:
DB_HOST: "host.docker.internal"
DB_PORT: 3306
DB_USER: "docker_user"
DB_PASS: "StrongPassword123!"
4. 开放宿主机防火墙
允许3306端口通行:
sudo ufw allow 3306/tcp # Ubuntu
# 或
sudo firewall-cmd --permanent --add-port=3306/tcp # CentOS
sudo firewall-cmd --reload
5. 验证网络连通性
在容器内执行测试:
docker exec -it backend_container bash
apt-get update && apt-get install -y telnet # 如未安装
telnet host.docker.internal 3306
故障排查表
| 现象 | 检查点 | 解决命令 |
|---|---|---|
| 连接超时 | 防火墙状态 | sudo ufw status |
| 拒绝访问 | MySQL用户权限 | SELECT host, user FROM mysql.user; |
| 无法解析主机 | Docker DNS配置 | docker run --add-host=host.docker.internal:host-gateway ... |
| 协议错误 | MySQL版本兼容性 | ALTER USER 'docker_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; |
连接原理示意图
graph LR
A[Docker容器] -->|通过虚拟网桥| B[宿主网络]
B -->|访问 0.0.0.0:3306| C[MySQL进程]
C -->|验证 docker_user@% | D[数据库实例]
关键提示:生产环境建议添加IP白名单限制,可通过
GRANT ... TO 'user'@'172.17.0.%'限制Docker网段访问,或使用--ip-range指定容器IP范围。

3125

被折叠的 条评论
为什么被折叠?



