如何链接在 AWS ECS 任务中运行的 2 个容器

Lin*_*h14 10 amazon-ecs docker aws-fargate

我是 ECS 的新手,我正在尝试使用 Fargate 在 ECS 任务中部署几个容器。

我有 1 个使用 Angular2 并在 nginx 上运行的容器,另一个容器是后端,在 Springboot 上运行并使用端口 42048。

我正在将 awsvpc 网络与 Fargate 一起使用,我必须这样做。

Angular 应用程序使用 localhost:42048/some_url 与后端通信,它在我的本地 docker 中运行良好,但在 AWS 中,前端找不到后端。目前,我的端口映射为前端的 80 和后端的 42048,前端在本地部署时能够找到后端为 localhost:42048

任何帮助,将不胜感激。谢谢

Adi*_*iii 10

AWSVPC 中不允许链接。

当设置为桥接时,您只能在网络模式下进行链接。

links

Type: string array

Required: no
Run Code Online (Sandbox Code Playgroud)

link 参数允许容器相互通信而无需端口映射。仅当任务定义的网络模式设置为桥接时才支持。name:internalName 构造类似于 Docker 链接中的 name:alias。最多允许 255 个字母(大写和小写)、数字、连字符和下划线。有关链接 Docker 容器的更多信息,请访问 https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/。此参数映射到 Docker 远程 API 的创建容器部分中的链接和--linkdocker run 选项。

笔记

使用 awsvpc 网络模式的 Windows 容器或任务不支持此参数。

重要的

并置在单个容器实例上的容器可能无需链接或主机端口映射即可相互通信。使用安全组和 VPC 设置在容器实例上实现网络隔离。

任务定义参数

在网络模式下,你必须在同一个任务定义中定义两个容器,然后在链接中提到容器的名称。

在此处输入图片说明 然后在前端容器中提到后端容器的名称。

在此处输入图片说明


Har*_*ran 6

使用 Fargate,如果您想使用 访问后端localhost:42048,那么您可以尝试在同一任务定义中配置前端和后端。在部署任务时,在同一任务定义中定义的所有容器都将在同一底层主机中运行,我们可以使用 localhost 访问它。请记住,Fargate 存储是短暂的,您的后端不应在容器中维护应用程序状态。

...
"containerDefinitions": [
    {
      "name": "frontend",
      "image": "my-repo/angularapp",
      "cpu": 256,
      "memory": 1024,
      "essential": true,
      "portMappings": [ {
          "containerPort": 8080,
          "hostPort": 8080
       }
     ]
    },
    {
      "name": "backend",
      "image": "my-repo/springboot",
      "cpu": 256,
      "memory": 1024,
      "essential": true,
      "portMappings": [ {
          "containerPort": 42048,
          "hostPort": 42048
       }
     ]
    }
  ]
...  
Run Code Online (Sandbox Code Playgroud)

但恐怕这种方法不适合生产级。

  • 有什么原因这不适用于 EC2 实例类型吗?另外,为什么说它不是“生产级”? (2认同)
  • @pdoherty926,原因是如果其中一个容器不健康,则两个容器都将被终止,而且您无法扩展一个容器,如果一个容器扩展,另一个容器也会扩展。这更类似于单个容器中的两个进程。它们是高度依赖的,而微服务的目的是最小化服务之间的依赖关系。 (2认同)