在 ECS 上运行您的第一个 Docker 镜像
在过去几年里,使用容器已成为软件工程领域的一大趋势。容器可以为软件开发和应用程序部署带来诸多优势,并可能解决开发和运维团队面临的许多问题。我们将简要介绍一些基础知识,以及如何在亚马逊云服务 (AWS) 上运行您的第一个 Docker 镜像。
在亚马逊提供的种类繁多的服务中,当我们通常需要运行和部署 Docker 化应用程序时,弹性容器服务 (ECS) 是首选。
要将应用程序完全部署到所述服务中,至少需要三样东西:配置好的ECS 集群、ECR 上的至少一个镜像以及任务定义。
集群是任务和服务的集合,创建集群本身是免费的。任务必须放置在集群内才能运行,因此创建集群是强制性的。您可能需要为不同的应用程序或执行上下文创建不同的集群,以便保持所有内容的有序性和关联性。
任务定义是 AWS 的一种资源,用于描述 ECR 任务的容器和卷定义。用户可以在其中定义要使用的 Docker 镜像、环境和网络配置、任务放置的实例要求以及其他配置。由此,我们定义了任务,即任务定义实例,它是运行实体,按照我们定义的方式执行镜像中包含的所有软件。
先决条件
在深入研究任务定义配置之前,我们必须首先在一个 ECR 存储库中至少有一个容器镜像(因为一个任务定义可以同时使用多个容器),并且有一个已经配置好的(或空的)集群。
必须构建 Docker 镜像并将其推送到另一个 AWS 服务——弹性容器注册表 (ECR)。在这个非常简单的服务中,每个不同的 Docker 镜像都必须添加标签并推送到单独的仓库,以便在任务定义中引用。这是必须的。
亚马逊非常友好,甚至提供了执行所有基本操作所需的所有命令:您只需点击“查看推送命令”按钮,即可查看每个步骤的详细说明。
您可以通过点击ECS 主页上直观的“创建集群”按钮来创建集群。请务必根据您要使用的操作系统选择合适的模板,但建议您选择“ Linux + 网络”模板。除非您对自己的操作非常有把握,否则请勿选择“仅网络”模板,因为您将使用完全不同的服务——AWS Fargate。
我们可以选择创建一个空集群,这样就不会分配任何按需实例或竞价实例。由于创建空集群会给我们带来麻烦,我们需要以某种方式提供运行中的机器,以便我们的任务能够实际运行(这完全超出了我们这里讨论的范围),所以我建议您选择t2.microECS 实例类型,因为它几乎是免费的。请记住,如果您想使用 Fargate,则无需选择任何实例,因为 Amazon 会为您处理机器分配,所以您只需创建一个空集群即可。
任务定义
完成所有必要的配置后,我们终于可以安全地访问ECS 任务定义主页上的“创建新任务定义”部分了。
首先,亚马逊会要求您根据任务运行位置选择任务定义启动类型,提供两种选择:Fargate和ECS。Fargate是 AWS 的一项替代服务,它允许您无需显式分配机器来运行容器即可执行任务;而 ECS 则是一种需要您手动配置多个执行方面的启动类型,属于底层操作。两种启动类型的工作原理和计费方式有所不同,您可以在此处找到更多详细信息。
下一页我们将看到更详细、更深入的配置信息:
- 任务定义名称:您的任务定义名称。必填项。
- 所需兼容性:根据在第一个配置页面中选择的启动类型进行设置。
- 网络模式:设置 ECS 用于启动容器的网络模式。如果使用 Fargate,则只能设置awsvpc模式。如果您不确定这意味着什么,请点击此处查看。
- 任务执行角色:每个任务执行都需要一个角色,以便其能够访问 AWS 生态系统并拥有足够的权限,从而在 AWS 生态系统中正确运行。执行角色可以访问多种不同的权限策略,从而为在其下运行的应用程序提供特定的访问权限。例如,ECS 执行任务的一个常见用例是访问 ECR(以便我们拉取镜像)以及使用 CloudWatch(Amazon 日志和监控服务),这意味着我们需要在角色策略中添加类似“ ecr:BatchGetImage ”和“ logs:PutLogEvents ”的权限。请勿将此与任务角色混淆,任务执行角色封装了授予负责放置任务的 ECS 代理的权限,而不是授予任务本身的权限。有关任务执行角色的详细信息,请参阅此处。
- 任务角色:任务本身需要被赋予的角色。它遵循上述相同的原则,因此,如果您的应用程序需要向 SQS 队列发送消息、与 Redis 集群通信或将数据保存到 RDS 数据库,则需要将所有特定策略设置到自定义任务角色配置中。
- 任务大小:这部分内容非常简单明了,允许您设置运行任务所需的具体内存和 CPU 资源。请注意,如果您尝试在配置低于此处指定值的计算机上运行任务,则任务将无法启动。
- 容器定义:这才是有趣的部分。对于想要包含在同一个任务定义中的每个容器,您都需要按照以下步骤操作。您可以根据需要设置任意数量的容器。
- 容器名称:不言自明。
- 镜像:您将从中拉取应用程序的 ECR 存储库镜像 URL。
- 内存限制:容器的硬性或软性内存限制(MIB)的定义。如果您不了解其含义,请点击链接查看通用知识库。
- 端口映射:如果你的应用程序需要使用特定端口进行任何类型的对外通信,那么你可能需要将主机端口绑定到容器端口。否则,一切都将无法正常工作。
- 健康检查:设置容器健康检查例程,并按特定时间间隔执行。这有助于持续监控容器的健康状况,ECS 也利用此功能来了解应用程序何时真正开始运行。如果您在应用程序中为此定义了特定路由,则您的命令可能类似于:
CMD-SHELL,curl -f http://localhost:port/healthcheck || exit 1 - 环境:允许您设置容器将使用的 CPU 资源数量,配置应用程序正常运行所需的所有环境变量以及其他配置。此外,您还可以将容器设置为“必要”状态,这意味着如果容器因某种原因终止,则整个任务将在短时间内被终止。
- 启动依赖顺序:允许您控制容器的启动顺序和启动时间。并非强制性设置。
- 容器超时:顾名思义,并非强制性设置。
- 网络设置:顾名思义,并非强制性设置,除非您进行了一些高级的网络配置。
- 存储和日志记录:一些高级设置。基本来说,你可能需要配置 CloudWatch Logs,或者直接使用便捷的“自动配置 CloudWatch Logs ”按钮,让亚马逊处理一切。
- 安全性、资源限制和 Docker 标签:高级且特定于上下文的配置。并非强制性配置,本文不做赘述。
就这样。任务定义主页上还列出了一些其他选项,例如 Mesh 和 FireLens 集成,但它们非常具体,对于日常任务定义来说并非必需。您可以跳过其余选项,直接点击“创建”按钮。
正在运行您的任务
解释完这些之后,我们想看看容器化应用程序是否真的能运行,对吧?所以,点击你创建的 ECS 集群,点击底部的“任务”选项卡,然后点击“运行新任务”按钮。
在新屏幕上,选择“ EC2 ”作为启动类型,填写任务定义名称和运行任务的集群名称,然后单击“运行任务”。如果您已t2.micro按照我们的建议进行设置,您的应用程序将立即启动。
您可以在集群的“任务”选项卡中查看任务的所有运行信息。
由于我们没有深入探讨您尝试运行的应用程序类型,因此您需要自行检查应用程序是否正常运行。您可以通过点击任务(在上述“任务”选项卡中),然后在所需配置的容器下查找“在 CloudWatch 中查看日志”来查看应用程序日志。
总结
我们的主要目标是展示如何在亚马逊网络服务上部署容器化应用程序的最简单(但略显冗长)的方法,而无需了解实际可以在那里运行什么。
由于许多更深层次的要点在引言部分并无必要,因此本文省略了它们;此外,还有一些补充性内容(例如服务配置和竞价车队请求)也未提及,但将在后续文章中进行介绍。这些补充内容对于更全面地理解众多 ECS 服务和整体环境至关重要。
欢迎大家继续关注后续文章。如有任何疑问或评论,请在下方评论区留言,我们保证会认真阅读每一条评论。
下次再见,祝您部署顺利!




