【问题标题】:ECS containers call each otherECS容器相互调用
【发布时间】:2021-11-09 04:53:26
【问题描述】:

我正在试验 AWS ECS。我正在尝试找到允许我的容器相互通信的最佳实践。

我发现的最简单的方法是使用应用程序负载平衡器。这可行,但我必须将 ALB 的 DNS 主机作为环境变量传递到我的任务定义/容器中。

这被认为是最佳做法还是有更好的方法?

【问题讨论】:

  • 你尝试过服务发现吗......这是ECS可用的最灵活的选项
  • 我确信我也可以做到这一点,但我仍然会有同样的问题;我是否需要将其他服务名称作为环境变量传递到任务定义中?
  • 这将是最好的方法。如果您需要服务可用的主机名,尤其是在使用 Fargate 时。您可以尝试的另一个概念是边车容器。我们使用边车容器通过 Fargate 在容器之间共享数据...
  • 将依赖项的主机名或 URL 作为环境变量传递可能是最佳实践。您可以将相同的基本设置用于本地开发、本地 Docker Compose 或 Kubernetes,而无需更改代码或映像。

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


【解决方案1】:

首先我假设当您说“允许我的容器相互通信”时,您是指单独的 ECS 服务(由 n 个任务组成)相互通信?

明确一点:ECS 服务是根据需要(从 1 到 n)扩展和扩展的 ECS 任务的集合。 ECS 任务是预定义容器的集合(从 1 到 10 个 IIRC)。在大多数情况下,每个任务将有 1 个容器,但您可以有多个边车(出于其他原因需要额外的容器)。

在任务内部,容器可以通过localhost 相互通信,因为它们共享网络命名空间。问题是如何让 ECS 服务相互通信。在他们面前使用 ELB 是实现这一目标的一种方法。实现它的另一种(更实用的方法)是使用Service Discovery。如果启用它,ECS 服务 A 中的所有任务将能够解析 ECS 服务 B 的名称(无需您传递任何变量),它将解析属于服务 B 的任务(通过利用 Route53 和CloudMap 幕后)。

您可以阅读更多here

如果您想探索如何使用服务发现的示例,this 可能会有所帮助。

最后但同样重要的是,如果您开始使用 ECS,我的建议是使用 Copilot,它隐藏了很多细节并提供了一个更易于使用的 ECS 界面:https://aws.github.io/copilot-cli/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 2021-09-23
    • 2014-09-10
    • 2017-05-24
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2021-11-21
    相关资源
    最近更新 更多