如何将两个通过http服务器相互通信的应用程序停靠?

时间:2016-01-20 23:30:39

标签: docker docker-compose

TL; DR

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

现有设置

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

  • 为ServerA和ServerB添加/ etc / hosts条目:
    • 127.0.0.1 server-a.testing
    • 127.0.0.1 server-b.testing
  • 在端口上运行ServerA 2001年和ServerB on port 2002
  • 配置两个虚拟主机,反向代理ServerA和ServerB:

    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);我们可以测试HTTP服务器配置如何与我们的应用程序交互(例如TLS配置,CORS标头,HTTP2代理)。

Dockerize所有的东西!

我们现在想将此设置移动到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,后者将其反向代理到ServerB。不幸的是,链接无法实现循环依赖。这个问题有三种典型的解决方案:

  1. use ambassadors
  2. use nameservers
  3. use the brand new networking (--x-networking)
  4. 这些都不适用于我们,因为要使虚拟主机工作,我们需要能够以名称server-a.testingserver-b.testing来寻址Nginx容器。我们能做什么?

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

    • testClient( - > Nginx) - > ServerA,
    • testClient( - > Nginx) - > ServerB,
    • ServerA( - > Nginx) - > ServerB,
    • testClient( - > Nginx) - > ServerC,

1 个答案:

答案 0 :(得分:0)

试试这个:

  1. 使用--link server-a将您 server-a server-b 容器链接到nginx:server-a --link server-b:server-b
  2. 使用

    更新nginx配置文件

    location / sa
               proxy_pass http://server-a:2001

    location / sb
           proxy_pass http://server-a:2001

  3. 当您链接两个容器时,docker会添加" conatiner_name container_ip"到链接容器的/ etc / hosts文件。因此,在这种情况下, server-a server-b 将通过/ etc / hosts文件解析为各自的容器IP。

    您可以从http://localhost/sahttp://localhost/sb

    访问它们