Docker使用端点构建内部通信

时间:2016-08-10 18:07:56

标签: docker docker-compose

致力于在单个docker-compose.yml内运行两个不同的服务来进行通信。彼此在docker-compose内。

这两项服务是常规的NodeJS服务器(app1& app2)。 app1从外部来源收到POST个请求,然后应该向另一个NodeJS服务器app2 w发送请求。基于初始POST请求的信息。

我面临的挑战是如何让两个NodeJS容器进行通信。彼此不用硬编码特定的容器名称。我可以让两个容器当前进行通信的唯一方法是对以下网址进行硬编码:http://myproject_app1_1,然后将POST请求从app1正确引导至app2 ,但由于Docker增加容器名称的方式,它不能很好地扩展,也不支持潜在的容器崩溃等。

相反,我更愿意将POST请求发送到http://app2的某些内容或类似的方式来处理和别名多个容器,无论{的多少个实例{1}}容器存在Docker将传递一个正在运行的app2容器。

以下是我的app2文件示例:

docker-compose.yml

提前致谢。

2 个答案:

答案 0 :(得分:1)

当您从一个撰写文件中运行两个容器时,docker会自动设置一个"内部dns"允许通过撰写文件中定义的service名称引用其他容器(假设它们位于同一网络中)。因此,当从第一个服务引用http://app2时,这应该有效。

请参阅此示例,仅使用服务名称将请求从proxy代理到后端whoamiapp

default.conf

server {
    listen 80;

    location / {
        proxy_pass http://whoamiapp;
    }
}

搬运工-compose.yml

version: "2"
services:
  proxy:
    image: nginx
    volumes:
        - ./default.conf:/etc/nginx/conf.d/default.conf:ro
    ports:
    - "80:80"

  whoamiapp:
    image: emilevauge/whoami

使用docker-compose up -d运行它并尝试运行curl <dockerhost>

此示例使用带有docker-compose文件版本2的默认网络。您可以在此处详细了解如何使用docker-compose进行联网:https://docs.docker.com/compose/networking/

container_name属性的配置可能会以某种方式干扰此行为?您不应该自己定义它。

答案 1 :(得分:0)

确定。这是两个问题。

首先:如何不对容器名称进行硬编码。 您可以使用系统environment variables,如:

nodeJS文件:

app2Address = process.env.APP2_ADDRESS; 
response = http.request(app2Address);

docker撰写文件:

app1:
  image: 'mhart/alpine-node:6.3.0'
  container_name: app1
  command: npm start
  environment: 
   - APP2_ADDRESS: ${app2_address}

app2:
  image: 'mhart/alpine-node:6.3.0'
  container_name: app2
  command: npm start
  environment: 
   - HOSTNAME: ${app2_address}

和.env文件如:

app2_address=myapp2.com

您也可以使用通配符应用程序配置文件。当容器启动时,您需要替换真实的主机名。 对于此操作,您需要创建entrypoint.sh并使用“sed”,如:

sed -i '/sAPP_2HOSTNAME_WILDCARD/${app2_address}/g /app1/congig.js

二。如何进行透明的负载平衡:

您需要使用http负载均衡器,如

hello-world tutorial如何使用docker进行负载平衡