通过 AWS CLI 开始使用 Amazon ECR - Amazon ECR
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

通过 AWS CLI 开始使用 Amazon ECR

以下步骤将指导您完成首次使用 Docker CLI 和 AWS CLI 将容器映像推送到 Amazon ECR 所需的步骤。

有关可用于管理 AWS 资源的其他工具的更多信息,包括不同的 AWS 开发工具包、IDE 工具包和 Windows PowerShell 命令行工具,请参阅 http://www.amazonaws.cn/tools/

先决条件

开始之前,请确保您已完成使用 Amazon ECR 进行设置中的步骤。

如果您尚未安装最新 AWS CLI 和 Docker 并且未准备好使用,请使用以下步骤来安装这两个工具。

安装 AWS CLI

可以使用 AWS 命令行工具,在系统的命令行中发出命令来执行 Amazon ECR 和其他 AWS 任务。与使用控制台相比,此方法更快、更方便。命令行工具也非常适用于构建执行 AWS 任务的脚本。

要在 Amazon ECR 中使用 AWS CLI,请安装最新的 AWS CLI 版本(AWS CLI 中从 1.9.15 版本开始提供 Amazon ECR 功能)。可以使用 aws --version 命令查看 AWS CLI 版本。有关安装 AWS CLI 或升级到最新版本的信息,请参阅 AWS Command Line Interface 用户指南 中的安装 AWS CLI 版本 2

安装 Docker

Docker 适用于许多不同的操作系统,包括大多数现代 Linux 分发版 (如 Ubuntu) 甚至 Mac OSX 和 Windows。有关如何在特定的操作系统上安装 Docker 的更多信息,请转到 Docker 安装指南

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

如果您已安装 Docker,请跳到步骤 1:创建 Docker 映像

在 Amazon EC2 实例上安装 Docker

  1. 使用 Amazon Linux 2 AMI 启动实例。有关更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的启动实例

  2. 连接到您的实例。有关更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的连接到您的 Linux 实例

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

    sudo yum update -y
  4. 安装最新的 Docker Community Edition 程序包。

    sudo amazon-linux-extras install docker
  5. 启动 Docker 服务。

    sudo service docker start
  6. ec2-user 添加到 docker 组,以便您能够执行 Docker 命令,而无需使用 sudo

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

  8. 验证 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 映像,并在本地系统或 EC2 实例上测试此映像,然后将此映像推送至容器注册表(如 Amazon ECR 或 Docker Hub),以便能够在 ECS 任务定义中使用它。

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

  1. 创建名为 Dockerfile 的文件。Dockerfile 是一个清单文件,描述了用于 Docker 映像的基本映像以及要安装的项目以及在此项目上运行的内容。有关 Dockerfile 的更多信息,请转到 Dockerfile 参考

    touch Dockerfile
  2. 编辑您刚刚创建的 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 服务器。

  3. 从您的 Dockerfile 生成 Docker 映像。

    注意

    Docker 的某些版本可能需要在以下命令中使用 Dockerfile 完整路径,而不是所示的相对路径。

    docker build -t hello-world .
  4. 运行 docker images 以验证是否已正确创建映像。

    docker images --filter reference=hello-world

    输出:

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    hello-world         latest              e9ffedc8c286        4 minutes ago       241MB
  5. 运行新构建的映像。-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”消息。

  6. 打开浏览器并指向正在运行 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!”语句的网页。

  7. 通过键入 Ctrl + c 来停止 Docker 容器。

步骤 2:向您的默认注册表验证身份

安装并配置 AWS CLI 后,向默认注册表验证 Docker CLI 的身份。这样一来,docker 命令可以通过 Amazon ECR 推送和拉取镜像。AWS CLI 提供 get-login-password 命令来简化身份验证过程。

要使用 get-login-password 针对 Amazon ECR 注册表验证 Docker,请运行 aws ecr get-login-password 命令。将身份验证令牌传递给 docker login 命令时,将值 AWS 用作用户名,并指定要对其进行身份验证的 Amazon ECR 注册表 URI。如果对多个注册表进行身份验证,则必须针对每个注册表重复该命令。

重要

如果收到错误,请安装或更新到最新版本的 AWS CLI。有关更多信息,请参阅 AWS Command Line Interface 用户指南 中的安装 AWS 命令行界面

  • get-login-password (AWS CLI)

    aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
  • Get-ECRLoginCommand (适用于 Windows PowerShell 的 AWS 工具)

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

步骤 3:创建存储库

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

aws ecr create-repository \ --repository-name hello-world \ --image-scanning-configuration scanOnPush=true \ --region us-east-1

步骤 4:推送映像到 Amazon ECR

现在您可以推送映像到上一部分中创建的 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
  2. 标记映像并推送到存储库。

    docker tag hello-world:latest aws_account_id.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  3. 推送映像。

    docker push aws_account_id.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest

    输出:

    The push refers to a repository [aws_account_id.dkr.ecr.us-east-1.amazonaws.com/hello-world] (len: 1)
    e9ae3c220b23: Pushed
    a6785352b25c: Pushed
    0998bf8fb9e9: Pushed
    0a85502c06c9: Pushed
    latest: digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636b95aed25f52c89b 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.us-east-1.amazonaws.com/hello-world:latest

输出:

latest: Pulling from hello-world
0a85502c06c9: Pull complete
0998bf8fb9e9: Pull complete
a6785352b25c: Pull complete
e9ae3c220b23: Pull complete
Digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636b95aed25f52c89b
Status: Downloaded newer image for aws_account_id.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest

步骤 6:删除映像

如果您不再需要一个存储库中的某个映像,则可以使用 batch-delete-image 命令将其删除。要删除映像,您必须指定它所在的存储库,并指定映像的 imageTagimageDigest 值。以下示例删除 hello-world 存储库中映像标签为 latest 的映像。

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

输出:

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

步骤 7:删除存储库

如果您不再需要整个存储库中的所有映像,您可以删除存储库。默认情况下,您不能删除包含映像的存储库;但是,--force 标记允许此操作。要删除包含映像的存储库(及其中的所有映像),请运行以下命令。

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