最直接可靠的方式是使用 Docker Swarm 搭建原生支持跨主机通信的集群系统:先执行 docker swarm init 初始化管理节点并获取 join token,再在工作节点运行 docker swarm join 加入集群;接着在任一 manager 节点执行 docker network create -d overlay --attachable app-net 创建集群级 Overlay 网络;最后通过 docker service create 部署服务并利用服务名实现跨主机互通。

最直接可靠的方式是使用 Docker Swarm 搭建原生支持跨主机通信的集群系统。Overlay 网络是 Docker 官方提供的、开箱即用的跨物理机容器通信方案,无需额外部署第三方组件,且与服务编排深度集成。
初始化 Swarm 集群并加入节点
在一台主机上执行初始化命令,指定对外通告的管理地址(必须是该主机可被其他节点访问的 IP):
-
主节点运行:
docker swarm init --advertise-addr 192.168.1.100 - 命令输出中会生成一条
docker swarm join --token ...命令 -
工作节点运行该 join 命令,完成节点注册,例如:
docker swarm join --token swmtkn-1-abc123... 192.168.1.100:2377
创建 Overlay 网络并验证自动同步
Overlay 网络由 Swarm 控制面统一管理,在所有已加入的节点上自动创建和维护:
- 在管理节点执行:
docker network create -d overlay app-net - 无需在其他节点重复执行,Swarm 会将该网络同步到全部活跃节点
- 可在任意节点运行
docker network ls查看,app-net的 SCOPE 显示为 swarm,表示它是集群级网络
部署跨主机服务并直连通信
使用该 Overlay 网络启动的服务,其容器无论调度到哪台物理机,都能通过服务名或容器名直接互通:
- 启动一个带网络的服务:
docker service create --name web --network app-net -p 8080:80 nginx:alpine - 再启动一个后端服务:
docker service create --name api --network app-net python:slim sleep infinity - 进入任一
web容器:docker exec -it <web-container-id> sh,执行ping api或curl http://api:8000即可通 - 底层由 VXLAN 封装实现:容器发出的原始数据包被封装进 UDP 包,经物理网络传输后由目标主机解包投递
关键配置与注意事项
确保通信稳定需满足几个基础前提:
- 各主机 Linux 内核 ≥ 3.16(主流发行版默认满足)
- 节点间 TCP 2377(Swarm 管理)、UDP 4789(VXLAN 数据)端口必须开放
- Docker daemon 启动时需启用 Swarm 模式(
docker swarm init自动完成) - 避免手动修改
/etc/docker/daemon.json中影响网络的参数(如bridge、fixed-cidr),Overlay 网络使用独立子网,不依赖 docker0


















