

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 Amazon ECR 中移动映像的整个生命周期
<a name="getting-started-cli"></a>

如果您是首次使用 Amazon ECR，请在 Docker CLI 和中使用以下步骤 AWS CLI 来创建示例映像、向默认注册表进行身份验证并创建私有存储库。然后将映像推送到私有存储库并从中提取映像。完成示例映像后，删除示例映像和存储库。

要使用代 AWS 管理控制台 替 AWS CLI，请参阅[创建 Amazon ECR 私有存储库以存储映像](repository-create.md)。

有关可用于管理 AWS 资源的其他工具（包括不同 AWS SDKs的 IDE 工具包和 Windows PowerShell 命令行工具）的更多信息，请参阅 [http://aws.amazon.com/tools/](https://aws.amazon.com/tools/)。

## 先决条件
<a name="getting-started-cli-prereqs"></a>

如果您尚未安装最新版本 AWS CLI 和 Docker，也未准备就绪，请按照以下步骤安装这两个工具。

### 安装 AWS CLI
<a name="cli-install"></a>

要将 Amazon ECR AWS CLI 与 Amazon ECR 一起使用，请安装最新 AWS CLI 版本。有关信息，请参阅《AWS Command Line Interface 用户指南》**中的[安装 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。

### 安装 Docker
<a name="cli-install-docker"></a>

Docker 适用于许多不同的操作系统，包括大多数现代 Linux 分发版 (如 Ubuntu) 甚至 MacOS 和 Windows。有关如何在特定的操作系统上安装 Docker 的更多信息，请转到 [Docker 安装指南](https://docs.docker.com/engine/installation/#installation)。

您无需本地开发系统即可使用 Docker。如果您已在使用 Amazon EC2，则可启动 Amazon Linux 2023 实例并安装 Docker 以开始使用。

如果您已安装 Docker，请跳到[步骤 1：创建 Docker 镜像](#cli-create-image)。

**使用 Amazon Linux 2023 AMI 在 Amazon EC2 实例上安装 Docker**

1. 使用最新版 Amazon Linux 2023 AMI 启动实例。有关更多信息，请参阅《Amazon EC2 用户指南》中的[启动实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/launching-instance.html)**。

1. 连接到您的实例。有关更多信息，请参阅《Amazon EC2 用户指南》中的[连接到 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html)**。

1. 更新实例上已安装的程序包和程序包缓存。

   ```
   sudo yum update -y
   ```

1. 安装最新的 Docker Community Edition 程序包。

   ```
   sudo yum install docker
   ```

1. 启动 Docker 服务。

   ```
   sudo service docker start
   ```

1. 将 `ec2-user` 添加到 `docker` 组，以便您能够执行 Docker 命令，而无需使用 `sudo`。

   ```
   sudo usermod -a -G docker ec2-user
   ```

1. 退出，再重新登录以接受新的 `docker` 组权限。您可以关闭当前的 SSH 终端窗口并在新终端窗口中重新连接到实例，完成这一过程。您的新 SSH 会话将具有相应的 `docker` 组权限。

1. 验证 `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 镜像
<a name="cli-create-image"></a>

在本步骤中，您将创建简单 Web 应用程序的 Docker 映像，并在本地系统或 Amazon EC2 实例上测试此映像。

**创建简单 Web 应用程序的 Docker 映像**

1. 创建名为 `Dockerfile` 的文件。Dockerfile 是一个清单文件，描述了用于 Docker 映像的基本映像以及要安装的项目以及在此项目上运行的内容。有关 Dockerfile 的更多信息，请转到 [Dockerfile 参考](https://docs.docker.com/engine/reference/builder/)。

   ```
   touch Dockerfile
   ```

1. 编辑您刚刚创建的 `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\$1” 内容写入 Web 服务器的文档根目录。`EXPOSE` 指令在容器上公开端口 80，`CMD` 指令启动 Web 服务器。

1. <a name="sample-docker-build-step"></a>从您的 Dockerfile 生成 Docker 镜像。
**注意**  
Docker 的某些版本可能需要在以下命令中使用 Dockerfile 完整路径，而不是所示的相对路径。

   ```
   docker build -t hello-world .
   ```

1. 列出容器映像。

   ```
   docker images --filter reference=hello-world
   ```

   输出：

   ```
   REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
   hello-world         latest              e9ffedc8c286        4 minutes ago       194MB
   ```

1. 运行新构建的映像。`-p 80:80` 选项将容器上公开的端口 80 映射到主机系统上的端口 80。有关 **docker run** 的更多信息，请转到 [Docker 运行参考](https://docs.docker.com/engine/reference/run/)。

   ```
   docker run -t -i -p 80:80 hello-world
   ```
**注意**  
来自 Apache Web 服务器的输出将显示在终端窗口中。您可以忽略“`Could not reliably determine the fully qualified domain name`”消息。

1. 打开浏览器并指向正在运行 Docker 并托管您的容器的服务器。
   + 如果您使用的是 EC2 实例，这将是服务器的 **Public DNS** 值，此值与您用于通过 SSH 连接到实例的地址相同。确保实例的安全组允许端口 80 上的入站流量。
   + 如果您正在本地运行 Docker，可将您的浏览器指向 [http://localhost/](http://localhost/)。
   + 如果你在 Windows 或 Mac 计算机**docker-machine**上使用，请使用**docker-machine ip**命令查找托管 Docker 的 VirtualBox 虚拟机的 IP 地址，替换为你正在*machine-name*使用的 docker 计算机的名称。

     ```
     docker-machine ip machine-name
     ```

   您应看到一个显示“Hello World\$1”语句的 网页。

1. 通过键入 **Ctrl \$1 c** 来停止 Docker 容器。

## 步骤 2：创建存储库
<a name="cli-create-repository"></a>

现在您已拥有可推送到 Amazon ECR 的镜像，还必须创建一个存储库来保存它。在本示例中，您创建一个名称为 `hello-repository` 的存储库，稍后将推送 `hello-world:latest` 镜像到这里。要创建存储库，请运行以下命令：

```
aws ecr create-repository \
    --repository-name hello-repository \
    --region region
```

## 步骤 3：向您的默认注册表验证身份
<a name="cli-authenticate-registry"></a>

安装并配置完毕后 AWS CLI，请使用默认注册表对 Docker CLI 进行身份验证。这样一来，**docker** 命令可以通过 Amazon ECR 推送和提取镜像。 AWS CLI 提供了简化身份验证过程的**get-login-password**命令。

要使用向 Amazon ECR 注册表对 Docker 进行身份验证 get-login-password，请运行命令。**aws ecr get-login-password**将身份验证令牌传递给 **docker login** 命令时，将值 `AWS` 用作用户名，并指定要对其进行身份验证的 Amazon ECR 注册表 URI。如果对多个注册表进行身份验证，则必须针对每个注册表重复该命令。
**重要**  
如果收到错误，请安装或更新到最新版本的 AWS CLI。有关更多信息，请参阅《AWS Command Line Interface 用户指南》**中的[安装 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。
+ [get-login-password](https://docs.aws.amazon.com/cli/latest/reference/ecr/get-login-password.html) (AWS CLI)

  ```
  aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
  ```
+ [Get-ECRLogin 命令](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-ECRLoginCommand.html) (AWS Tools for Windows PowerShell)

  ```
  (Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
  ```

## 步骤 4：推送镜像到 Amazon ECR
<a name="cli-push-image"></a>

现在您可以推送镜像到上一部分中创建的 Amazon ECR 存储库。在满足以下先决条件后，使用 **docker** CLI 推送映像：
+ 安装最低版本的 **docker**：1.7。
+ 已使用 **docker login** 配置 Amazon ECR 授权令牌。
+ Amazon ECR 存储库存在且用户有向该存储库推送的权限。

在满足这些先决条件后，即可将镜像推送到您在帐户的默认注册表中新创建的存储库中。

**标记镜像并推送到 Amazon ECR**

1. 列出您存储在本地的镜像，以识别要标记和推送的镜像。

   ```
   docker images
   ```

   输出：

   ```
   REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
   hello-world         latest              e9ffedc8c286        4 minutes ago       241MB
   ```

1. 标记镜像并推送到存储库。

   ```
   docker tag hello-world:latest aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository
   ```

1. 推送镜像。

   ```
   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 提取镜像
<a name="cli-pull-image"></a>

在推送映像到 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 for aws_account_id.dkr.region.amazonaws.com/hello-repository:latest
```

## 步骤 6：删除镜像
<a name="cli-delete-image"></a>

如果您不再需要一个存储库中的某个映像，则可以删除该映像。要删除映像，请指定它所在的存储库，并指定映像的 `imageTag` 或 `imageDigest` 值。以下示例删除 `hello-repository` 存储库中映像标签为 `latest` 的映像。要从存储库中删除示例映像，请运行以下命令：

```
aws ecr batch-delete-image \
      --repository-name hello-repository \
      --image-ids imageTag=latest \
      --region region
```

## 步骤 7：删除存储库
<a name="cli-delete-repository"></a>

如果您不再需要整个映像存储库，您可以删除该存储库。以下示例使用 `--force` 标签删除包含映像的存储库。要删除包含映像的存储库 (及其中的所有映像)，请运行以下命令：

```
aws ecr delete-repository \
      --repository-name hello-repository \
      --force \
      --region region
```