本质是搭建支持服务发现与vxlan封装的swarm集群:先统一docker版本、时间同步、开放2377/7946/4789端口;再执行swarm init并join节点;接着在manager节点创建--attachable overlay网络;最后用service部署容器并通过ping web验证dns互通。

构建跨节点容器 Overlay 网络通信链路,本质是搭建一个支持服务发现与 VXLAN 封装的 Swarm 集群环境,并在其上启用可同步、可解析、可互通的虚拟网络层。它不是配置单个命令就能生效的“网络插件”,而是一整套协同运行的机制。
准备集群基础环境
所有节点需统一满足以下条件,缺一不可:
- Docker 版本一致(建议 20.10 或更新),避免驱动兼容问题
- 各主机时间误差控制在 ±1 秒内(可用
chrony或systemd-timesyncd同步) - 开放三个关键端口:
• TCP 2377(Swarm 管理通信)
• TCP/UDP 7946(节点间服务发现与控制面通信)
• UDP 4789(VXLAN 数据平面封装与传输) - Linux 主机需确认防火墙放行上述端口,例如 Ubuntu 用户执行:
sudo ufw allow 2377/tcp && sudo ufw allow 7946 && sudo ufw allow 4789/udp
初始化并加入 Swarm 集群
Overlay 网络必须依附于 Swarm 模式运行,不能脱离集群单独存在:
- 在首台主机(Manager)执行:
docker swarm init --advertise-addr 192.168.56.10
(请将192.168.56.10替换为该主机实际可被其他节点访问的 IP) - 复制命令输出中的
docker swarm join --token ...,在其余节点上运行,完成加入 - 验证节点状态:
docker node ls—— 所有节点应显示 Ready 状态,角色为 worker 或 manager
创建可接入的 Overlay 网络
该网络会自动分发到全部集群节点,无需逐台创建:
- 在任意 manager 节点执行:
docker network create -d overlay --attachable mynet -
--attachable是关键参数:允许普通容器(非 service)手动加入,便于调试和临时验证 - 执行
docker network ls,确认mynet类型为 overlay,驱动为 overlay - 网络名
mynet后续将作为 DNS 域名的一部分,例如服务web可被同网容器直接ping web
部署容器并验证通信链路
容器必须连接同一 Overlay 网络,且依赖 Swarm 内置 DNS 实现服务名解析:
- 启动两个服务,确保调度到不同节点(Docker 默认负载均衡):
docker service create --name web --network mynet --replicas 1 nginxdocker service create --name client --network mynet alpine sleep 3600 - 查 client 任务容器 ID:
docker service ps client→ 获取 CONTAINER ID - 进入容器测试:
docker exec -it <container_id> sh</container_id>
在 shell 中执行:ping -c 3 web—— 应能收到响应
进阶验证:nslookup tasks.web可查看所有副本 IP,确认多实例可达性











