理解 Overlay 跨主机网络与 etcd 的职责
Docker Overlay 网络的核心价值在于打破物理主机的边界,让运行在不同宿主机上的容器仿佛连接在同一台交换机的局域网中。其实现原理依赖于 VXLAN(Virtual Extensible LAN)技术:Docker 守护进程将容器的二层以太网帧封装进 UDP 数据包,通过底层的 IP 网络进行传输。这种封装机制屏蔽了底层物理网络拓扑的差异,使得容器可以像本地通信一样交互。 在这一架构中,控制面与数据面是严格分离的。数据面负责实际的流量转发、VXLAN 封装与解封装,而控制面则依赖分布式键值存储系统 etcd 来维护整个集群的网络状态。etcd 在此扮演了“中央数据库”的角色,负责存储集群元数据、网络段分配信息、Endpoint(端点)映射关系以及服务发现记录。当 Docker 守护进程启动或创建 Overlay 网络时,它会向 etcd 写入当前节点的网络配置,并持续监听 etcd 的变更事件,以同步其他节点的状态。这种设计确保了跨主机网络配置的一致性与高可用性,避免了因单点故障导致的网络分裂。理解控制面(etcd 状态同步)与数据面(VXLAN 隧道转发)的协同机制,是后续部署与排错的基础。

搭建 etcd 与 Docker Overlay 网络
搭建跨主机网络前,需确保至少两台 Linux 宿主机已准备好,且系统内核支持 VXLAN 模块。为避免端口拦截,建议暂时关闭 SELinux 与 firewalld 服务。
第一步是部署 etcd 集群。推荐使用 v3.5 及以上版本,并通过 systemd 管理进程。关键配置包括指定 --listen-client-urls 和 --advertise-client-urls 指向本机 IP,以及通过 --initial-cluster 声明所有参与集群的节点。启动后,使用 etcdctl endpoint health 验证集群健康状态。
第二步是配置 Docker 守护进程。编辑 /etc/docker/daemon.json,添加 cluster-store 与 cluster-advertise 参数,分别指向 etcd 的地址与本机 IP。重启 Docker 服务使节点加入集群。
随后,在任意节点执行以下命令创建网络:
``bash
docker network create -d overlay --subnet=10.0.0.0/24 my_overlay_net
`
需注意,Docker 1.12 引入 Swarm 模式后,原生 Overlay 网络已内置 Raft 状态存储。若使用独立的 etcd 方案,需确保 Docker 版本为 1.11 或更早,或明确使用 cluster-store 的独立模式。创建完成后,通过 docker network ls 可查看网络作用域为 global`,表明网络配置已成功同步至集群。

验证跨主机通信与网络状态
网络创建完成后,需通过多维度验证确保跨主机通信正常。
首先,在两台宿主机上分别启动容器并指定网络:
``bash
docker run -d --name node1 --network my_overlay_net busybox sleep 3600
docker run -d --name node2 --network my_overlay_net busybox sleep 3600
`
使用 docker inspect node1 查看网络配置,确认容器已获取 10.0.0.x 网段 IP,且网络驱动为 overlay。
接着执行连通性测试。在 node1 容器内运行:
`bash
ping -c 4 `
若返回正常 TTL 与延迟数据,说明 VXLAN 隧道已建立且底层路由可达。同时,可通过 docker network inspect my_overlay_net 查看全局网络详情,重点关注 Containers 字段是否列出所有主机的容器端点,以及 Scope 是否为 global。
若部署了 Web 服务,可在 node2 运行 Nginx,从 node1 使用 curl https://

故障排查与部署避坑
跨主机网络部署中常见故障多集中于控制面同步与底层网络限制。
**1. etcd 不可达**
首先检查 systemctl status etcd 与 etcdctl cluster-health,确认 2379 与 2380 端口未被防火墙拦截,并核对 initial-cluster 参数是否拼写错误。
**2. 节点状态异常**
查看 journalctl -u docker 日志,常见原因为 cluster-store 地址配置错误或 Docker 版本与 etcd API 不兼容。
**3. MTU 不匹配**
MTU 不匹配会导致大包分片失败,表现为 ping 小包通但业务连接超时。可通过 ip link show 检查宿主机与 veth 接口 MTU,建议将 Overlay 网络 MTU 设为 1450(VXLAN 头部占 50 字节)。
**4. 网络配置冲突**
若出现网络配置冲突或 etcd 数据残留,可尝试清理 /var/lib/docker/network/files/ 下的本地数据库,并重启 Docker 服务重新拉取 etcd 状态。
排错时应遵循“先控制面后数据面”原则:优先确保 etcd 集群健康与节点注册成功,再验证 VXLAN 隧道与容器路由。定期备份 etcd 快照并监控网络延迟,可有效规避生产环境中的网络分裂风险。

