解决宿主机 连接虚拟机下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,连接即恢复。

 

现象复现与验证

  1. 挂起后立刻在宿主机执行
    sysctl net.ipv4.ip_forward

    几乎总是返回 0
  2. 此时宿主机可以 ping 容器IP,但telnet 宿主机映射端口 3306 会卡死;容器内也访问不到外网。
  3. 执行
    systemctl restart network # 或 reboot
     
    后,内核重新加载 /etc/sysctl.confip_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 即可永久解决,无需每次重启网络
 
posted @ 2025-07-01 23:48  当下是吾  阅读(144)  评论(0)    收藏  举报