Amazon web services 在AWS ECS中的任务定义之间链接容器?

Amazon web services 在AWS ECS中的任务定义之间链接容器?,amazon-web-services,docker,amazon-ecs,Amazon Web Services,Docker,Amazon Ecs,我正在尝试在AWS ECS中设置一个基本的web应用程序,它有一个关联的数据库。在本地,我将这些设置放在不同的容器中,在ECS上,我希望有单独的任务定义,以便可以分别扩展这两个容器 我在ECS中成功注册了我的第一个任务定义为david_mongodb。它有一个名为david\u mongodb的容器 然后我尝试将我的第二个任务定义注册为david\u web,它有一个名为david\u web的容器,该容器通过david\u mongodb:db链接数据库 单击“创建”时,它返回一个错误: Un

我正在尝试在AWS ECS中设置一个基本的web应用程序,它有一个关联的数据库。在本地,我将这些设置放在不同的容器中,在ECS上,我希望有单独的任务定义,以便可以分别扩展这两个容器

  • 我在ECS中成功注册了我的第一个任务定义为
    david_mongodb
    。它有一个名为
    david\u mongodb
    的容器
  • 然后我尝试将我的第二个任务定义注册为
    david\u web
    ,它有一个名为
    david\u web
    的容器,该容器通过
    david\u mongodb:db
    链接数据库
  • 单击“创建”时,它返回一个错误:

    Unable to create Task Definition
    Linked container 'david_mongodb:db' doesn't exist.
    
  • 任务定义似乎无法在其他任务定义中看到容器名称?我认为将
    david_web
    david_mongodb
    容器放在同一个任务定义中是可行的,但我不想这样做:这会阻止我单独扩展web应用程序或数据库。似乎证实了我的架构是被推荐的


    那么,如何链接位于不同任务定义中的容器呢?或者有其他聪明的方法来处理这个问题吗?

    ECS任务定义中的链接类似于容器是同一任务定义的一部分,并且只有当容器是同一任务定义的一部分时才起作用(作为单个任务定义一部分的容器放在同一主机上)。为了在不同任务定义中的容器之间进行通信,您需要一种机制来发现容器位于何处(哪个主机)以及用于通信的端口

    ECS通过该功能与弹性负载平衡(应用程序负载均衡器、网络负载均衡器和经典负载均衡器)集成,任务将自动在ELB中注册,并在ELB中适当注销

    ECS还集成了基于DNS的服务发现,使用
    A
    SRV
    记录。您的服务任务可以自动输入DNS记录并从中删除

    描述一种不同的方法,其中Lambda函数通过CloudWatch事件侦听ECS事件流并更新路由53 DNS记录。上述Route 53自动命名功能已取代此方法

    如果您希望避免使用负载平衡器和DNS,另一种模式可能是(有一个使用ECS API的示例名为),或者您可能对覆盖网络感兴趣(Weave有一个相当详细的解决方案)


    正在跟踪与ECS相关的许多不同主题,包括服务发现。

    很高兴知道。是否有规定的沟通机制?我想到了DNS+ELB,但是有没有一个解决方案不需要ELB?我已经更新了我的答案,提供了可能的方法(ELB、大使容器和覆盖网络)的更多细节。在ELB示例中,将容器自动注册到ELB是否会产生与在Docker中链接容器相同的效果?我相信链接会在容器内创建env变量,并为其他容器创建IP和端口。ELB会不会做一个类似的把戏,通过链接已经在工作的容器透明?或者需要做些什么来获得相同的行为呢?我不太清楚,但看起来ELB只适用于http。我不知道如何在那里注册数据库。使用带有ELB的服务不会在其他任务中自动创建环境变量;您将希望自己传递该消息,或者使用Route 53将一个众所周知的DNS名称映射到负载平衡器。应用程序负载平衡器(ALB)仅适用于HTTP/S+WebSocket,而经典负载平衡器(ELB)适用于HTTP/S或任意TCP。请参阅:。无需使用ELB进行实例间联网。我不相信联网模式可以解决此问题。您仍然需要发现任务到达的节点(和IP)。问题和答案之间没有联系,控制网络模式与链接在不同容器中运行的任务没有直接关系。自2017年11月起,我们还可以使用专用IP地址连接到其他任务中的容器,只要任务定义为使用
    awsvpc
    网络模式。此处宣布:。