在 Amazon ECR 中移动映像的整个生命周期
如果您是首次使用 Amazon ECR,则请使用 Docker CLI 和 Amazon CLI 通过以下步骤创建示例映像、向默认注册表进行身份验证并创建私有存储库。然后将映像推送到私有存储库并从中提取映像。完成示例映像后,删除示例映像和存储库。
要使用 Amazon Web Services Management Console 而不是 Amazon CLI,请参阅创建 Amazon ECR 私有存储库以存储映像。
有关可用于管理 Amazon 资源的其他工具的更多信息,包括不同的 Amazon 开发工具包、IDE 工具包和 Windows PowerShell 命令行工具,请参阅 http://aws.amazon.com/tools/
先决条件
如果您未安装最新 Amazon CLI 和 Docker 并且未准备好使用,请使用以下步骤来安装这两个工具。
安装 Amazon CLI
要对 Amazon ECR 使用 Amazon CLI,请安装最新版本的 Amazon CLI。有关信息,请参阅《Amazon Command Line Interface 用户指南》中的安装 Amazon Command Line Interface。
安装 Docker
Docker 适用于许多不同的操作系统,包括大多数现代 Linux 分发版 (如 Ubuntu) 甚至 MacOS 和 Windows。有关如何在特定的操作系统上安装 Docker 的更多信息,请转到 Docker 安装指南
您无需本地开发系统即可使用 Docker。如果您已在使用 Amazon EC2,则可启动 Amazon Linux 2023 实例并安装 Docker 以开始使用。
如果您已安装 Docker,请跳到步骤 1:创建 Docker 镜像。
使用 Amazon Linux 2023 AMI 在 Amazon EC2 实例上安装 Docker
-
使用最新版 Amazon Linux 2023 AMI 启动实例。有关更多信息,请参阅《Amazon EC2 用户指南》中的启动实例。
-
连接到您的实例。有关更多信息,请参阅《Amazon EC2 用户指南》中的连接到 Linux 实例。
-
更新实例上已安装的程序包和程序包缓存。
sudo yum update -y
-
安装最新的 Docker Community Edition 程序包。
sudo yum install docker
-
启动 Docker 服务。
sudo service docker start
-
将
ec2-user
添加到docker
组,以便您能够执行 Docker 命令,而无需使用sudo
。sudo usermod -a -G docker ec2-user
-
退出,再重新登录以接受新的
docker
组权限。您可以关闭当前的 SSH 终端窗口并在新终端窗口中重新连接到实例,完成这一过程。您的新 SSH 会话将具有相应的docker
组权限。 -
验证
ec2-user
是否能在没有sudo
的情况下运行 Docker 命令。docker info
注意
在某些情况下,您可能需要重新启动实例,以便为
ec2-user
提供访问 Docker 进程守护程序的权限。如果您看到以下错误,请尝试重启您的实例:Cannot connect to the Docker daemon. Is the docker daemon running on this host?
步骤 1:创建 Docker 镜像
在本步骤中,您将创建简单 Web 应用程序的 Docker 映像,并在本地系统或 Amazon EC2 实例上测试此映像。
创建简单 Web 应用程序的 Docker 镜像
-
创建名为
Dockerfile
的文件。Dockerfile 是一个清单文件,描述了用于 Docker 镜像的基本镜像以及要安装的项目以及在此项目上运行的内容。有关 Dockerfile 的更多信息,请转到 Dockerfile 参考。 touch Dockerfile
-
编辑您刚刚创建的
Dockerfile
并添加以下内容。FROM public.ecr.aws/amazonlinux/amazonlinux:latest # Install dependencies RUN yum update -y && \ yum install -y httpd # Install apache and write hello world message RUN echo 'Hello World!' > /var/www/html/index.html # Configure apache RUN echo 'mkdir -p /var/run/httpd' >> /root/run_apache.sh && \ echo 'mkdir -p /var/lock/httpd' >> /root/run_apache.sh && \ echo '/usr/sbin/httpd -D FOREGROUND' >> /root/run_apache.sh && \ chmod 755 /root/run_apache.sh EXPOSE 80 CMD /root/run_apache.sh
此 Dockerfile 使用 Amazon ECR Public 上托管的 Amazon Linux 2 公有映像。
RUN
指令更新包缓存,安装一些适用于 Web 服务器的软件包,然后将“Hello World!” 内容写入 Web 服务器的文档根目录。EXPOSE
指令在容器上公开端口 80,CMD
指令启动 Web 服务器。 -
从您的 Dockerfile 生成 Docker 镜像。
注意
Docker 的某些版本可能需要在以下命令中使用 Dockerfile 完整路径,而不是所示的相对路径。
docker build -t hello-world .
-
列出容器映像。
docker images --filter reference=hello-world
输出:
REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest e9ffedc8c286 4 minutes ago 194MB
-
运行新构建的镜像。
-p 80:80
选项将容器上公开的端口 80 映射到主机系统上的端口 80。有关 docker run 的更多信息,请转到 Docker 运行参考。 docker run -t -i -p 80:80 hello-world
注意
来自 Apache Web 服务器的输出将显示在终端窗口中。您可以忽略“
Could not reliably determine the 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 容器。
步骤 2:创建存储库
现在您已拥有可推送到 Amazon ECR 的镜像,还必须创建一个存储库来保存它。在本示例中,您创建一个名称为 hello-repository
的存储库,稍后将推送 hello-world:latest
镜像到这里。要创建存储库,请运行以下命令:
aws ecr create-repository \ --repository-name
hello-repository
\ --regionregion
步骤 3:向您的默认注册表验证身份
安装并配置 Amazon CLI 后,向默认注册表验证 Docker CLI 的身份。这样一来,docker 命令可以通过 Amazon ECR 推送和提取镜像。Amazon CLI 提供 get-login-password 命令来简化身份验证过程。
要使用 get-login-password 针对 Amazon ECR 注册表验证 Docker,请运行 aws ecr get-login-password 命令。将身份验证令牌传递给 docker login 命令时,将值 AWS
用作用户名,并指定要对其进行身份验证的 Amazon ECR 注册表 URI。如果对多个注册表进行身份验证,则必须针对每个注册表重复该命令。
重要
如果收到错误,请安装或更新到最新版本的 Amazon CLI。有关更多信息,请参阅Amazon Command Line Interface《用户指南》中的安装 Amazon Command Line Interface。
-
get-login-password (Amazon CLI)
aws ecr get-login-password --region
region
| docker login --username AWS --password-stdin
.dkr.ecr.aws_account_id
region
.amazonaws.com -
Get-ECRLoginCommand (Amazon Tools for Windows PowerShell)
(Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin
.dkr.ecr.aws_account_id
region
.amazonaws.com
步骤 4:推送镜像到 Amazon ECR
现在您可以推送镜像到上一部分中创建的 Amazon ECR 存储库。在满足以下先决条件后,使用 docker CLI 推送映像:
-
安装最低版本的 docker:1.7。
-
已使用 docker login 配置 Amazon ECR 授权令牌。
-
Amazon ECR 存储库存在且用户有向该存储库推送的权限。
在满足这些先决条件后,即可将镜像推送到您在帐户的默认注册表中新创建的存储库中。
标记镜像并推送到 Amazon ECR
-
列出您存储在本地的镜像,以识别要标记和推送的镜像。
docker images
输出:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE hello-world latest e9ffedc8c286 4 minutes ago 241MB
-
标记镜像并推送到存储库。
docker tag hello-world:latest
aws_account_id
.dkr.ecr.region
.amazonaws.com/hello-repository -
推送镜像。
docker push
aws_account_id
.dkr.ecr.region
.amazonaws.com/hello-repository:latest输出:
The push refers to a repository [
aws_account_id
.dkr.ecr.region
.amazonaws.com/hello-repository] (len: 1) e9ae3c220b23: Pushed a6785352b25c: Pushed 0998bf8fb9e9: Pushed 0a85502c06c9: Pushed latest: digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636EXAMPLE size: 6774
步骤 5:从 Amazon ECR 提取镜像
在推送映像到 Amazon ECR 存储库后,可以从其他位置提取该映像。在满足以下先决条件后,使用 docker CLI 提取映像:
-
安装最低版本的 docker:1.7。
-
已使用 docker login 配置 Amazon ECR 授权令牌。
-
Amazon ECR 存储库存在且用户有从该存储库提取的权限。
在满足这些先决条件后,即可提取您的镜像。要从 Amazon ECR 提取示例镜像,请运行以下命令:
docker pull
aws_account_id
.dkr.ecr.region
.amazonaws.com/hello-repository:latest
输出:
latest: Pulling from hello-repository 0a85502c06c9: Pull complete 0998bf8fb9e9: Pull complete a6785352b25c: Pull complete e9ae3c220b23: Pull complete Digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636EXAMPLE Status: Downloaded newer image foraws_account_id
.dkr.region
.amazonaws.com/hello-repository:latest
步骤 6:删除镜像
如果您不再需要一个存储库中的某个映像,则可以删除该映像。要删除映像,请指定它所在的存储库,并指定映像的 imageTag
或 imageDigest
值。以下示例删除 hello-repository
存储库中映像标签为 latest
的映像。要从存储库中删除示例映像,请运行以下命令:
aws ecr batch-delete-image \ --repository-name hello-repository \ --image-ids imageTag=latest \ --region
region
步骤 7:删除存储库
如果您不再需要整个映像存储库,您可以删除该存储库。以下示例使用 --force
标签删除包含映像的存储库。要删除包含映像的存储库 (及其中的所有映像),请运行以下命令:
aws ecr delete-repository \ --repository-name hello-repository \ --force \ --region
region