ECS任务定义中容器之间的通信

时间:2019-10-02 07:25:41

标签: amazon-web-services amazon-ecs

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

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

links
Type: string array

Required: no
  

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

注意

  

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

container-linking-in-task-definition

对于AWS VPC,您可以使用service discovery,对于AWSvpc心情,可以使用AWS推荐的方法。

答案 2 :(得分:0)

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

这是系统架构

enter image description here

我们将使用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

这是结果

enter image description here

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

enter image description here