【发布时间】:2020-12-31 08:13:40
【问题描述】:
我在以awsvpc 模式运行的 ECS 中有一个任务定义,其中包含 2 个 docker 容器。我的问题是如何在任务定义中的容器之间进行通信。它们的行为是否类似于 docker-compose?
【问题讨论】:
标签: amazon-web-services amazon-ecs
我在以awsvpc 模式运行的 ECS 中有一个任务定义,其中包含 2 个 docker 容器。我的问题是如何在任务定义中的容器之间进行通信。它们的行为是否类似于 docker-compose?
【问题讨论】:
标签: amazon-web-services amazon-ecs
在 awsvpc 网络模式下,任务中的多个容器将共享任务 ENI 和网络命名空间,因此它们可以使用 localhost(或等效的 127.0.0.1 环回 IP 地址)相互通信。
【讨论】:
链接概念仅在 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 心情。
【讨论】:
是的,我们可以在运行任务的容器之间进行通信。
这是系统架构
我们将使用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 命令覆盖到容器进行测试:
【讨论】: