Docker Overlay模式通过VXLAN构建跨主机虚拟二层网,实现在独立overlay子网(如10.0.20.0/24)内的容器原生三层互通;必须基于Swarm集群,依赖2377/7946/4789端口通信,并通过内置DNS支持服务名解析与全协议栈直连。

要实现跨物理多机的容器原生三层网络互联,Docker Overlay 模式本身不直接提供“三层路由式直连”,而是通过 VXLAN 封装构建虚拟二层覆盖网——但该虚拟网在语义和使用体验上等效于一个跨主机的扁平化三层可互通网络。关键在于:Overlay 不暴露真实子网 IP,而是分配独立的 overlay 子网(如 10.0.10.0/24),容器在此网段内可直接用 IP 或服务名通信,无需端口映射、NAT 或手动路由配置。
必须启用 Swarm 集群模式
Overlay 网络依赖 Swarm 的控制平面同步状态、分发网络元数据、管理服务发现。单机 dockerd 无法运行真正可用的 overlay 网络。
- 在任一节点执行:
docker swarm init --advertise-addr <本机可被其他节点访问的IP>(例如192.168.56.10) - 复制输出的
docker swarm join命令,在其余物理主机上执行加入 - 确认所有节点就绪:
docker node ls中状态为 Ready,角色为 manager 或 worker
创建可跨主机通信的 Overlay 网络
网络需显式指定驱动,并推荐加 --attachable,以便测试时用 docker run 手动接入(非仅限 service)。
- 执行:
docker network create -d overlay --subnet=10.0.20.0/24 --attachable my-3layer-net - 该网络自动同步到所有 Swarm 节点,无需在每台机器重复创建
-
--subnet是可选但强烈建议:避免 IP 冲突,便于规划与排查;不指定则由 Docker 自动分配
让容器获得原生三层互通能力
所谓“原生三层互联”,是指容器间可直接用 IPv4 地址或 DNS 名称通信,无感知宿主机位置,且支持 ICMP、TCP、UDP 全协议栈——这正是 Overlay + Swarm DNS 提供的能力。
- 部署服务方式(推荐):
docker service create --name api --network my-3layer-net --replicas 1 nginx - 或运行独立容器:
docker run -d --network my-3layer-net --name db alpine sleep 3600 - 进入任一容器:
docker exec -it <container_id> sh,然后执行ping api或ping db——Swarm 内置 DNS 会自动解析为对应容器在 overlay 网络中的 IP(如10.0.20.3) - 也可直接 ping 对方容器的 overlay IP:
ping 10.0.20.4,验证纯三层可达性
确保底层网络基础就绪
Overlay 依赖 VXLAN(UDP 4789)、节点通信(TCP/UDP 7946)、集群管理(TCP 2377)三个通道畅通。
- 所有物理主机防火墙必须放行:TCP 2377、TCP/UDP 7946、UDP 4789
- 若主机位于不同局域网(如跨 VLAN 或云厂商不同 VPC),需确保这些端口在路由设备或安全组中双向开放
- 不建议在公网直通环境下裸跑;生产环境应启用加密:
--opt encrypted(创建网络时添加)


















