在 AWS Cloud9 中使用 Amazon ECR 服务 - AWS Cloud9

AWS Cloud9 不再向新客户提供。 AWS Cloud9 的现有客户可以继续正常使用该服务。了解更多

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

在 AWS Cloud9 中使用 Amazon ECR 服务

您可以直接从 AWS Cloud9 IDE 中的 AWS Explorer 访问 Amazon Elastic Container Registry(Amazon ECR)服务。您可以使用 Amazon ECR 将程序映像推送到 Amazon ECR 存储库。要开始使用,请执行以下步骤:

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

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

  3. 创建一个位于 Amazon ECR 实例内部的存储库。

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

先决条件

在使用适用于 AWS Cloud9 的 AWS Toolkit 中的 Amazon ECR 功能之前,请确保先满足这些先决条件。这些先决条件已预安装在适用于 AWS Cloud9 Amazon EC2 环境的 AWS Cloud9 IDE 中,并且是访问 Amazon ECR 所必需的。

1. 创建 Dockerfile

Docker 使用名为 Dockerfile 的文件来定义可以推送和存储在远程存储库中的映像。在将映像上载到 ECR 存储库之前,请先创建一个 Dockerfile,然后从该 Dockerfile 构建映像。

创建 Dockerfile
  1. 要导航到要在其中存储 Dockerfile 的目录,请在 AWS Cloud9 IDE 的左侧导航栏中选择 Toggle Tree(切换树)选项。

  2. 创建名为 Dockerfile 的新文件。

    注意

    AWS Cloud9 IDE 可能会提示您选择文件类型或文件扩展名。如果出现这种情况,请选择 plaintext(纯文本)。AWS Cloud9IDE 具有“dockerfile”扩展名。但是,我们建议您不要使用它。这是因为该扩展名可能会导致与某些版本的 Docker 或其他关联应用程序发生冲突。

使用 AWS Cloud9 IDE 编辑 Dockerfile

如果 Dockerfile 具有文件扩展名,请打开该文件的上下文(右键单击)菜单,然后移除文件扩展名。带有扩展名的 Dockerfile 可能会导致与某些版本的 Docker 或其他关联应用程序发生冲突。

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

  1. 直接在 AWS Cloud9 IDE 中打开空的 Dockerfile。

  2. 将以下示例的内容复制到您的 Dockerfile 中。

    例 Dockerfile 映像模板
    FROM ubuntu:22.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 22.04 映像的 Dockerfile。RUN 指令将更新软件包缓存。安装一些适用于 Web 服务器的软件包,然后将“Hello World!” 内容写入到 Web 服务器的文档根目录。EXPOSE 指令在容器上公开端口 80,而 CMD 指令启动 Web 服务器。

  3. 保存您的 Dockerfile。

2. 从您的 Dockerfile 构建映像

您创建的 Dockerfile 包含为程序构建映像所需的信息。在将该映像推送到您的 Amazon ECR 实例之前,请先构建该映像。

从您的 Dockerfile 构建映像
  1. 要导航到包含您的 Dockerfile 的目录,请使用 Docker CLI 或与您的 Docker 实例集成的 CLI。

  2. 要构建在 Dockerfile 中定义的映像,请在与 Dockerfile 相同的目录中运行 Docker build 命令。

    docker build -t hello-world .
  3. 要验证是否已正确创建映像,请运行 Docker images 命令。

    docker images --filter reference=hello-world

    输出如下所示。

    REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest e9ffedc8c286 4 minutes ago 241MB
  4. 要运行基于 Ubuntu 22.04 的新构建映像,请使用 echo 命令。

    注意

    创建或推送映像不需要执行此步骤。但是,您可以看到程序映像在运行时是如何工作的。

    FROM ubuntu:22.04 CMD ["echo", "Hello from Docker in Cloud9"]

    然后,运行并构建 dockerfile。必须从与 dockerfile 相同的目录中运行此命令。

    docker build -t hello-world . docker run --rm hello-world

    输出如下所示。

    Hello from Docker in Cloud9

    有关 Docker run 命令的更多信息,请参阅 Docker 网站上的 Docker Run 参考

3. 创建新的存储库

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

创建新的 Amazon ECR 存储库
  1. 从 AWS Cloud9 IDE 导航栏中,选择 AWS Toolkit 图标

  2. 展开 AWS Explorer 菜单。

  3. 找到与您的 AWS 账户 关联的原定设置 AWS 区域。然后,选择它以查看通过 AWS Cloud9 IDE 提供的服务列表。

  4. 打开 ECR 选项的上下文(右键单击)菜单,以启动 Create new repository(创建新的存储库)过程。然后,选择 Create Repository(创建存储库)。

  5. 要完成该过程,请按照提示操作。

  6. 该过程完成后,您可以从 AWS Explorer 菜单的 ECR 部分访问新存储库。

4. 推送、提取和删除映像

从 Dockerfile 构建映像并创建存储库后,您可以将映像推送到 Amazon ECR 存储库中。此外,将 AWS Explorer 与 Docker 和 AWS CLI 结合使用,您可以执行以下操作:

  • 从存储库中提取映像。

  • 删除存储在存储库中的映像。

  • 删除您的存储库。

使用您的原定设置注册表对 Docker 进行身份验证

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

  1. 在 AWS Cloud9 IDE 中打开终端。

  2. 使用 get-login-password 方法向您的私有 ECR 注册表进行身份验证并输入您的区域和 AWS 账户 ID。

    aws ecr get-login-password \ --region <region> \ | docker login \ --username AWS \ --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
    重要

    在前面的命令中,将 regionAWS_account_id 替换为特定于您的 AWS 账户 的信息。有效的 region 值为 us-east-1

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

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

  1. 使用 docker images 命令查看您本地存储的映像,并确定要标记的映像。

    docker images

    输出如下所示。

    REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest e9ffedc8c286 4 minutes ago 241MB
  2. 使用 Docker tag 命令标记映像。

    docker tag hello-world:latest AWS_account_id.dkr.ecr.region.amazonaws.com/hello-world:latest
  3. 使用 Docker push 命令将标记的映像推送到您的存储库。

    重要

    确保本地存储库的名称与 AWS Amazon EC2 存储库的名称相同。在此示例中,这两个存储库必须称为 hello-world。有关使用 docker 推送映像的更多信息,请参阅推送 Docker 映像

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

    输出如下所示。

    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 Explorer 选项卡中选择 Refresh Explorer(刷新 Explorer)来刷新 AWS Toolkit。然后,它将显示在 AWS Cloud9 IDE 的 AWS Explorer 菜单中。

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

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

    输出如下所示。

    azonaws.com/hello-world:latest latest: Pulling from hello-world Digest: sha256:e02c521fd65eae4ef1acb746883df48de85d55fc85a4172a09a124b11b339f5e Status: Image is up to date for 922327013870.dkr.ecr.us-west-2.amazonaws.com/hello-world.latest
从 Amazon ECR 存储库中删除映像

从 AWS Cloud9 IDE 中删除映像有两种方法。第一种方法是使用 AWS Explorer。

  1. 在 AWS Explorer 中,展开 ECR 菜单。

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

  3. 打开与要删除的映像关联的映像标签的上下文(右键单击)菜单。

  4. 要删除与该标签关联的所有存储的映像,请选择 Delete Tag...(删除标签...)。

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

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

    输出如下所示。

    { "failures": [], "imageIds": [ { "imageTag": "latest", "imageDigest": "sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636b95aed25f52c89b" } ] }
从 Amazon ECR 实例中删除存储库

从 AWS Cloud9 IDE 中删除资源库有两种方法。第一种方法是使用 AWS Explorer:

  1. 在 AWS Explorer 中,展开 ECR 菜单。

  2. 打开要删除的存储库的上下文(右键单击)菜单。

  3. 选择 Delete Repository...(删除存储库...)。

从 AWS CLI 中删除 Amazon ECR 存储库
  • 您可以使用 AWS ecr delete-repository 命令删除存储库。

    注意

    通常,如果不先删除存储库中包含的映像,则无法删除存储库。但是,如果添加 --force 标志,则可以一步删除存储库及其所有映像。

    aws ecr delete-repository \ --repository-name hello-world \ --force

    输出如下所示。

    --repository-name hello-world --force { "repository": { "repositoryUri": "922327013870.dkr.ecr.us-west-2.amazonaws.com/hello-world", "registryId": "922327013870", "imageTagMutability": "MUTABLE", "repositoryArn": "arn:aws:ecr:us-west-2:922327013870:repository/hello-world", "repositoryName": "hello-world", "createdAt": 1664469874.0 } }