Docker Compose 依赖 Swarm 模式下的 overlay 网络实现跨主机通信,需初始化 Swarm 集群、开放关键端口、配置 driver: overlay 并启用 attachable,服务名自动 DNS 解析与负载均衡。

Docker Compose 本身不直接管理跨宿主机通信,它依赖底层 Docker 引擎的网络能力。真正实现跨主机容器互通的是 overlay 网络,而 Docker Compose 只负责声明式地调用和编排它。
必须使用 Docker Swarm 模式
Overlay 网络在 Docker 中仅在 Swarm mode 下原生支持。这意味着:
- 所有参与跨主机通信的节点必须执行
docker swarm init或docker swarm join,组成一个 Swarm 集群 -
docker-compose.yml需启用deploy配置,并指定mode: replicated或global - 网络定义中需明确设置
driver: overlay,不能省略
配置 overlay 网络的关键写法
以下是最小可行的 docker-compose.yml 片段:
version: '3.8'
services:
app:
image: nginx
deploy:
replicas: 2
networks:
- mynet
<p>networks:
mynet:
driver: overlay
attachable: true # 允许非 Swarm 服务(如临时调试容器)接入
注意:attachable: true 对调试很重要;若省略,只有通过 deploy 启动的服务才能加入该网络。
服务发现自动生效
一旦容器部署在 overlay 网络上,Docker 内置 DNS 就会为每个服务名(如 app)提供集群范围的解析:
- 同名服务的多个副本会自动负载均衡(轮询)
- 容器内可直接用
curl http://app:80访问,无需硬编码 IP - DNS 解析结果是虚拟 IP(VIP),由 Docker 内部的负载均衡器转发
常见误区与绕不开的前提
这些条件缺一不可,否则看似配置正确,实际无法通信:
- 各主机间 2377(Swarm 管理端口)、4789(VXLAN 数据端口)、7946(节点发现端口)必须开放且互通
- 所有节点时间需基本同步(误差建议 < 1 秒),否则 etcd 或 Raft 协议可能拒绝同步
- 不能混用
bridge和overlay网络来尝试“桥接”跨主机通信——它们属于完全不同的网络平面 -
host.docker.internal在 overlay 网络中无效,它只指向本机,不是集群网关


















