Docker 如何使两个应用程序通过http服务器相互通信? TL;博士

Docker 如何使两个应用程序通过http服务器相互通信? TL;博士,docker,docker-compose,Docker,Docker Compose,我们如何设置docker compose环境,以便在多个自定义别名下访问容器?(或以其他方式解决我们问题的任何替代方案。) 现有设置 我们有两个应用程序†(nodejs服务器),每个应用程序都位于HTTP反向代理(Nginx)后面,需要相互通信。在localhost上,配置这一点很容易: 为服务器A和服务器B添加/etc/hosts条目: 127.0.0.1服务器a.测试 127.0.0.1服务器b.测试 在端口(如2001)上运行ServerA,在端口(2002)上运行ServerB 配

我们如何设置docker compose环境,以便在多个自定义别名下访问容器?(或以其他方式解决我们问题的任何替代方案。)

现有设置 我们有两个应用程序†(nodejs服务器),每个应用程序都位于HTTP反向代理(Nginx)后面,需要相互通信。在localhost上,配置这一点很容易:

  • 为服务器A和服务器B添加/etc/hosts条目:
    • 127.0.0.1服务器a.测试
    • 127.0.0.1服务器b.测试
  • 在端口(如2001)上运行ServerA,在端口(2002)上运行ServerB
  • 配置两个虚拟主机,反向代理服务器A和服务器B:

    server {   # Forward all traffic for server-a.testing to localhost:2001
        listen      80;
        server_name server-a.testing;
        location / {
            proxy_pass http://localhost:2001;
        }
    }
    server {   # Forward all traffic for server-b.testing to localhost:2002
        listen      80;
        server_name server-b.testing;
        location / {
            proxy_pass http://localhost:2002;
        }
    }
    
此设置非常适合于测试:两个应用程序可以以非常接近生产环境的方式相互通信,例如
request('https://server-b.testing",fn),
把所有的事情都记录下来!
我们现在想将此设置移动到docker和docker compose。理论上可行的
docker compose.yaml
是:

nginx:
  build: nginx
  ports:
   - "80:80"
  links:
   - server-a
   - server-b
server-a:
  build: serverA
  ports:
   - "2001:2001"
  links:
   - nginx:server-b.testing
server-b:
  build: serverB
  ports:
   - "2002:2002"
  links:
   - nginx:server-a.testing
所以当ServerA地址
http://server-b.testing
它实际上到达了Nginx,Nginx将其反向代理到ServerB。不幸的是,链接不可能存在循环依赖关系。此问题有三种典型的解决方案:

  • 这两种方法对我们都不起作用,因为为了让虚拟主机工作,我们需要能够在名称为
    server-a.testing
    server-b.testing
    下对Nginx容器进行寻址。我们能做什么

    (†)实际上有点复杂——四个组件和链接——但这对解决方案没有任何影响:

    • testClient(->Nginx)->ServerA
    • testClient(->Nginx)->ServerB
    • ServerA(->Nginx)->ServerB
    • testClient(->Nginx)->ServerC
    试试这个:

  • 使用--Link server-a:server-a--Link server-b:server-b将您的server-aserver-b容器链接到nginx
  • 使用更新nginx conf文件

    位置/sa
    代理通行证

    位置/sb
    代理通行证

  • 链接两个容器时,docker会将“conatiner\u name container\u ip”添加到链接容器的/etc/hosts文件中。因此,在本例中,服务器a和服务器b通过/etc/hosts文件解析为各自的容器IP

    您可以从或

    访问它们,请尝试以下操作:

  • 使用--Link server-a:server-a--Link server-b:server-b将您的server-aserver-b容器链接到nginx
  • 使用更新nginx conf文件

    位置/sa
    代理通行证

    位置/sb
    代理通行证

  • 链接两个容器时,docker会将“conatiner\u name container\u ip”添加到链接容器的/etc/hosts文件中。因此,在本例中,服务器a和服务器b通过/etc/hosts文件解析为各自的容器IP

    您可以从或

    访问它们,3个(
    --x-networking
    )而不是nginx的组合如何?您可以在
    server-a
    server-b
    中的每一个上设置
    VIRTUAL\u HOST
    环境变量。如果您需要对nginx配置进行更精细的控制,您可以将docker gen和nginx容器分离出来。使用3(
    --x-networking
    )和nginx的组合如何?您可以在
    server-a
    server-b
    中的每一个上设置
    VIRTUAL\u HOST
    环境变量。如果您需要对nginx配置进行更精细的控制,那么可以将docker gen和nginx容器分开。