【问题标题】:Communication between containers in ECS task definitionECS任务定义中容器之间的通信
【发布时间】:2020-12-31 08:13:40
【问题描述】:

我在以awsvpc 模式运行的 ECS 中有一个任务定义,其中包含 2 个 docker 容器。我的问题是如何在任务定义中的容器之间进行通信。它们的行为是否类似于 docker-compose?

【问题讨论】:

    标签: amazon-web-services amazon-ecs


    【解决方案1】:

    在 awsvpc 网络模式下,任务中的多个容器将共享任务 ENI 和网络命名空间,因此它们可以使用 localhost(或等效的 127.0.0.1 环回 IP 地址)相互通信。

    【讨论】:

      【解决方案2】:

      链接概念仅在 AWS ec2 类型服务的情况下有效,您不能在 awsvpc 网络模式下使用链接。任务之间的链接只允许在属于同一任务定义的容器中,这意味着您应该在同一任务定义中运行两个容器来创建类似于 docker-compose 的链接。

      links
      Type: string array
      
      Required: no
      

      link参数允许容器相互通信 无需端口映射。仅支持网络模式 任务定义的设置为桥接。 name:internalName 构造类似于 Docker 链接中的name:alias。高达 255 字母(大写和小写)、数字、连字符和下划线 是允许的。

      注意

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

      container-linking-in-task-definition

      如果是 AWS VPC,您可以使用 service discovery,这是 AWS 推荐的方法,以防 AWSvpc 心情。

      【讨论】:

        【解决方案3】:

        是的,我们可以在运行任务的容器之间进行通信。

        这是系统架构

        我们将使用Service discovery 注册到服务任务(Fargate/EC2 任务)

        这是一个如何使用 CloudFormation 向 ECS 启动一项服务的示例

        ...
        Resources:
        
            DiscoveryService:
                Type: AWS::ServiceDiscovery::Service
                Properties:
                  DnsConfig:
                    RoutingPolicy: MULTIVALUE
                    DnsRecords:
                      - TTL: 60
                        Type: A
                      - TTL: 60
                        Type: SRV
                  HealthCheckCustomConfig:
                    FailureThreshold: 1
                  Name: !Ref ServiceName
                  NamespaceId: !Ref PrivateNamespaceId // Example: ns-foobar
        ...
            Service:
                Type: AWS::ECS::Service
                DependsOn: LoadBalancerRule
                Properties:
                    Cluster: !Ref ClusterName
                    LaunchType: "FARGATE"
                    DesiredCount: !Ref DesiredCount
                    ...
                    ServiceRegistries:
                        - RegistryArn: !GetAtt DiscoveryService.Arn
                          Port: 80 // Container port and service port
        

        这是结果

        之后您可以使用curl 命令覆盖到容器进行测试:

        【讨论】:

          猜你喜欢
          • 2021-08-30
          • 2016-04-03
          • 1970-01-01
          • 2020-10-23
          • 2021-03-07
          • 1970-01-01
          • 2021-10-12
          • 2019-05-21
          • 1970-01-01
          相关资源
          最近更新 更多