重启 Docker 导致 VMware 虚拟机断网:一次完整的故障排查记录

重启 Docker 导致 VMware 虚拟机断网:一次完整的故障排查记录

关键词: Docker · VMware NAT · iptables · ens33 NO-CARRIER · Xshell 断连


一、背景

在进行 Docker Harbor 私有镜像仓库的部署实验时,按照实验要求需要将 Harbor 的 HTTP 地址加入 Docker 的信任列表。具体操作是编辑 /etc/docker/daemon.json,添加 insecure-registries 字段后执行:

bash 复制代码
systemctl restart docker

命令执行后,虚拟机卡顿了数秒,Xshell 随即断连,整个 Hadoop 集群的节点也全部失联。由于只能通过 VMware 控制台直接操作虚拟机,排查就此开始。


二、第一步排查:是否网段冲突?

第一反应是 Docker 的 docker0 网桥与 VMware 网段发生了冲突。Docker 默认使用 172.17.0.0/16 作为虚拟网桥网段,若与 VMware 的虚拟网络重叠,会导致路由混乱进而断网。

通过控制台登录虚拟机,执行:

bash 复制代码
ip addr show docker0
ip route

输出关键信息如下:

复制代码
IP address:  192.168.121.10   ← VMware ens33 主网卡
IP address:  192.168.122.1    ← virbr0 虚拟网桥
IP address:  172.17.0.1       ← docker0 网桥

docker0: inet 172.17.0.1/16
default via 192.168.121.2 dev ens33 ... linkdown   ← 异常!
192.168.121.0/24 dev ens33 ...         linkdown   ← 异常!

结论: VMware 使用 192.168.121.x,Docker 使用 172.17.x.x,两者完全不重叠,排除网段冲突。但发现了新的关键异常:ens33 的状态是 linkdown


三、第二步排查:NO-CARRIER 说明了什么?

尝试手动拉起网卡:

bash 复制代码
ip link set ens33 up
ip addr show ens33

输出显示:

复制代码
ens33: <NO-CARRIER, BROADCAST, MULTICAST, UP> state DOWN

NO-CARRIER 的含义是:网卡在操作系统层面已启用(UP),但没有检测到物理链路信号。这说明问题不在 Linux 内部的软件层,而是虚拟网卡与宿主机之间的链路断开了

随后尝试 dhclient ens33 重新获取 IP,由于链路本身不通,dhclient 无响应,只能手动中断(Ctrl+C)。

结论锁定:问题在 Windows 宿主机侧,而非虚拟机内部。


四、第三步排查:VMware 图形设置是否正常?

打开 VMware 虚拟机设置 → 网络适配器,检查结果:

  • 设备状态:已连接 ✓、启动时连接 ✓
  • 网络连接:NAT 模式 ✓

VMware 图形化配置完全正常,问题进一步锁定在 Windows 宿主机上运行的 VMware NAT 后台服务本身。


五、解决方案

在 Windows 宿主机按 Win + R 输入 services.msc 打开服务管理器,找到以下两个服务,右键选择「重新启动」:

  • VMware NAT Service(负责虚拟机与宿主机之间的网络地址转换)
  • VMware DHCP Service(负责为虚拟机自动分配 IP)

两个服务重启完成后,回到虚拟机控制台验证:

bash 复制代码
ping 192.168.121.2 -c 3

ping 通后,Xshell 重新连接 192.168.121.10 成功,Hadoop 集群各节点也全部恢复正常通信。整个恢复过程不足一分钟。


六、根本原因分析

Docker 与 VMware 都深度依赖 Linux 内核的 iptables 防火墙规则来实现网络转发。问题的触发链条如下:

复制代码
执行 systemctl restart docker
        ↓
Docker 重建 docker0 网桥,刷新 iptables 的 FORWARD / MASQUERADE 转发规则
        ↓
iptables 规则的刷新干扰了 VMware NAT Service 依赖的数据包转发链路
        ↓
VMware NAT Service 转发异常,虚拟网卡 ens33 失去链路信号
        ↓
ens33 状态变为 NO-CARRIER,Xshell 连接超时断开
        ↓
Hadoop 集群节点间通信全部中断

本质上,这是 Docker 和 VMware 两个虚拟化工具共用宿主机网络转发机制时产生的规则竞争问题。Docker 刷新 iptables 时覆盖了 VMware NAT 的依赖规则,而 VMware NAT Service 没有感知到这一变化并自动恢复,导致持续失效直至手动重启服务。


七、预防建议

建议一:重启 Docker 前,在 Xshell 另开一个窗口持续 ping 网关

bash 复制代码
ping 192.168.121.2

一旦发现断连,立刻去 Windows 的 services.msc 重启 VMware NAT Service,30 秒内即可恢复,比在虚拟机内部排查快得多。

建议二:在 daemon.json 中固定 docker0 的网段

json 复制代码
{
  "insecure-registries": ["http://192.168.116.101:80"],
  "bip": "192.168.200.1/24"
}

明确固定 docker0 的网段,减少与 VMware 路由规则产生干扰的概率。

建议三:若问题频繁出现,检查 VMware NAT Service 的启动类型

将其设置为「自动(延迟启动)」,使其在系统和 Docker 稳定后再初始化 NAT 规则,可降低冲突概率。


八、总结

这次故障排查经历了三个阶段:

  1. 怀疑网段冲突 → 排除(两者网段不重叠)
  2. 发现 ens33 NO-CARRIER → 定位到链路层,问题在宿主机侧
  3. 确认 VMware NAT Service 失效 → 找到根本原因,重启服务解决

在同一台 Windows 主机上同时运行 Docker 与 VMware Workstation 时,两者对 iptables 的竞争是一个已知的潜在冲突点。遇到 Xshell 突然断连的情况,优先去 Windows 宿主机检查 VMware 服务状态,往往比在虚拟机内部反复排查效率高得多。

相关推荐
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工2 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn862 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_2 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉2 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦2 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
2601_961875242 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant