如何从Docker容器内部连接宿主机的MySQL实例?
Docker容器连接宿主机MySQL问题解决
问题梳理
- 本地运行Web应用时,用连接字符串
jdbc:mysql://127.0.0.1:3306/my-template?useSSL=false能正常连接MySQL - 把应用放到Docker容器中后,无法连接到宿主机的MySQL
- 尝试配置
extra_hosts映射fc.database到127.0.0.1:3306,并修改连接字符串为jdbc:mysql://fc.database/my-template?useSSL=false,但没有效果 - 当前docker-compose配置启用了
network_mode: "host"
核心问题原因
当容器使用network_mode: host时,容器会直接复用宿主机的网络栈,此时extra_hosts配置是无效的——因为容器的hosts文件和宿主机完全一致,额外的映射不会生效。而且容器里的127.0.0.1指向容器自身,不是宿主机,这就是连接失败的关键。
两种可行解决方案
方案一:用宿主机真实IP直接连接(推荐)
- 获取宿主机真实IP
- Linux/macOS:执行
ip addr或ifconfig,找到非127.0.0.1的本地IP(比如192.168.1.100) - Windows:执行
ipconfig,找到本地局域网IP
- Linux/macOS:执行
- 修改JDBC连接字符串
替换成宿主机IP:jdbc:mysql://192.168.1.100:3306/my-template?useSSL=false - 确保MySQL允许外部访问
- 修改MySQL配置文件(
my.cnf或my.ini),把bind-address从127.0.0.1改成0.0.0.0(允许所有IP访问)或宿主机IP,然后重启MySQL - 给MySQL用户开放远程访问权限:
GRANT ALL ON `my-template`.* TO '你的数据库用户名'@'%' IDENTIFIED BY '你的数据库密码'; FLUSH PRIVILEGES;
- 修改MySQL配置文件(
方案二:关闭host网络,用桥接+extra_hosts
- 修改docker-compose.yml
删除network_mode: "host",调整extra_hosts格式(不要加端口,只填宿主机IP):version: '3' services: tomcat: image: 'local/myapp:r1' build: context: '.' volumes: - './logs:/usr/local/tomcat/logs' ports: - '8080:8080' extra_hosts: - "fc.database:192.168.1.100" # 替换成你的宿主机真实IP volumes: {} - 修改JDBC连接字符串
jdbc:mysql://fc.database:3306/my-template?useSSL=false - 同样需要完成MySQL的外部访问配置(同方案一的第3步)
排查验证步骤
- 进入容器内部,执行
ping 宿主机IP,确认网络连通性 - 用
telnet 宿主机IP 3306测试MySQL端口是否开放 - 查看MySQL的
error.log,排查是否有拒绝连接的日志记录
内容的提问来源于stack exchange,提问作者Doug
相关产品推荐
相关产品推荐

