You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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直接连接(推荐)

  1. 获取宿主机真实IP
    • Linux/macOS:执行ip addr或ifconfig,找到非127.0.0.1的本地IP(比如192.168.1.100)
    • Windows:执行ipconfig,找到本地局域网IP
  2. 修改JDBC连接字符串
    替换成宿主机IP:
    jdbc:mysql://192.168.1.100:3306/my-template?useSSL=false
    
  3. 确保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;
      

方案二:关闭host网络,用桥接+extra_hosts

  1. 修改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: {}
    
  2. 修改JDBC连接字符串
    jdbc:mysql://fc.database:3306/my-template?useSSL=false
    
  3. 同样需要完成MySQL的外部访问配置(同方案一的第3步)

排查验证步骤

  • 进入容器内部,执行ping 宿主机IP,确认网络连通性
  • 用telnet 宿主机IP 3306测试MySQL端口是否开放
  • 查看MySQL的error.log,排查是否有拒绝连接的日志记录

内容的提问来源于stack exchange,提问作者Doug

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:25:16