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

Docker环境下Web应用容器无法连接MySQL容器的排查方案咨询

排查思路与解决方案

一、先确认Docker网络配置

容器间互通的核心前提是处于同一自定义网络(默认bridge网络存在DNS解析缺陷,不推荐依赖):

  • 执行docker network ls列出所有网络,再用docker inspect <容器名/ID>查看每个容器的NetworkSettings.Networks字段,确认两者是否归属同一网络。
  • 若不在同一网络,执行docker network connect <数据库容器所在网络名> <Web容器名/ID>将Web容器加入对应网络,之后重启Web容器测试。

二、检查MySQL容器的网络与权限配置

本地能连不代表容器间可访问,需确认两个关键配置:

  • 检查MySQL的绑定地址:进入MySQL容器执行mysql -u root -p -e "SHOW VARIABLES LIKE 'bind_address';",若结果为127.0.0.1则仅本地可访问,需修改配置为0.0.0.0(监听所有接口)或删除bind-address配置项后重启容器。
  • 检查MySQL用户权限:本地连接可能用的是root@localhost,容器间连接需用户允许从任意地址(测试用)或Web容器IP段访问。执行以下命令刷新权限:
    GRANT ALL PRIVILEGES ON <目标数据库名>.* TO '<用户名>'@'%' IDENTIFIED BY '<密码>';
    FLUSH PRIVILEGES;
    

三、用容器名代替IP地址访问

Docker自定义网络支持DNS解析,容器名可直接作为地址(IP会随容器重启变化,不建议硬编码):

  • 将Web应用的数据库连接地址改为MySQL容器的名称(例如mysql-db),而非手动指定的IP。
  • 进入Web容器执行ping <MySQL容器名>,若能通则说明DNS解析正常,再测试数据库连接。

四、验证端口连通性(别依赖ping)

部分容器禁用ICMP(ping),但数据库用TCP端口通信,直接测端口更准确:

  • 进入Web容器,执行telnet <MySQL容器名/IP> 3306或nc -zv <MySQL容器名/IP> 3306测试端口是否开放。若端口通,问题出在MySQL权限或Web应用配置;若不通,回到网络配置排查。

五、排查宿主机防火墙/安全组

宿主机防火墙可能阻断容器间流量:

  • 检查ufw、firewalld等本地防火墙规则,执行ufw status或firewall-cmd --list-all,确认未拒绝Docker子网的流量(默认Docker会自动配置规则,但若手动修改过需恢复)。
  • 云服务器需确认安全组未限制容器内部端口(容器间通信不走公网端口,此步主要排除宿主机本地拦截)。

六、核对Web应用连接参数

最后确认应用本身的配置细节:

  • 连接端口用MySQL容器内部的端口(默认3306),而非宿主机映射的端口(例如-p 3307:3306中的3307是给宿主机用的,容器间仍用3306)。
  • 确认用户名、密码、数据库名与本地测试的参数完全一致,避免拼写错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:05:25