问题
ECS Fargate容器之间如何通信?
情况
我使用docker编写ecs集成
在AWS docker上下文中,docker compose up
正确地进行了部署
但反向代理无法正常工作,可能是因为与容器的通信。
我的docker-compose.yml
version: '3'
services:
nginx:
image: {ACCOUNT}.dkr.ecr.{REGION}.amazonaws.com/{MY_IMAGE}
ports:
- "80:80"
nodeapp:
image: {ACCOUNT}.dkr.ecr.{REGION}.amazonaws.com/{MY_REACT_IMAGE}
working_dir: /src
command: sh -c "yarn install && yarn build && yarn start"
ports:
- "3000:3000"
MY nginx.conf
server {
listen 80;
server_name localhost;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://localhost:3000/;
# proxy_pass http://nodeapp:3000/; // works only for local
# proxy_pass http://nodeapp.{MY CLUSTER}.local:3000/; // doesn't work
}
}
我的理解
- 在同一个ECS服务中,容器之间可以通过localhost进行通信
- 在不同的ECS服务中,容器之间可以通过服务发现进行通信
这些正确吗?我该怎么做?
1:相同的ECS服务
一开始我试着这么做。但是,docker compose up
(ecs集成)创建了不同的服务(用于nginx服务和应用程序(react)服务。我该如何配置?
2:不同的服务
在nginx conf中,proxy_pass http:nodeapp。{MY_CLUSTER}.local:3000无法正常工作。
ECS容器之间如何通信
让我知道最简单的方法
提前谢谢。
Docker文档定义了如何很好地工作。
https://docs.docker.com/cloud/ecs-integration/#service-发现
您的理解
- 否,容器之间不会通过localhost进行通信。容器是将正在运行的进程与主机进程分离的独立实体。除非从
host
网络开始,否则它们无法访问主机操作系统,因此无法在自己的环回地址上看到彼此 - 当容器通过docker-compose部署时,AWS会设置必要的DNS,以允许容器以与通常相同的方式(通过服务名称)以及通过
<service>.<compose_project_name>.local
进行连接。设置和解析此DNS可能需要一些时间,因此您的应用程序需要能够处理回退
看起来您对nodeapp.{MY_CLUSTER}.local:3000
的想法是正确的。您应该将看到的错误日志包括在部署中,以便进一步帮助您。
重要的是要记住将您的撰写文件指定为3.8
版本,以便完全支持AWS
类似问题
值得注意的是,这个问题以前也被问过,当你搜索答案时很容易出现:
让容器在弹性容器服务(ECS)中相互交谈?