创建容器镜像以在 Amazon ECS 上使用
Amazon ECS 在任务定义中使用 Docker 镜像来启动容器。Docker 技术为您提供了在容器中构建、运行、测试和部署分布式应用程序的工具。Docker 提供了有关在 Amazon ECS上部署容器的演练。有关更多信息,请参阅在 Amazon ECS 上部署 Docker 容器
此处概述的步骤的目的是指导您创建第一个 Docker 镜像并将该映像推送到 Amazon ECR(容器注册表),以便在 Amazon ECS 任务定义中使用。此演练假定您已基本了解 Docker 是什么及其工作方式。有关 Docker 的更多信息,请参阅 Docker 是什么?
AWS 和 Docker 合作打造简化的开发人员体验,使您能够直接使用 Docker 工具在 Amazon ECS 上部署和管理容器。现在,您可以使用 Docker Desktop 和 Docker Compose 本地构建和测试容器,然后将它们部署到 Fargate 上的 Amazon ECS。要开始使用Amazon ECS和 Docker 集成,请下载 Docker Desktop 并选择注册 Docker ID。有关更多信息,请参阅 Docker Desktop
先决条件
在您开始之前,确保您满足以下先决条件。
-
确保您已完成 Amazon ECR 设置步骤。有关更多信息,请参阅《Amazon Elastic Container Registry 用户指南》中的设置 Amazon ECR。
-
您的用户具有访问和使用 Amazon ECR 服务所需的 IAM 权限。有关更多信息,请参阅 Amazon ECR 托管策略。
-
您已安装 Docker。有关 Amazon Linux 2 的 Docker 安装步骤,请参阅 在 Amazon Linux 2 上安装 Docker。对于所有其他操作系统,请参阅 Docker 桌面概述
中的 Docker 文档。 -
您已经安装并配置 AWS CLI。有关更多信息,请参阅 AWS Command Line Interface 用户指南中的安装 AWS Command Line Interface。
如果您没有或不需要本地开发环境,并且更喜欢使用 Amazon EC2 实例来使用 Docker,我们将提供以下步骤来使用 Amazon Linux 2 启动 Amazon EC2 实例并安装 Docker Engine 和 Docker CLI。
Docker Desktop 是一款适用于 Mac 或 Windows 环境的易于安装的应用程序,可用于构建和共享容器化应用程序和微服务。Docker Desktop 包括 Docker Engine、Docker CLI 客户端、Docker Compose以及在 Amazon ECS 上使用 Docker 时非常有用的其他工具。有关如何在首选操作系统上安装 Docker Desktop 的更多信息,请参阅 Docker Desktop 概述
在 Amazon EC2 实例上安装 Docker
-
使用 Amazon Linux 2 AMI 启动实例。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的启动实例。
-
使用 SSH 连接到 实例。有关更多信息,请参阅《适用于 Linux 实例的 Amazon EC2 用户指南》中的使用 SSH 连接到 Linux 实例。
-
更新实例上已安装的程序包和程序包缓存。
sudo yum update -y
-
安装最新的 Docker Engine 程序包。
sudo amazon-linux-extras install docker
重要 此步骤假定您正在为实例使用 Amazon Linux 2 AMI。对于所有其他操作系统,请参阅 Docker 桌面概述
。 -
启动 Docker 服务。
sudo service docker start
(可选)为确保 Docker 守护进程在每次系统重启后启动,请运行以下命令:
sudo systemctl enable docker
-
将
ec2-user
添加到docker
组,以便您能够执行 Docker 命令,而无需使用sudo
。sudo usermod -a -G docker ec2-user
-
退出,再重新登录以接受新的
docker
组权限。您可以关闭当前的 SSH 终端窗口并在新终端窗口中重新连接到实例,完成这一过程。您的新 SSH 会话将具有相应的docker
组权限。 -
验证您是否能在没有
sudo
的情况下运行 Docker 命令。docker info
注意 在某些情况下,您可能需要重新启动实例,以便为
ec2-user
提供访问 Docker 进程守护程序的权限。如果您看到以下错误,请尝试重启您的实例:Cannot connect to the Docker daemon. Is the docker daemon running on this host?
创建 Docker 映像
Amazon ECS 任务定义使用 Docker 镜像启动群集中的容器实例上的容器。在本节中,您将创建简单 Web 应用程序的 Docker 镜像,并在本地系统或 Amazon EC2 实例上测试此映像,然后将此映像推送至 Amazon ECR 容器注册表,以便能够在 Amazon ECS 任务定义中使用它。
创建简单 Web 应用程序的 Docker 镜像
-
创建名为
Dockerfile
的文件。Dockerfile 是一个清单文件,描述了用于 Docker 镜像的基本镜像以及要安装的项目以及在此项目上运行的内容。有关 Dockerfile 的更多信息,请转到 Dockerfile 参考。 touch Dockerfile
-
编辑您刚刚创建的
Dockerfile
并添加以下内容。FROM ubuntu:18.04 # Install dependencies RUN apt-get update && \ apt-get -y install apache2 # Install apache and write hello world message RUN echo 'Hello World!' > /var/www/html/index.html # Configure apache RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \ echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \ echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \ echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \ chmod 755 /root/run_apache.sh EXPOSE 80 CMD /root/run_apache.sh
此 Dockerfile 使用 Ubuntu 18.04 镜像。
RUN
指令将更新包缓存,安装一些适用于 Web 服务器的程序包,然后将“Hello World!” 内容写入到 Web 服务器的文档根目录。EXPOSE
指令在容器上公开端口 80,CMD
指令启动 Web 服务器。 -
从您的 Dockerfile 生成 Docker 镜像。
注意 Docker 的某些版本可能需要在以下命令中使用 Dockerfile 完整路径,而不是所示的相对路径。
docker build -t hello-world .
-
运行 docker images 以验证是否已正确创建镜像。
docker images --filter reference=hello-world
输出:
REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest e9ffedc8c286 4 minutes ago 241MB
-
运行新构建的镜像。
-p 80:80
选项将容器上公开的端口 80 映射到主机系统上的端口 80。有关 docker run 的更多信息,请转到 Docker 运行参考。 docker run -t -i -p 80:80 hello-world
注意 来自 Apache Web 服务器的输出将显示在终端窗口中。您可以忽略“
Could not reliably determine the server's fully qualified domain name
”消息。 -
打开浏览器并指向正在运行 Docker 并托管您的容器的服务器。
-
如果您使用的是 EC2 实例,这将是服务器的 Public DNS 值,此值与您用于通过 SSH 连接到实例的地址相同。确保实例的安全组允许端口 80 上的入站流量。
-
如果您正在本地运行 Docker,可将您的浏览器指向 http://localhost/
。 -
如果您正在 Windows 或 Mac 计算机上使用 docker-machine,请使用 docker-machine ip 命令查找托管 Docker 的 VirtualBox VM 的 IP 地址,并将
machine-name
替换为您正在使用的 Docker 计算机的名称。docker-machine ip
machine-name
您应看到一个显示“Hello World!”语句的 网页。
-
-
通过键入 Ctrl + c 来停止 Docker 容器。
将映像推送到 Amazon Elastic Container Registry
Amazon ECR 是一项托管 AWS Docker 注册表服务。您可以使用 Docker CLI 在 Amazon ECR 存储库中推送、拉取和托管映像。有关 Amazon ECR 产品详细信息、特色客户案例研究和常见问题解答,请参阅 Amazon Elastic Container Registry 产品详细信息页面
标记映像并将其推送至 Amazon ECR
-
创建用于存储您的
hello-world
映像的 Amazon ECR 存储库。在输出中记下repositoryUri
。将
region
替换为您的 AWS 区域,例如us-east-1
。aws ecr create-repository --repository-name
hello-repository
--regionregion
输出:
{ "repository": { "registryId": "
aws_account_id
", "repositoryName": "hello-repository", "repositoryArn": "arn:aws:ecr:region
:aws_account_id
:repository/hello-repository", "createdAt": 1505337806.0, "repositoryUri": "aws_account_id
.dkr.ecr.region
.amazonaws.com/hello-repository" } } -
使用上一步中的
repositoryUri
值标记hello-world
映像。docker tag hello-world
aws_account_id
.dkr.ecr.region
.amazonaws.com/hello-repository
-
运行 aws ecr get-login-password 命令。指定要对其进行身份验证的注册表 URI。有关更多信息,请参阅 Amazon Elastic Container Registry 用户指南中的注册表身份验证。
docker login -u AWS -p $(aws ecr get-login-password --region
REGION
)
.dkr.ecr.aws_account_id
REGION
.amazonaws.com输出:
Login Succeeded
重要 如果收到错误,请安装或更新到最新版本的 AWS CLI。有关更多信息,请参阅 AWS Command Line Interface 用户指南中的安装 AWS Command Line Interface。
-
使用上一步中的
repositoryUri
值将映像推送至 Amazon ECR。docker push
aws_account_id
.dkr.ecr.region
.amazonaws.com/hello-repository
清除
要继续创建 Amazon ECS 任务定义并使用容器镜像启动任务,请跳至 后续步骤。完成试验 Amazon ECR 映像后,您可以删除存储库,从而无需为映像存储付费。
aws ecr delete-repository --repository-name
hello-repository
--regionregion
--force
后续步骤
在创建容器镜像并将其推送到 Amazon ECR 后,您应考虑以下后续步骤。