Docker使用端点编写内部通信

Docker使用端点编写内部通信,docker,docker-compose,Docker,Docker Compose,在一个docker compose.yml中运行两个不同的服务,以便与w进行通信。docker compose中的每个人 这两个服务是常规的NodeJS服务器(app1&app2)app1接收来自外部源的POST请求,然后应向另一个NodeJS服务器app2w发送请求。基于初始POST请求的信息 我面临的挑战是如何使两个NodeJS容器通信w。相互之间没有硬编码特定的容器名称。目前,我能让这两个容器通信的唯一方法是硬编码url,如:http://myproject_app1_1,然后将POST请

在一个
docker compose.yml
中运行两个不同的服务,以便与w进行通信。docker compose中的每个人

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

我面临的挑战是如何使两个NodeJS容器通信w。相互之间没有硬编码特定的容器名称。目前,我能让这两个容器通信的唯一方法是硬编码url,如:
http://myproject_app1_1
,然后将
POST
请求从
app1
正确引导到
app2
,但由于Docker增加容器名称的方式,它不能很好地扩展,也不支持潜在的容器崩溃等

相反,我更愿意将
POST
请求发送到
http://app2
或类似的方法来处理和别名多个容器,无论存在多少个
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 [...]

提前谢谢。

好的。这是两个问题

第一:如何不硬编码容器名称。 您可以使用以下系统:

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”,如:

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

您需要像这样使用http负载平衡器


有一个hello world如何与docker进行负载平衡当您从一个合成文件运行两个容器时,docker会自动设置一个“内部dns”,允许通过合成文件中定义的
服务
名称引用其他容器(假设它们在同一网络中)。因此,在引用
http://app2
从第一次维修开始

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

default.conf

server {
    listen 80;

    location / {
        proxy_pass http://whoamiapp;
    }
}
docker-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

此示例使用docker compose文件版本2的默认网络。您可以在此处阅读有关docker compose的网络工作原理的更多信息:

您对
container\u name
属性的配置可能会以某种方式干扰此行为?您不需要自己定义它

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

  whoamiapp:
    image: emilevauge/whoami