解决宿主机 连接虚拟机下Docker容器内MySQL连接失败问题
在检查相关配置无误后的通用解决方案
1、重启网络管理器: 有时,重启网络管理器可以解决网络连接问题。
sudo systemctl restart NetworkManager
2、重启Docker服务: 重启Docker服务及其相关容器,有时能够解决临时的连接问题。
sudo systemctl restart docker docker restart <container_id>
3、检查日志: 查看Docker和容器的日志,寻找可能的错误信息。
docker logs <container_id>
p.s 为什么VMware上使用docker安装的mysql 每次需要重启网路 才能正常访问,否则明明端口 ip都正常就是连接失败?
原因:
VMware 虚拟机挂起 → 恢复后,宿主机内核的 IPv4 转发(ip_forward)被重置为 0,导致 Docker 网桥(docker0)上的容器无法做 NAT 出站/入站,于是出现“端口、IP 都正常却连不上”的现象;一旦重启网络服务,系统重新加载 sysctl.conf 并把 ip_forward 设为 1,连接即恢复。
现象复现与验证
-
挂起后立刻在宿主机执行
sysctl net.ipv4.ip_forward
几乎总是返回0。 -
此时宿主机可以
ping 容器IP,但telnet 宿主机映射端口 3306 会卡死;容器内也访问不到外网。 -
执行
systemctl restart network # 或 reboot
后,内核重新加载/etc/sysctl.conf,ip_forward=1生效,连接瞬间正常。
一次性根治办法
把转发写进常驻 sysctl 配置并立即生效,避免挂起再被重置:
# 1. 写入配置 echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf # 2. 立即加载 sysctl -p # 3. 验证 sysctl net.ipv4.ip_forward # 应返回 1
可选补充(如仍遇防火墙拦截)
-
若宿主机开了 firewalld,需放行 3306:
firewall-cmd --permanent --add-port=3306/tcp firewall-cmd --reload
总结
VMware 挂起会丢失内核转发标志,Docker 网桥 NAT 失效 → 容器端口看似监听却无法握手;
把
把
net.ipv4.ip_forward = 1 固化到 /etc/sysctl.conf 即可永久解决,无需每次重启网络

浙公网安备 33010602011771号