【问题标题】:ECS on EC2 bidirectional communication between two containers in the same taskECS on EC2 同一任务中两个容器之间的双向通信
【发布时间】:2021-07-12 19:27:03
【问题描述】:

我正在尝试在 EC2 实例上配置 ECS 任务。任务定义中的网络模式是桥接

我的任务里面有两个容器,它们应该相互通信。例如ContainerA 向 ContainerB 发出请求,ContainerB 向 ContainerA 发出请求。

当我使用 docker-compose 时一切正常,容器可以通过它们的名称进行通信。但是当我在 ECS 上部署时,这些容器看不到彼此。部分我可以使用任务定义中的链接来解决这个问题,但是,它只在一个方向上起作用,我的意思是如果为两个容器设置链接,我会在创建任务定义期间收到这样的错误消息:

无法创建任务定义 web-app:12 的新修订版 容器链接不应该有循环

很高兴听到任何想法,我错过了什么以及是否真的可能。老实说,我认为一个任务中的容器应该通过容器名称自动通信,尤其是当它们在同一个 Bridge 网络下时。

我知道有一项服务发现功能允许通过名称在服务之间进行通信,但我仍然希望拥有一个服务和任务,其中包含两个容器。

感谢您的帮助。

ContainerA NETWORK SETTINGS

【问题讨论】:

    标签: amazon-web-services docker networking amazon-ec2 amazon-ecs


    【解决方案1】:

    如果两个容器都在同一个任务定义中定义,它们可以通过localhost 获得:

    例如,如果 ContainerA 正在侦听 8081 端口,而 ContainerB 正在侦听 8082 端口,它们可以通过以下方式相互联系:

    localhost:8081
    localhost:8082
    

    旁注:与具有两个容器的 Kubernetes pod 中的概念相同 - 可通过 localhost 访问它们

    编辑:这与awsvpc 网络模式相关,正如您在documentation 中看到的那样:

    属于同一任务的容器可以通过 本地主机接口

    【讨论】:

    • 感谢您的回复。是的,它适用于 awsvpc,但不幸的是不适用于桥接模式
    【解决方案2】:

    docker-compose 默认不使用bridge,而是用户定义的网络。这是通过按服务名称寻址来工作的:

    默认情况下,Compose 会为您的应用设置一个网络。服务的每个容器都加入默认网络,并且该网络上的其他容器都可以访问它们,并且它们可以通过与容器名称相同的主机名发现。

    https://docs.docker.com/compose/networking/

    ECS EC2 默认使用链接,已被 Docker 弃用并且不能有循环,正如您所发现的那样。

    很遗憾,AWS 不支持用户定义的网络,尽管存在长期存在的问题:https://github.com/aws/containers-roadmap/issues/184

    到目前为止,这就是我想出的。我想剩下的唯一选择是使用awsvpc 网络模式,它允许容器通过localhost 进行通信(我觉得这很尴尬):

    这意味着任务中的所有容器都可以通过弹性网络接口的 IP 地址进行寻址,并且它们可以通过 localhost 接口相互通信。

    https://aws.amazon.com/blogs/compute/under-the-hood-task-networking-for-amazon-ecs/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-30
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多