如何为两台独立VM编写docker-compose并解决跨机通信Nginx报错?
问题根因
你的配置存在核心逻辑错误:Docker默认创建的自定义桥接网络是宿主机本地网络,仅支持同一台宿主机上的容器互通,无法跨不同虚拟机直接加入。ServerB端配置的加入外部custom_network操作,只会在ServerB所在宿主机查找同名本地网络,根本无法访问到ServerA宿主机上的网络,自然无法通过服务名ServerB完成解析。
方案1:使用宿主机IP+端口通信(推荐,部署成本最低)
不需要修改Docker网络配置,直接通过虚拟机局域网IP+暴露的端口通信即可:
- 先确认两台虚拟机的局域网可访问IP,假设ServerA所在VM IP为
192.168.1.10,ServerB所在VM IP为192.168.1.11 - 调整ServerA的Nginx配置,修改
/TestPath对应的代理规则,同时添加变量配置避免ServerB未启动时Nginx启动失败:
location /TestPath { set $serverb_addr https://192.168.1.11:4443; proxy_pass $serverb_addr/TestPath/; proxy_set_header Host $host; # 按需添加其他proxy配置 }
- 配置两台虚拟机的防火墙规则:开放ServerB宿主机的
4443端口入站规则,允许ServerA的IP访问。
方案2:使用Docker Swarm Overlay网络实现服务名跨节点解析
如果需要用Docker服务名直接跨节点通信,需要搭建Swarm集群使用Overlay跨节点网络:
- 初始化Swarm集群,在ServerA所在VM执行命令:
docker swarm init --advertise-addr 192.168.1.10
执行后会生成工作节点加入命令,复制该命令。 - 在ServerB所在VM执行上一步复制的加入命令,加入Swarm集群。
- 修改ServerA端的docker-compose.yml,将网络类型改为Overlay:
version: "3.9" services: ServerA: image: servera ports: - "3443:443" networks: - myNet networks: myNet: name: custom_network driver: overlay attachable: true ipam: driver: default config: - subnet: 172.18.0.0/24
- 在ServerA节点使用Swarm stack命令部署服务:
docker stack deploy -c docker-compose.yml servera - ServerB端的docker-compose.yml无需修改,同样使用stack命令部署即可:
docker stack deploy -c docker-compose.yml serverb - 部署完成后两个服务处于同一个跨节点Overlay网络中,原Nginx配置中
ServerB服务名可正常解析,注意如果解析失败可执行docker network inspect custom_network查看服务实际注册的名称,和Nginx配置中的上游名保持一致即可。
内容的提问来源于stack exchange,提问作者user16160312
相关产品推荐
相关产品推荐

