Docker – 使用端点组成内部通信

在单个docker-compose.yml运行两个不同的服务来运行w。 docker-compose彼此docker-compose

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

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

相反,我更愿意发送POST请求到http://app2或类似的方式处理和别名的容器数量,无论有多less个app2容器的实例存在Docker将通过请求其中一个正在运行的app2容器。

以下是我docker-compose.yml文件的示例:

 version: '2' services: app1: image: 'mhart/alpine-node:6.3.0' container_name: app1 command: npm start app2: image: 'mhart/alpine-node:6.3.0' container_name: app2 command: npm start # databases [...] 

提前致谢。

当您从一个撰写文件运行两个容器时,docker会自动设置一个“内部dns”,允许通过在撰写文件中定义的service名称引用其他容器(假设它们在同一个networking中)。 所以这应该在第一个服务引用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运行它docker-compose up -d然后尝试运行curl <dockerhost>

本示例使用docker-compose文件版本2的默认networking。您可以阅读有关如何使用docker-compose进行networking连接的更多信息: https : //docs.docker.com/compose/networking/

可能你的container_name属性的configuration不知何故干扰了这种行为? 你不需要自己定义这个。

好。 这是两个问题。

首先:如何不对容器名称进行硬编码。 您可以使用系统环境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 

也可以使用通配符应用程序configuration文件。 而容器启动时,你需要replace真正的主机名。 对于这个动作你需要创buildentrypoint.sh并使用“sed”,如:

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

第二。 如何做一个透明的负载平衡:

你需要使用http负载均衡器

  • HAProxy的
  • nginx作为负载平衡器

有hello世界的教程如何使docker负载平衡