ECS Fargate类型的容器如何相互通信



问题

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
}
}

我的理解

  1. 在同一个ECS服务中,容器之间可以通过localhost进行通信
  2. 在不同的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-发现

您的理解

  1. 否,容器之间不会通过localhost进行通信。容器是将正在运行的进程与主机进程分离的独立实体。除非从host网络开始,否则它们无法访问主机操作系统,因此无法在自己的环回地址上看到彼此
  2. 当容器通过docker-compose部署时,AWS会设置必要的DNS,以允许容器以与通常相同的方式(通过服务名称)以及通过<service>.<compose_project_name>.local进行连接。设置和解析此DNS可能需要一些时间,因此您的应用程序需要能够处理回退

看起来您对nodeapp.{MY_CLUSTER}.local:3000的想法是正确的。您应该将看到的错误日志包括在部署中,以便进一步帮助您。

重要的是要记住将您的撰写文件指定为3.8版本,以便完全支持AWS

类似问题

值得注意的是,这个问题以前也被问过,当你搜索答案时很容易出现:

让容器在弹性容器服务(ECS)中相互交谈?

最新更新