在 AWS Fargate 中链接容器

Posted

技术标签:

【中文标题】在 AWS Fargate 中链接容器【英文标题】:Linking Container in AWS Fargate 【发布时间】:2018-05-18 04:01:47 【问题描述】:

我尝试在 AWS Fargate 上设置一个小示例,并尝试在其中拥有一个应用程序容器和一个数据库容器。

任务定义启动两个容器,但我的应用程序容器失败并显示getaddrinfo ENOTFOUND db db:3306。 因此,我的应用容器找不到数据库容器。

由于 Fargate 不允许 Docker 容器的“链接”,我想知道它们如何相互通信。 数据库容器的名称为db,端口为3306,我的应用容器配置为使用它。

很遗憾,Fargate 无法定义容器链接,而仅适用于“oldschool”ECS/EC2。

在本地 docker-compose 设置中,它以这种方式工作。

【问题讨论】:

但是您为解决问题所做的更改是什么?根据您接受的答案,您无需更改任何内容。 在我部署的应用程序中,我尝试将数据库引用为“db:3306”。当我部署应用程序和数据库并使用“localhost:3306”(而不是服务名称)引用数据库时,它可以工作。 【参考方案1】:

Fargate 任务中的容器共享一个网络命名空间,因此您根本不需要使用链接。您可以简单地通过 localhost 进行通信。

例如,如果您的容器 A 在端口 8000 上运行 Web 服务器,则容器 B 可以通过 curl http://localhost:8000/ 访问它

【讨论】:

谢谢,很有用! @Noah 你将如何使用服务 A 和 B 都在内部监听 8080,例如2 个春季启动项目 @toske 您需要将其中一项服务移动到不同的端口。或者,理论上,如果您希望其中一个暴露给 localhost,而另一个暴露给网络,您可以显式地将一个绑定到 127.0.0.1,另一个绑定到不同的地址。 @SangamBelose 您不需要为此在 cloudformation 中指定任何内容。 'awsvpc' 模式,无论是在 ECS 还是 Fargate 中,都意味着共享网络命名空间(例如共享 localhost) 来自 AWS 的更多信息 - aws.amazon.com/blogs/compute/task-networking-in-aws-fargate【参考方案2】:

现在您可以使用 AWS Cloud Map 服务发现与 Amazon ECS 的集成https://docs.aws.amazon.com/AmazonECS/latest/bestpracticesguide/networking-connecting-services.html 使用此服务,您将能够通过 DNS 名称调用其他容器

【讨论】:

【参考方案3】:

您可能可以进行设置,以便服务可以通过公共 IP 地址相互通信,然后使用 VPC 保护端口,只有服务可以在其上与自己通信。

【讨论】:

以及在构建容器时如何知道公网IP地址?您也许可以通过先分配 EIP,然后将其附加到 Fargate 来做到这一点。我不认为你可以......使用 localhost 更容易!

以上是关于在 AWS Fargate 中链接容器的主要内容,如果未能解决你的问题,请参考以下文章

AWS Fargate 容器中的持久性

将命令行参数传递给 AWS Fargate 容器

如何使用 Fargate 在 AWS ECS 中正在运行的容器中运行命令

如何在 AWS Fargate 中更新容器映像

aws fargate 和私有容器存储库

在 AWS ECS Fargate 中,任务内无法进行容器间连接