首页 > 解决方案 > 如何为 2 个单独的 VM 创建 2 个 docker-compose 文件?

问题描述

我有一个需要与服务器 B 通信的服务器 A。服务器 A 和服务器 B 将部署在 2 台不同的机器上。

serverA 的 docker-compose.yml,用于运行映像并创建网络。docker-compose.yml 供 serverB 运行镜像并加入网络。

我遇到的问题是我的服务器 A 中的 nginx 提示错误,这阻止了我在不同的 VM 中测试网络的创建。

nginx:在 /etc/nginx/conf.d/nginx.conf 的上游“ServerB”中找不到 [emerg] 主机

    version: "3.9" 
    services:
        ServerA:
            image: servera
            ports: 
                - "3443:443"
            networks:
                - myNet
    networks:
        myNet:
            name: custom_network
            ipam:
                driver: default
                config:
                    - subnet: 172.18.0.0/24

version: "3.9" 
services:
    ServerB:
        image: serverb
        ports:
            - "4443:443"
        networks:
            - my-proxy-net
networks:
    my-proxy-net:
        external:
            name: custom_network
server{
    listen              80;
    listen              443 ssl;
    ssl_certificate     /etc/ssl/public.crt;
    ssl_certificate_key /etc/ssl/privatekey.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
  
    location / {
        root /usr/share/nginx/html;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    location /TestPath {
        proxy_pass https://ServerB/TestPath/;

    }
}

我如何进行更改,以使服务器 A 在启动时能够连接到服务器 B。

标签: dockernginxdocker-compose

解决方案


Docker“桥”网络在创建它们的主机上是本地的。如果两个容器不在同一主机(或同一虚拟机)上,则它们不能共享网络或以这种方式通信。您可能能够独立于 Docker 的 Swarm 容器编排器配置覆盖网络,但这是一个复杂的设置。

更简单的方法是确保每个容器都发布ports:到其主机 (VM),然后使用其他主机 (VM) 的 IP 地址作为连接的目标。

# docker-compose.a.yaml, on 10.0.10.10
version: 3.8
services:
  ServerA:
    image: servera
    ports:
      - "3443:443"
    environment:
      - SERVER_B_URL=https://10.0.10.20:4443/TestPath/
# use the Compose-provided default: network with default settings
# docker-compose.b.yaml, on 10.0.10.20
version: 3.8
services:
  ServerB:
    image: serverb
    ports:
      - "4443:443"

您将无法在 TLS 证书中获取有效名称,如果您有此要求,您可能会发现运行每主机 HTTPS 反向代理很有用。

在中等规模,像 Consul 这样的服务发现系统可以帮助您记住哪些服务放置在哪个节点上。在更大范围内,像 Kubernetes 这样的专用容器集群系统将帮助您部署和复制这些容器,而无需手动放置它们。


推荐阅读