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

自定义Docker容器内运行的MySQL服务无法连接问题如何解决

核心问题

0.0.0.0不是可用于访问的目标IP,它只是服务端配置监听时的占位符,代表监听当前主机所有网卡接口。
你在WSL2 Ubuntu终端能通过0.0.0.0连接MySQL,是因为你执行命令的环境和MySQL容器共享WSL2的网络命名空间的外层端口映射,0.0.0.0会被解析为WSL2本地回环地址。但API服务运行在独立容器内,容器内部的0.0.0.0指向API容器自身的网卡,自然无法找到运行在另一个容器中的MySQL服务。
Windows终端的报错逻辑同理:0.0.0.0在Windows侧指向Windows自身的所有网卡,WSL2默认没有把MySQL的3306端口映射到Windows物理网卡上,所以连接失败。你不指定host时能连接,是因为mysql客户端默认走本地套接字/命名管道,匹配的是你Windows本地安装的MySQL实例,和Docker中运行的MySQL不是同一个服务。

修复步骤
  • 首先为两个容器创建专属Docker网桥(避免默认网桥的DNS解析限制)
    执行命令:docker network create backend-app-net
    启动两个容器时都添加--network backend-app-net参数,同时给MySQL容器指定固定名称,比如mysql-db,示例启动命令:
    # 启动MySQL容器
    docker run -d --name mysql-db --network backend-app-net -p 3306:3306 -e MYSQL_ROOT_PASSWORD=@G3minar31 [你的MySQL镜像名]
    # 启动API容器
    docker run -d --name backendapi --network backend-app-net -p 5001:80 [你的API镜像名]
    
  • 修改API配置文件中的数据库连接字符串
    同一Docker网桥下的容器可以直接用容器名作为域名互相访问,将连接字符串修改为:
    "Server=mysql-db; Port=3306; Uid=root; Pwd=@G3minar31; Database=cybersecuritydatabase"
  • 可选方案(不推荐,跨网络性能更低):如果需要通过宿主IP访问,在WSL2 Ubuntu终端执行ip addr show eth0查询WSL2的内网IP(通常为172.x.x.x段),将连接字符串的Server字段替换为该IP即可,同时需要确认防火墙没有拦截3306端口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:09:05