在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 层:bashdocker run --network host -e MYSQL_ROOT_PASSWORD=xxx mysql:8
✅ 总结一句话
VM 挂起后 Docker 网络"假死",重启 Docker 或容器即可恢复。