购买了服务器,没有使用docker部署mysql服务,自己在宿主机中部署了mysql服务,上篇讲解了如果使用工具外网进行连接,后发现docker容器中的后端服务连不上,故此篇用于记录如何解决的。


目前我解决的地方:

将配置文件的数据库中的地址IP   修改为了如下命令IP地址即可。

ip addr show docker0   //使用Docker网桥IP去进行连接

不要去使用阿里云中IP的如图:


宿主机MySQL服务连接Docker容器的解决方案

问题分析

当MySQL直接部署在宿主机(非Docker环境),而Docker容器内的服务无法连接时,通常存在以下核心问题:

  1. 网络隔离:Docker容器默认使用独立网络命名空间
  2. 绑定地址限制:MySQL默认仅监听127.0.0.1
  3. 防火墙规则:宿主机防火墙可能拦截容器流量
解决步骤
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/macOShost.docker.internal
  • Windowsgateway.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范围。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐