You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为两台独立VM编写docker-compose并解决跨机通信Nginx报错?

问题根因

你的配置存在核心逻辑错误:Docker默认创建的自定义桥接网络是宿主机本地网络,仅支持同一台宿主机上的容器互通,无法跨不同虚拟机直接加入。ServerB端配置的加入外部custom_network操作,只会在ServerB所在宿主机查找同名本地网络,根本无法访问到ServerA宿主机上的网络,自然无法通过服务名ServerB完成解析。

方案1:使用宿主机IP+端口通信(推荐,部署成本最低)

不需要修改Docker网络配置,直接通过虚拟机局域网IP+暴露的端口通信即可:

  1. 先确认两台虚拟机的局域网可访问IP,假设ServerA所在VM IP为192.168.1.10,ServerB所在VM IP为192.168.1.11
  2. 调整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配置
}
  1. 配置两台虚拟机的防火墙规则:开放ServerB宿主机的4443端口入站规则,允许ServerA的IP访问。
方案2:使用Docker Swarm Overlay网络实现服务名跨节点解析

如果需要用Docker服务名直接跨节点通信,需要搭建Swarm集群使用Overlay跨节点网络:

  1. 初始化Swarm集群,在ServerA所在VM执行命令:
    docker swarm init --advertise-addr 192.168.1.10
    执行后会生成工作节点加入命令,复制该命令。
  2. 在ServerB所在VM执行上一步复制的加入命令,加入Swarm集群。
  3. 修改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
  1. 在ServerA节点使用Swarm stack命令部署服务:
    docker stack deploy -c docker-compose.yml servera
  2. ServerB端的docker-compose.yml无需修改,同样使用stack命令部署即可:
    docker stack deploy -c docker-compose.yml serverb
  3. 部署完成后两个服务处于同一个跨节点Overlay网络中,原Nginx配置中ServerB服务名可正常解析,注意如果解析失败可执行docker network inspect custom_network查看服务实际注册的名称,和Nginx配置中的上游名保持一致即可。

内容的提问来源于stack exchange,提问作者user16160312

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:36:03