致力于在单个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
提前致谢。
答案 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进行负载平衡