容器映像 - Amazon ECS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

容器映像

容器映像是一组关于如何构建容器的说明。容器映像包含您的应用程序代码和运行应用程序代码所需的所有依赖项。应用程序依赖项包括您的应用程序代码所依赖的源代码包、解释型语言的语言运行时系统以及动态链接代码所依赖的二进制包。

在设计和构建容器映像时,请遵循以下指南:

  • 通过将所有应用程序依赖项作为静态文件存储在容器映像中,使您的容器映像完整。

    如果要更改容器映像中的某些内容,请使用应用于其中的更改来构建一个新的容器映像。

  • 在容器内运行单个应用程序进程。

    容器的生命周期与应用程序进程运行的时间一样长。

    崩溃的进程将通过 Amazon ECS 控制面板中的集中决策过程替换。控制面板可以更明智地选择在何处启动替换进程。与每个计算实例尝试在本地重新启动自己的进程相比,这使得整体部署更具弹性。

  • 在应用程序中处理 SIGTERM

    Amazon ECS 停止任务时,它首先向任务发送 SIGTERM 信号通知应用程序需要完成并关闭,然后 Amazon ECS 会发送一条 SIGKILL 消息。当应用程序忽略 SIGTERM 时,Amazon ECS 服务必须等待发送终止该进程的 SIGKILL 信号。

    要准备应用程序,您需要确定应用程序需要多长时间才能完成其工作,并确保您的应用程序能够处理 SIGTERM 信号。在应用程序的信号处理中,您需要阻止应用程序执行新工作并完成正在进行的工作,或者如果需要太长时间才能完成,则将未完成的工作保存到任务之外的存储中。

  • 配置容器化应用程序以向 stdoutstderr 写入日志。

    当您将日志处理与应用程序代码分离时,可以更灵活地在基础设施级别调整日志处理。假设您要从一个日志系统切换到另一个日志系统。您可以通过在容器编排工具级别调整一些设置来做到这一点,而不必更改所有服务中的代码,构建新的容器映像并进行部署。

  • 使用标签对容器映像进行版本控制。

    容器映像存储在容器注册表中。注册表中的每个映像都由标签标识。有一个名为 latest 的标签。此标签的作用是指向最新版本的应用程序容器映像的指针,类似于 git 存储库的 HEAD 中。建议您仅将此 latest 标签用于测试。最佳做法是,使用每个版本的唯一标签来标记容器映像。建议您使用 git SHA 标记您的映像,以用于构建映像的 git commit。

    您无需为每次提交构建容器映像。但是,建议您在每次发布提交到生产环境的特定代码时都构建一个新的容器映像。还建议您使用与映像内部代码的 git commit 相对应的标签来标记映像。如果您使用 git commit 标记了映像,则可以更快地找到映像正在运行的代码版本。

    还建议您在 Amazon Elastic Container Registry 中开启不可变的映像标签。使用此设置,您无法更改标签所指向的容器映像。相反,Amazon ECR 强制要求必须将新映像上传到新标签,而不是覆盖先前存在的标签。有关更多信息,请参阅《Amazon ECR 用户指南》中的映像标签可变性

除了上述列表外,使用 Amazon Fargate 为运行 Amazon ECS 构建应用程序时,您必须决定是把多个容器部署到同一个任务定义中,还是分别在多个任务定义中部署容器。

当需要满足以下条件时,我们建议您在相同任务定义中部署多个容器:

  • 您的容器共享公共生命周期(即,它们应该一起启动和终止)。

  • 您的容器需要在相同的底层主机上运行(即一个容器在 localhost 端口上引用另一个容器)。

  • 您的容器共享资源。

  • 您的容器共享数据卷。

当不需要满足这些条件时,我们建议您在多个任务定义中单独部署容器。这是因为,通过这样做,您可以分别对其进行扩展、预置和取消预置。

使用 Seekable OCI(SOCI)延迟加载容器映像

Fargate 上使用 Linux 平台版本 1.4.0 的 Amazon ECS 任务可以使用 Seekable OCI(SOCI)来帮助更快地启动任务。借助 SOCI,容器只需花几秒钟的时间进行映像拉取即可启动,从而在后台下载映像时为环境设置和应用程序实例化提供了时间。这称为延迟加载。当 Fargate 启动 Amazon ECS 任务时,Fargate 会自动检测任务中是否存在映像的 SOCI 索引,并在不等待下载整个映像的情况下启动容器。

对于在没有 SOCI 索引的情况下运行的容器,容器映像将在容器启动之前完全下载。此行为在 Fargate 的所有其他平台版本上以及 Amazon EC2 实例上经 Amazon ECS 优化的 AMI 上均相同。

Seekable OCI 索引

Seekable OCI(SOCI)是 Amazon 开发的一种开源技术,它可以通过延迟加载容器映像来更快地启动容器。SOCI 的工作原理是为现有容器映像中的文件创建索引(SOCI 索引)。此索引有助于更快地启动容器,从而提供在下载整个映像之前从容器映像中提取单个文件的功能。SOCI 索引必须作为构件存储在与容器注册表中的映像相同的存储库中。您只能使用来自可信来源的 SOCI 索引,因为该索引是映像内容的权威来源。有关更多信息,请参阅介绍用于延迟加载容器映像的 Seekable OCI

注意事项

如果您希望 Fargate 使用 SOCI 索引在任务中延迟加载容器映像,请考虑以下几点:

  • 只有在 Linux 平台版本 1.4.0 上运行的任务才能使用 SOCI 索引。不支持在 Fargate 上运行 Windows 容器的任务。

  • 支持在 X86_64 或 ARM64 CPU 架构上运行的任务。使用 ARM64 架构的 Linux 任务不支持 Fargate Spot 容量提供程序。

  • 任务定义中的容器映像必须在与映像相同的容器注册表中具有 SOCI 索引。

  • 任务定义中的容器映像必须存储在兼容的映像注册表中。以下列出了兼容的注册表:

    • Amazon ECR 私有注册表。

  • 仅支持使用 gzip 压缩或未压缩的容器映像。不支持使用 zstd 压缩的容器映像。

  • 建议您尝试使用大于 250 MiB 压缩后的容器映像进行延迟加载。您不太可能看到加载较小映像的时间缩短。

  • 由于延迟加载可能会改变任务启动所需的时间,因此您可能需要对各种超时时间进行更改,例如 Elastic Load Balancing 的运行状况检查宽限期。

  • 如果要防止延迟加载容器映像,请从容器注册表中删除 SOCI 索引。如果任务中的容器映像不符合其中一个注意事项,则使用默认方法下载该容器映像。

创建 Seekable OCI 索引

要创建 SOCI 索引,首先要在容器映像中创建文件的索引。为此,您可以使用 GitHub 上的开源 CLI 工具 awslabs/soci-snapshotter。其次,将构件和映像推送到兼容的映像注册表,例如 Amazon ECR。或者,您可以使用 Amazon CloudFormation 部署以下解决方案,以便在将映像推送到 Amazon ECR 时自动创建和推送索引。有关解决方案和安装步骤的更多信息,请参阅 GitHub 上的 Amazon 上的 CFN Amazon SOCI 索引构建器。Amazon CloudFormation 模板是自动开始使用 SOCI 的更简单方法,而开源构建工具在索引生成方面具有更大的灵活性,并且能够将索引生成集成到持续集成和持续交付(CI/CD)管道中。

注意

要为映像创建 SOCI 索引,该映像必须存在于正在运行 soci-snapshotter 的计算机上的 containerd 映像存储中。如果映像在 Docker 映像存储中,则无法找到该映像。

验证任务是否使用延迟加载

要验证任务是否使用 SOCI 延迟加载,请从任务内部检查任务元数据端点。在您查询任务元数据端点版本 4 时,在您要查询的容器的默认路径中有一个 Snapshotter 字段。此外,/task 路径中每个容器都有 Snapshotter 字段。此字段的默认值为 overlayfs,如果使用 SOCI,则此字段设置为 soci。有关更多信息,请参阅《适用于 Amazon Fargate 的 Amazon Elastic Container Service 用户指南》中的任务元数据端点版本 4