我在以awsvpc
模式运行的ECS中有一个任务定义,其中包含2个docker容器。我的问题是如何在任务定义的容器之间进行通信。它们的行为类似于docker-compose吗?
答案 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)
是的,我们可以在容器运行任务之间进行通信。
这是系统架构
我们将使用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
命令覆盖进行测试: