虚拟机挂起,重启后主机连接不上虚拟机docker中的mysql?(docker网络状态假死)

在docker中创建了一个mysql容器,docker是在一个centos的vm虚拟机里的,把虚拟机挂起,第二天打开电脑开启虚拟机,主机却连接不到docker中创建的mysql了,这是什么情况?

虚拟机挂起(suspend)后再恢复,Docker 容器网络状态"假死" ,导致宿主机(或外部)连不上 MySQL。核心原因不是 MySQL 挂了,而是网络栈没恢复好


✅ 现象总结

  • VM 挂起 → 第二天恢复 → 主机连不上 Docker MySQL
  • 容器可能还在运行,但端口映射失效或网络断连

🔍 根本原因

虚拟机挂起(suspend)会冻结整个系统状态,包括:

  • 网络接口(eth0、docker0、veth pair)
  • NAT 表、iptables 规则
  • Docker 的网络命名空间

恢复后,Docker 的网络栈没有重新初始化,导致:

  • 端口映射(-p 3306:3306)失效
  • 容器 IP 不可达
  • 主机访问 VM_IP:3306 超时

✅ 解决方案(任选其一)

✅ 方法 1:重启 Docker 服务(推荐)

在 VM 里执行:

bash 复制代码
sudo systemctl restart docker

这会重新初始化 Docker 的网络栈 ,容器会自动重启(如果你用了 --restart=always),然后端口映射就恢复了。

✅ 方法 2:重启容器

如果你不想重启整个 Docker,可以只重启容器:

bash 复制代码
docker restart <mysql_container_name>
✅ 方法 3:避免挂起,改用关机

虚拟机挂起 容易出这种网络问题,建议用正常关机保存快照代替挂起。


🔍 验证恢复

在主机上执行:

bash 复制代码
telnet <VM_IP> 3306

bash 复制代码
mysql -h <VM_IP> -P 3306 -u root -p

能连上就说明恢复了。


✅ 建议

  • 给 MySQL 容器加 --restart=always,防止意外停掉

  • 如果频繁挂起 VM,考虑用 Host 网络模式--network host),减少 NAT 层:

    bash 复制代码
    docker run --network host -e MYSQL_ROOT_PASSWORD=xxx mysql:8

✅ 总结一句话

VM 挂起后 Docker 网络"假死",重启 Docker 或容器即可恢复。

相关推荐
旺仔.29144 分钟前
Linux 信号详解
linux·运维·网络
Lxinccode1 小时前
docker(28) : 别名配置
docker·容器·eureka·docker别名
未来龙皇小蓝3 小时前
【MySQL-索引调优】11:Group by相关概念
数据库·mysql·性能优化
源远流长jerry4 小时前
在 Ubuntu 22.04 上配置 Soft-RoCE 并运行 RDMA 测试程序
linux·服务器·网络·tcp/ip·ubuntu·架构·ip
学不完的4 小时前
Docker数据卷管理及优化
运维·docker·容器·eureka
枕布响丸辣4 小时前
MySQL 从入门到精通:完整操作手册与实战指南
数据库·mysql
虾..4 小时前
UDP协议
网络·网络协议·udp
原来是猿5 小时前
MySQL【用户管理】
数据库·mysql
w-w0w-w5 小时前
Unix网络编程
服务器·网络·unix
未知鱼5 小时前
Python安全开发之子域名扫描器(含详细注释)
网络·python·安全·web安全·网络安全