

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

# 使用 Amazon Elastic Container Registry
<a name="ecr-working"></a>

您可以在 VS Code 中直接从 AWS Explorer 访问亚马逊弹性容器注册表 (Amazon ECR) Registry 服务，然后使用它将程序映像推送到亚马逊 ECR 存储库。要开始使用，您需要执行以下步骤：

1. 创建一个 Dockerfile，其中包含构建映像所需的信息。

1. 从该 Dockerfile 生成映像并标记该映像以供处理。

1. 在 Amazon ECR 实例内创建一个存储库。

1. 将标记的映像推送到此存储库。

## 先决条件
<a name="prereqs-awstoolkit-vscode-ecr"></a>

要通过 VS Code Explorer 中访问 Amazon ECR 服务，您需要完成下面这些步骤。

### 创建 IAM 用户
<a name="create-an-iam-user"></a>

在访问某项 AWS 服务（例如 Amazon ECR）之前，您必须提供凭证。这样，相应服务便可以确定您是否有权访问其资源。我们不建议您 AWS 直接通过根 AWS 账户的证书进行访问。而是使用 AWS Identity and Access Management (IAM) 创建 IAM 用户，然后将该用户添加到具有管理权限的 IAM 群组。然后，您可以使用特殊的 URL 和 IAM 用户的证书进行访问 AWS 。

如果您已注册 AWS 但没有为自己创建 IAM 用户，则可以使用 IAM 控制台创建一个。

要创建管理员用户，请选择以下选项之一。


****  

| 选择一种方法来管理您的管理员 | 目标 | 方式 | 您也可以 | 
| --- | --- | --- | --- | 
| 在 IAM Identity Center 中 （推荐） | 使用短期凭证访问 AWS。这符合安全最佳实操。有关最佳实践的信息，请参阅《IAM 用户指南》**中的 [IAM 中的安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)。 | 有关说明，请参阅《AWS IAM Identity Center 用户指南》中的[入门](https://docs.aws.amazon.com//singlesignon/latest/userguide/getting-started.html)。 | 通过在《AWS Command Line Interface 用户指南[》 AWS IAM Identity Center中配置 AWS CLI 要使用的来](https://docs.aws.amazon.com//cli/latest/userguide/cli-configure-sso.html)配置编程访问权限。 | 
| 在 IAM 中 （不推荐使用） | 使用长期凭证访问 AWS。 | 按照《IAM 用户指南》中的[创建用于紧急访问的 IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started-emergency-iam-user.html)中的说明进行操作。 | 按照《IAM 用户指南》中的[管理 IAM 用户的访问密钥](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_credentials_access-keys.html)，配置编程式访问。 | 

要以此新 IAM 用户的身份登录，请退出 AWS 控制台，然后使用以下 URL。在以下 URL 中，y *our\_aws\_account\_id 是没有连字符的 AWS 账号（例如，如果您的 AWS 账号是，则您的账户 ID* 是）：`1234-5678-9012` AWS `123456789012`

```
https://{{your_aws_account_id}}.signin.aws.amazon.com/console/
```

输入您刚创建的 IAM 用户名和密码。登录后，导航栏显示“*your\_user\_name* @ *your\_aws\_account\_id*”。

如果您不希望登录页面的 URL 包含您的 AWS 账户 ID，则可以创建账户别名。从 IAM 控制面板中，选择**自定义**，然后输入**账户别名**。账户别名可以是您的公司名称。有关更多信息，请参阅 IAM 用户指南中的[您的 AWS 账户 ID 及其别名](https://docs.aws.amazon.com/IAM/latest/UserGuide/console_account-alias.html)。

要在创建账户别名后登录，请使用以下 URL：

```
https://{{your_account_alias}}.signin.aws.amazon.com/console/
```

要为您的账户验证 IAM 用户的登录链接，请打开 IAM 控制台并在控制面板的 **IAM 用户登录链接**下进行检查。

有关 IAM 的更多信息，请参阅 [AWS Identity and Access Management 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/)。

### 安装和配置 Docker
<a name="create-an-iam-user"></a>

您可以通过从[安装 Docker 引擎](https://docs.docker.com/engine/install/)用户指南中选择首选操作系统，并按照说明来安装和配置 Docker。

### 安装和配置 AWS CLI 版本 2
<a name="create-an-iam-user"></a>

通过从安装、[更新和卸载 AWS CLI 版本 2 用户指南中选择您的首选操作系统来安装和配置 AWS CLI 版本 2](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。

## 1. 创建 Dockerfile
<a name="dockerfile-ecr-vsctoolkit"></a>

Docker 使用名为“Dockerfil”的文件来定义可以推送和存储在远程存储库中的映像。您必须先创建 Dockerfile，然后通过该 Dockerfile 构建映像，然后才能将映像上传到 ECR 存储库。

**创建 Dockerfile**

1. 使用 Toolkit for VS Code 资源管理器导航至要将 Dockerfile 存储到的目录。

1. 创建一个名为 **Dockerfile** 的新文件。
**注意**  
VS Code 可能会提示您选择文件类型或文件扩展名。如果出现该提示，请选择**纯文本**。Vs Code 具有“dockerfile”扩展名。但是，我们建议您不要使用它。这是因为该扩展名可能会导致与某些版本的 Docker 或其他关联应用程序发生冲突。

**使用 VS Code 编辑 Dockerfile**

如果 Dockerfile 具有文件扩展名，请打开该文件的上下文（右键单击）菜单，然后移除文件扩展名。

从 Dockerfile 中删除文件扩展名后：

1. 直接在 VS Code 中打开空的 Dockerfile。

1. 将以下示例的内容复制到您的 Dockerfile 中：  
**Example 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
   ```

   这是使用 Ubuntu 18.04 映像的 Dockerfile。**RUN** 指令将更新软件包缓存。安装一些适用于 Web 服务器的软件包，然后将“Hello World\!” 内容写入到 Web 服务器的文档根目录。**EXPOSE** 指令在容器上公开端口 80，而 **CMD** 指令启动 Web 服务器。

1. 保存您的 Dockerfile。
**重要**  
确保您的 Dockerfile 名称上没有附加扩展名。带有扩展名的 Dockerfile 可能会导致与某些版本的 Docker 或其他关联应用程序发生冲突。

## 2. 通过 Dockerfile 构建映像
<a name="build-docker-image"></a>

您创建的 Dockerfile 包含为程序构建映像所需的信息。您必须先构建映像，然后才能将该映像推送到 Amazon ECR 实例。

**通过 Dockerfile 构建映像**

1. 要导航到包含您的 Dockerfile 的目录，请使用 Docker CLI 或与您的 Docker 实例集成的 CLI。

1. 要构建在 Dockerfile 中定义的映像，请运行 **Docker build** 命令。

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

1. 要验证是否已正确创建映像，请运行 **Docker images** 命令。

   ```
   docker images --filter reference=hello-world
   ```  
**Example 输出示例：**  

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

1. 
**注意**  
创建或推送映像无需执行此步骤，但是您可以看到程序映像在运行时的工作情况。

   要运行新构建的映像，请使用 **Docker run** 命令。

   ```
   docker run -t -i -p 80:80 hello-world
   ```

   前面示例中指定的 **-p** 选项将容器上暴露的**端口 80** 映射到主机系统的**端口 80**。如果您正在本地运行 Docker，可使用 Web 浏览器导航至 [http://localhost:80](http://localhost:80)。如果程序运行正常，系统将显示 “Hello World\!”语句。

   有关 **Docker run** 命令的更多信息，请参阅 Docker 网站上的 [Docker Run 参考](https://docs.docker.com/engine/reference/run/)。

## 3. 创建新存储库
<a name="create-repository"></a>

要将您的映像上载到您的 Amazon ECR 实例，请创建一个新的存储库来存储它。

**创建新的 Amazon ECR 存储库**

1. 从 VS Code **活动栏**中，选择 **AWS Toolkit 图标**。

1. 展开 “** AWS 资源管理器**” 菜单。

1. 找到与您的 AWS 账户关联的默认 AWS 区域。然后，选择它以查看通过 Toolkit for VS Cod 提供的服务列表。

1. 选择 **ECR \+** 选项以开始**创建新存储库**流程。

1. 要完成该流程，请按照提示操作。

1. 完成后，您可以从 AWS 资源管理器菜单的 **ECR** 部分访问您的新存储库。

## 4. 推送、拉取和删除映像
<a name="push-image"></a>

从 Dockerfile 构建映像并创建存储库后，您可以将映像推送到 Amazon ECR 存储库中。此外，使用带有 Docker 和 AWS CLI 的 AWS 资源管理器可以执行以下操作：
+ 从存储库中提取映像。
+ 删除存储在存储库中的映像。
+ 删除存储库。

**使用默认存储库对 Docker 进行身份验证**

在 Amazon ECR 实例和 Docker 实例之间交换数据要求进行身份验证。使用注册表对 Docker 进行身份验证：

1. 打开连接到您的 AWS CLI 实例的命令行操作系统。

1. 使用该**get-login-password**方法向您的私有 ECR 注册表进行身份验证。

   ```
   aws ecr get-login-password --region region | docker login --username AWS --password-stdin AWS_account_id.dkr.ecr.region.amazonaws.com
   ```
**重要**  
在上述命令中，您必须将 **region** 和 **AWS\_account\_id** 更新为您的 AWS 账户的特定信息。

**标记映像并将其推送到存储库**

使用您的实例对 Docker 进行身份验证后 AWS，将映像推送到您的存储库。

1. 使用 **Docker images** 命令查看您在本地存储的映像，并识别要标记的映像。

   ```
   docker images
   ```  
**Example 输出示例：**  

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

1. 使用 **Docker tag** 命令标记映像。

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

1. 使用 **Docker tag** 命令将标记的映像推送到您的存储库。

   ```
   docker push AWS_account_id.dkr.ecr.region.amazonaws.com/hello-world:latest
   ```  
**Example 输出示例：**  

   ```
   The push refers to a repository [AWS_account_id.dkr.ecr.region.amazonaws.com/hello-world] (len: 1)
   e9ae3c220b23: Pushed
   a6785352b25c: Pushed
   0998bf8fb9e9: Pushed
   0a85502c06c9: Pushed
   latest: digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636b95aed25f52c89b size: 6774
   ```

将带标签的图像成功上传到存储库后，它就会显示在 AWS 资源管理器菜单中。

**从 Amazon ECR 拉取映像**
+ 您可以将映像拉取到您的 **Docker tag** 命令的本地实例。

  ```
  docker pull AWS_account_id.dkr.ecr.region.amazonaws.com/hello-world:latest
  ```  
**Example 输出示例：**  

  ```
  The push refers to a repository [AWS_account_id.dkr.ecr.region.amazonaws.com/hello-world] (len: 1)
  e9ae3c220b23: Pushed
  a6785352b25c: Pushed
  0998bf8fb9e9: Pushed
  0a85502c06c9: Pushed
  latest: digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636b95aed25f52c89b size: 6774
  ```

**从 Amazon ECR 存储库中删除映像**

从 VS Code 中删除映像的方法有两种。第一种方法是使用 AWS 资源管理器。

1. 在 AWS 资源管理器中，展开 **ECR 菜单**

1. 展开要从中删除映像的存储库

1. 打开上下文菜单（右键单击），选择与您想要删除的映像关联的映像标签

1. 要删除与该标签关联的所有存储的映像，请选择**删除标签…**

**使用 AWS CLI 删除镜像**
+ 您也可以使用 **AWS ecr batch-delete-image** 命令从存储库中删除图像。

  ```
  AWS ecr batch-delete-image \
        --repository-name hello-world \
        --image-ids imageTag=latest
  ```  
**Example 输出示例：**  

  ```
  {
      "failures": [],
      "imageIds": [
          {
              "imageTag": "latest",
              "imageDigest": "sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636b95aed25f52c89b"
          }
      ]
  }
  ```

**从 Amazon ECR 实例中删除存储库**

从 VS Code 中删除存储库的方法有两种。第一种方法是使用 AWS 资源管理器。

1. 在 AWS 资源管理器中，展开 **ECR 菜单**

1. 打开上下文（右键单击）菜单，选择您要删除的存储库

1. 选择**删除存储库…**选项，以选择相应存储库

**从 CLI 中删除 Amazon ECR 存储库 AWS**
+ 您可以使用 **AWS ecr delete-repository** 命令删除存储库。
**注意**  
默认情况下，您不能删除包含映像的存储库。但是，**--force** 标记允许这样做。

  ```
   AWS ecr delete-repository \
        --repository-name hello-world \
        --force
  ```  
**Example 输出示例：**  

  ```
  {
      "failures": [],
      "imageIds": [
          {
              "imageTag": "latest",
              "imageDigest": "sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636b95aed25f52c89b"
          }
      ]
  }
  ```