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

Posted

技术标签:

【中文标题】如何链接在 AWS ECS 任务中运行的 2 个容器【英文标题】:How do I link 2 containers running in a AWS ECS task 【发布时间】:2019-10-25 09:35:31 【问题描述】:

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

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

我正在使用带有 Fargate 的 awsvpc 网络,我必须这样做。

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

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

【问题讨论】:

docs.aws.amazon.com/en_us/AmazonECS/latest/developerguide/… @Passatizhi 我不能像示例中那样做,因为当网络模式为 awsvpc 时不支持链接 【参考方案1】:

AWSVPC 中不允许链接。

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

links

Type: string array

Required: no

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

注意

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

重要

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

task_definition_parameters

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

然后在前端容器中提到了后端容器的名称。

【讨论】:

感谢您的回复,我之前尝试过这样做,但问题是我必须使用 Fargate,而 Fargate 只允许 awsvpc Fargate 不支持链接。你可以查看文档【参考方案2】:

使用 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
       
     ]
    
  ]
...  

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

【讨论】:

感谢您的回复 Haran,我就是这样配置它们的再次,没有沟通。我不知道为什么 这有什么理由不适用于 EC2 实例类型?另外,为什么说它不是“生产级”? @pdoherty926 原因是如果其中一个容器不健康,则两者都将被终止,而且您无法缩放一个容器,如果一个容器缩放另一个容器也会缩放。这更类似于单个容器中的两个进程。它们是高度依赖的,而微服务的目的是最小化服务之间的依赖关系。

以上是关于如何链接在 AWS ECS 任务中运行的 2 个容器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS ECS 集群的服务中运行 AWS ECS 任务,而不是将服务从 Circle CI 的“aws-ecs/run-task”中排除

如何从 AWS Lambda 函数运行 ECS 任务?

如何在节点 AWS 开发工具包代码中使用 AWS ECS 任务角色

aws ecs 控制台运行任务时出现错误“无法运行任务”,如何调试/找到真正的错误

Celery:AWS ECS Autoscale 缩减事件(如何不破坏长时间运行的任务?)

如何从 ECS 任务中安装 aws cli?