核心是基于docker swarm集群构建overlay网络:先开放2377/7946/4789端口,执行docker swarm init初始化集群并用join命令加入节点;再在manager节点运行docker network create -d overlay app-net创建网络;最后通过docker service create或docker stack deploy部署服务,利用内置dns实现跨主机容器互通。

Docker 容器跨主机通信,核心是让不同物理机上的容器像在同一个局域网里一样互相访问——不靠端口映射、不手动改路由、不依赖宿主机IP硬编码。最主流、最可靠、原生支持的方案就是 Overlay 网络 + Docker Swarm 集群。
下面直接说清楚怎么配,分三步走,每步都带关键命令和注意事项:
Overlay 网络必须基于 Swarm 集群运行
单靠 docker network create -d overlay 命令在没初始化 Swarm 的机器上会报错:overlay driver not supported on non-swarm mode。所以第一步不是建网络,而是搭集群。
-
在主节点(比如 IP 是
192.168.1.100)执行:docker swarm init --advertise-addr 192.168.1.100
输出里会有一条
docker swarm join --token ...命令,复制它。 -
在其他工作节点上执行该 join 命令(例如):
docker swarm join --token swt-xxxx 192.168.1.100:2377
✅ 验证:在任意节点运行
docker node ls,看到Ready状态的节点列表,说明集群已就绪。
创建 Overlay 网络并自动同步到所有节点
Swarm 模式下创建的 overlay 网络,会自动在所有加入集群的节点上生效,无需逐台操作。
docker network create -d overlay app-net
-
-d overlay指定驱动类型 -
app-net是网络名,后续服务部署时引用它 - 不用加
--subnet或--gateway(overlay 自动分配子网,且不支持自定义)
⚠️ 注意:这个网络不会出现在
docker network ls的SCOPE列显示为swarm,但只有 Swarm 服务(docker service create)或 Stack 部署的容器才能接入它;普通docker run容器默认无法连接 overlay 网络(除非显式指定--network app-net且容器运行在 Swarm 节点上)。
用 Service 或 Stack 部署容器,自动获得跨主机通信能力
直接 docker run 启动的容器不能跨主机互通(即使连了同一 overlay 网络),必须通过 Swarm 编排方式部署:
-
方式一:用
docker service create(适合简单服务)docker service create --name web --network app-net -p 8080:80 nginx docker service create --name db --network app-net postgres
-
方式二:用
docker stack deploy(推荐,适合多服务协作)# docker-compose.yml version: '3.8' services: web: image: nginx networks: [app-net] deploy: replicas: 2 api: image: my-api:latest networks: [app-net] networks: app-net: driver: overlay然后运行:
docker stack deploy -c docker-compose.yml myapp
✅ 效果:
web服务里的容器能直接用http://api:8000访问api服务(内置 DNS 自动解析服务名),无论它们实际跑在哪台主机上。
防火墙要放开这些端口(否则节点间通信会卡住):
- TCP 2377(Swarm 管理通信)
- UDP 4789(VXLAN 封装流量)
- TCP/UDP 7946(节点间网络发现)
不复杂但容易忽略。











