AWS 在 ECS 中使用 ECS 优化的 AMI 和 Docker 个容器

AWS Using ECS-Optimized AMI with Docker Containers in ECS

我已经花费了大量时间来构建我接下来要描述的那种部署设置。我浏览了大部分关于 ECS 的文档,并记录了详尽的学习资源列表。

但是,在 AWS ECS 上使用 Docker 似乎我仍然缺少一些重要的拼图...

在开发中,我们使用 Docker Compose 将一组容器定义为本地全栈集群。它是在本地使用容器的非常方便的工具。

我们的目标是使用 Docker Compose 方法将此集群部署到 Amazon AWS ECS。

ECS 最高支持 3.0 版的 Compose 文件格式。最值得注意的是,不支持使用本地文件作为构建上下文,因此必须引用图像。

我目前困惑的是:

ECS中实例运行ning的official doc states应该有Amazon ECS容器代理,Docker守护进程ecs-init 安装和配置。因此,对于基本图像,他们推荐:

The Amazon ECS-optimized AMIs are preconfigured with these requirements and recommendations. We recommend that you use the Amazon ECS-optimized Amazon Linux 2 AMI for your container instances unless your application requires a specific operating system or a Docker version that is not yet available in that AMI.

困惑点1: 然而,我在官方文档中没有找到关于如何实际构建和运行 Docker容器的示例这些优化的 AMI...只有大约两个 Docker 文件示例,here and here,它们都是从 public 非 AMI 图像构建的?

我找到了一些资源,例如 here (source) and here, which show how to use Packer with its EC2 AMI Builder (EBS backed) 用于基于这些 ECS 优化的 AMI 构建自定义 AMI。

我自己设置了这个过程并进行了一些小的修改,并且它正在运行。我在 AWS EC2 AMI 下显示了我自己的自定义图像。

混淆点 2: 但是,我似乎无法在我的 docker 文件或 docker 撰写文件中引用这些 AMI 图像,因为它们不是存储在 ECR 中...我是否正确(或配置错误)?

Packer 确实有一个 post-processor for docker push 支持 ECR。但它不适用于 EC2 AMI Builder:

Post-processor failed: Unknown artifact type: mitchellh.amazonebs
Can only import from docker-import and docker-tag artifacts.

当然,我实际上不需要将基本 AMI 存储在 ECR 中...但我需要能够将其用作构建自定义服务 Docker 图像的图像,并且将这些发布映像存储在 ECR 中。然后在 docker 合成文件中引用这些图像。

我知道转向其他自动化工具(如 Ansible、Terraform 或 AWS Code* 服务)可以帮助我克服这一点。但是我一直在尝试遵循官方文档并从各种来源收集信息,同时尽量减少设置,但我还没有完全理解我面临的问题。

困惑点3:使用Amazon ECS-optimized Amazon [=72]在ECS中构建和运行宁Docker容器的推荐方法是什么=] 2 个 AMI?

我在这里可能遗漏了什么...?

主机本身上的软件 运行ning 和容器中的软件 运行ning 之间存在差异。您正在阅读的段落是关于需要在 host EC2 系统上 运行 的软件。

搭建ECS集群时,需要提供一组EC2实例。 AWS 建议您使用他们的 AMI 作为这些实例的基础,这是一件非常合理的事情。如果您想改用标准 Ubuntu AMI 之类的东西,则需要在这些实例上安装引用的软件位,然后才能 "be part of" ECS 集群并启动 运行ning 容器。 (要 运行 Docker 容器,您需要 Docker 在主机上安装。)

我认为 ECS 上 运行 对 容器 没有特殊要求,并且没有办法构建 Docker 基于 AMI 的图像。您应该能够启动您在本地使用的同一组图像(假设您实际上 COPY 将源代码放入图像中,它们 运行 无需操作员交互,).