Docker同网络跨主机部署的两容器通信配置问题咨询
Docker跨主机容器通信配置方案
问题根因
同主机下两个容器能通过容器私有IP通信,依赖的是Docker单主机内的自定义网桥,这类网桥的网络域仅在当前主机生效,容器的172.x.x.x类私有IP无法跨主机路由,跨主机部署时直接沿用原有配置必然通信失败。
方案1:主机IP直连(推荐,适配同局域网双主机场景,零额外依赖)
不需要安装任何额外网络插件,直接通过宿主机物理网络通信,配置成本最低、稳定性最高。
前置检查
- 两台主机处于同一二层网络,能直接通过物理IP互ping通
- 服务端宿主机的防火墙/安全组放通8080端口入站规则
- 如果虚拟机使用NAT网络模式,要么改为桥接模式拿到同网段IP,要么在虚拟化层配置8080端口的端口映射
服务端(部署在主机A,假设主机A物理IP为192.168.1.100)配置
version: "3.3" services: app: image: python-server:ARM ports: # 显式绑定到所有网卡,确保跨主机可访问 - "0.0.0.0:8080:8080"
客户端(部署在主机B)配置
删除原有对接本地server_default网络的配置,该网络仅在服务端主机本地存在,跨主机无法访问
version: "3.3" services: app: image: python-client:ARM ports: - "5040:5040" volumes: - /dataf/1.csv:/app/1.csv:ro # 服务端地址直接填服务端宿主机的物理IP+映射端口,不要填容器私有IP environment: - SERVER_ADDR=192.168.1.100:8080
方案2:Overlay跨主机容器网络(适合多服务集群场景,支持服务名直接访问)
如果需要保持容器网络层面的直接互通、支持通过服务名做服务发现,可以使用Docker原生的Overlay网络,需要先搭建Docker Swarm集群:
- 在服务端主机执行Swarm初始化命令:
docker swarm init --advertise-addr <主机A物理IP> - 执行命令输出的
docker swarm join指令,在客户端主机上操作,将客户端主机加入Swarm集群 - 在任意一台节点创建可附加的Overlay网络:
docker network create -d overlay --attachable app-cross-net
服务端配置
version: "3.3" services: app: image: python-server:ARM ports: - "8080:8080" networks: - app-cross-net networks: app-cross-net: external: true
客户端配置
version: "3.3" services: app: image: python-client:ARM ports: - "5040:5040" volumes: - /dataf/1.csv:/app/1.csv:ro networks: - app-cross-net # Overlay网络自带服务发现,直接填服务端服务名app即可访问 environment: - SERVER_ADDR=app:8080 networks: app-cross-net: external: true
选型建议
- 仅2个服务、双主机同局域网的场景优先选方案1,没有额外组件开销,排障简单
- 后续需要扩展更多跨主机容器服务、需要容器原生服务发现能力时选择方案2
内容的提问来源于stack exchange,提问作者PabloGS
相关产品推荐
相关产品推荐

