Overlay网络是Docker跨主机容器通信的原生方案,需组建Swarm集群、开放2377/7946/4789端口、创建--attachable overlay网络,并通过service部署验证web与client跨主机互通。

要在 Docker 中实现跨主机容器通信,Overlay 网络是最主流、原生支持的方案。它依赖 Swarm 集群机制,无需额外 KV 存储(如 Consul),从 Docker 1.12 起已深度集成,配置清晰、运维轻量。
确保基础环境就绪
所有参与节点需满足以下条件:
- 安装相同大版本的 Docker(推荐 20.10 或更新版本)
- 各主机时间同步(可用 chrony 或 systemd-timesyncd)
- 开放必要端口:
• TCP 2377(Swarm 管理通信)
• TCP/UDP 7946(节点间网络发现与控制)
• UDP 4789(VXLAN 封装数据流量) - Linux 主机建议关闭或配置防火墙规则(如 Ubuntu 的 ufw):
sudo ufw allow 2377/tcp && sudo ufw allow 7946 && sudo ufw allow 4789/udp
初始化并组建 Swarm 集群
在一台主机上执行初始化命令,指定对外通告地址(通常是本机可被其他节点访问的 IP):
docker swarm init --advertise-addr 192.168.1.10
命令输出中会给出类似以下的加入命令:
docker swarm join --token SWMTKN-1-abc... 192.168.1.10:2377
在其余主机上运行该命令,完成节点加入。确认状态:
docker node ls —— 所有节点应显示 Ready 状态
创建可接入的 Overlay 网络
在任意 manager 节点上执行:
docker network create -d overlay --attachable my-overlay
关键说明:
- --attachable 是必需项:它允许普通容器(非 service)手动加入该网络,便于调试和临时测试
- 网络自动同步至全部集群节点,无需在每台主机重复创建
- 网络名(如 my-overlay)将在容器间提供 DNS 解析支持(如
ping web)
部署服务并验证通信
启动两个服务,确保它们被调度到不同主机(Docker 会自动负载分发):
docker service create --name web --network my-overlay -p 8080:80 nginx
docker service create --name client --network my-overlay alpine sleep 3600
进入 client 容器验证:
docker exec -it $(docker ps --filter name=client -q) sh
然后执行:
ping -c 3 web 或
wget -qO- http://web
若返回 Nginx 欢迎页内容,说明跨主机 Overlay 通信已成功建立。











