overlay网络是docker swarm原生跨主机通信方案,需先初始化集群、开放2377/7946/4789端口,再创建--attachable overlay网络,最后通过service部署并用服务名验证互通。

用 Overlay 网络打通跨主机容器通信
Overlay 是 Docker Swarm 原生支持的跨主机网络驱动,它基于 VXLAN 封装,在不同物理节点间构建统一二层网络。所有加入同一 overlay 网络的容器,无论运行在哪台机器上,都能直接通过 IP 或服务名互通。
关键操作步骤:
- 在管理节点执行 docker swarm init 初始化集群;工作节点用 docker swarm join 加入
- 创建 overlay 网络:docker network create -d overlay --subnet=10.0.10.0/24 my-overlay(子网需全局唯一)
- 部署服务时显式指定网络:docker service create --network my-overlay --name web nginx
- 服务间可直接用服务名通信,例如 web 容器内 curl http://db:5432 访问同网络的 db 服务
确保 DNS 服务发现稳定可靠
Docker 内置 DNS 基于服务名解析,但仅对 overlay 网络中的 service 生效,不适用于独立 docker run 启动的容器。实际中常见“能 ping 通 IP、却解析不了服务名”的问题,根源常是启动方式不匹配。
正确实践要点:
- 统一使用 docker service create 部署,避免混用 docker run 和 service
- 服务名即容器 hostname,默认与 service 名一致;如需自定义,加 --hostname mydb
- 验证 DNS:进入容器执行 nslookup db,应返回 10.0.10.x 段内 IP,而非 127.0.0.11
- 若需容器名解析非 service 的普通容器,可用 docker network connect 将其接入 overlay 网络
处理端口暴露与外部访问
Overlay 网络本身不对外暴露端口,外部访问必须通过 ingress 网络 或 host 模式发布。默认情况下,docker service create -p 80:80 会自动绑定到所有节点的 80 端口,并由 ingress 路由转发到后端任意实例。
注意事项:
- ingress 是 Swarm 内置的负载均衡机制,无需额外配置反向代理
- 如需指定某节点提供服务,用 --constraint node.hostname==node1
- 避免在 service 中混用 -p 和 --publish mode=host,后者绕过 ingress,仅限单节点直连场景
- 防火墙需放行 VXLAN 端口(默认 8472/udp)及 ingress 端口(如 80、443)
排查连通性故障的实用方法
当容器看似在同一 overlay 网络却无法通信时,不要急于重装或重启,先分层验证:
- 确认网络存在且状态正常:docker network ls | grep overlay,再 docker network inspect my-overlay 查看各节点是否都显示在 "Peers" 列表中
- 检查容器是否真正接入该网络:docker service ps web 查 PID,再 docker inspect
| grep NetworkMode 确认为 my-overlay - 测试基础连通:docker exec -it
ping -c 3 db —— 若失败,先试 ping排除 DNS 问题 - 抓包定位:在目标节点执行 tcpdump -i any port 8472 -n,观察 VXLAN 流量是否进出,无流量说明网络未打通或防火墙拦截











