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