

# Amazon ECS 的 EC2 容量架构
<a name="launch-type-ec2"></a>

EC2 容量适合必须进行价格优化的大型工作负载。

当考虑如何使用 EC2 对任务定义和服务建模时，我们建议您考虑哪些流程必须一起运行以及您将如何扩展每个组件。

例如，假设某个应用程序包含以下组件：
+ 一项在网页上显示信息的前端服务
+ 一项为前端服务提供 API 的后端服务
+ 数据存储

对于此示例，创建将用于共同目的的容器分组的任务定义。将不同的组件分离为多个任务定义。以下示例集群具有运行三个前端服务容器、两个后端服务容器和一个数据存储服务容器的三个容器实例。

您可以对任务定义中的相关容器（例如，必须一起运行的已链接的容器）进行分组。例如，将日志流容器添加到前端服务，并将其包含在同一任务定义中。

在拥有任务定义后，您可以从这些任务定义创建服务以保持所需任务的可用性。有关更多信息，请参阅 [创建 Amazon ECS 滚动更新部署](create-service-console-v2.md)。在您的服务中，您可以将容器与 Elastic Load Balancing 负载平衡器关联。有关更多信息，请参阅 [使用负载均衡分配 Amazon ECS 服务流量](service-load-balancing.md)。当您的应用程序要求发生更改时，您可以更新服务以增大或减小所需任务数。或者，您可以更新服务以在任务中部署较新版本的容器。有关更多信息，请参阅 [更新 Amazon ECS 服务](update-service-console-v2.md)。

![\[包含三个实例的应用程序架构示例。实例 1 具有前端服务容器和数据库服务容器。实例 2 和实例 3 具有前端服务容器和后端服务容器。\]](http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/images/application.png)


# Amazon ECS 上 EC2 和外部实例的容器映像拉取行为
<a name="pull-behavior"></a>

容器启动所需的时间因底层容器映像而异。例如，较胖的映像（Debian、Ubuntu 和 Amazon1/2 的完整版本）可能需要更长时间才能启动，因为与各自的精简版本（Debian-slim、Ubuntu-slim 和 Amazon-slim）或较小的基础映像（Alpine）相比，容器中运行的服务更多。

当 Amazon ECS 代理启动任务时，它会从其远程注册表中拉取 Docker 映像，然后缓存本地副本。当您为每个版本的应用程序使用新的映像标签时，这种行为是不必要的。

`ECS_IMAGE_PULL_BEHAVIOR` 代理参数决定映像拉取行为。以下选项可用：
+ `ECS_IMAGE_PULL_BEHAVIOR`: `default`

  映像将被远程拉取。如果拉取失败，则使用实例中缓存的映像。
+ `ECS_IMAGE_PULL_BEHAVIOR`: `always`

  映像将被远程拉取。如果拉取失败，任务将失败。

要加快部署速度，请将 Amazon ECS 代理参数设置为以下值之一：
+ `ECS_IMAGE_PULL_BEHAVIOR`: `once`

  仅当同一容器实例上之前的任务尚未拉取映像或缓存映像已被自动映像清除过程删除时远程拉取映像。否则，将使用实例上缓存的映像。这样可确保不会进行不必要的映像拉取尝试。
+ `ECS_IMAGE_PULL_BEHAVIOR`: `prefer-cached`

  在没有缓存映像时远程拉取映像。否则，将使用实例上缓存的映像。为容器关闭自动映像清除，以确保不会删除缓存的映像。

将 `ECS_IMAGE_PULL_BEHAVIOR` 参数设置为上述任一值可以节省时间，因为 Amazon ECS 代理会使用已下载的现有映像。对于较大的 Docker 映像，下载可能需要 10-20 秒才能通过网络拉取。