虚拟机挂起,重启后主机连接不上虚拟机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 或容器即可恢复。

相关推荐
这个DBA有点耶7 小时前
从症状到根因:数据库监控指标的分层方法与静态/动态阈值策略
数据库·mysql·代码规范
ProcessOn9 小时前
纯干货!MySql实战02:一条SQL更新语句执行流程大探索!
sql·mysql·sql server
这个DBA有点耶10 小时前
DELETE没删多少数据,表却越来越大——InnoDB删除空洞与页合并失效的根因
数据库·mysql·代码规范
对象存储与RustFS11 小时前
网盘限速逼你开会员?用 RustFS 自己搭一个不限速的“私人网盘
服务器·后端·docker
裕晟资质规划13 小时前
三类资质变更报告时限差在哪?军工 15 日、集成印制 10 日
大数据·服务器·网络
轻舟技术A13 小时前
Provider 不属于 Agent 核心:rpi 的分层理由与收益
服务器·网络
小羊没烦恼!14 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
Escalating_xu14 小时前
【Linux 网络编程】TCP Socket 编程(上):从 listen、accept 到完整回显通信
linux·网络·tcp/ip
程序员老赵14 小时前
Docker 部署 Filestash:轻松搭建浏览器文件管理平台
前端·docker·开源
NetX行者14 小时前
Python 工程化入门:从脚本到规范的 Python 项目结构
网络·python