Amazon Elastic Container Service
开发人员指南 (API 版本 2014-11-13)

Amazon ECS 的 Docker 基本知识

Docker 是一项可让您构建、运行、测试和部署基于 Linux 容器的分布式应用程序的技术。Amazon ECS 使用任务定义中的 Docker 映像来启动集群中的 Amazon EC2 实例上的容器。有关 Amazon ECS 产品详细信息、特色客户案例研究和常见问题,请参阅 Amazon Elastic Container Service 产品详细信息页面

本指南中的文档假定读者已基本了解 Docker 是什么及其工作方式。有关 Docker 的更多信息,请参阅 Docker 是什么?Docker 概述

安装 Docker

注意

如果您已安装 Docker,请跳到创建 Docker 映像

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

您甚至无需本地开发系统即可使用 Docker。如果您已使用 Amazon EC2,则可启动一个实例并安装 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?

创建 Docker 映像

Amazon ECS 任务定义使用 Docker 映像启动集群中的容器实例上的容器。在本节中,您将创建简单 Web 应用程序的 Docker 映像,并在本地系统或 EC2 实例上测试此映像,然后将此映像推送至容器注册表(如 Amazon ECR 或 Docker Hub),以便能够在 ECS 任务定义中使用它。

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

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

    touch Dockerfile
  2. 编辑您刚刚创建的 Dockerfile 并添加以下内容。

    FROM ubuntu:16.04 # Install dependencies RUN apt-get update RUN 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 RUN echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh RUN echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh RUN echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh RUN chmod 755 /root/run_apache.sh EXPOSE 80 CMD /root/run_apache.sh

    此 Dockerfile 使用 Ubuntu 16.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 容器。

(可选) 将您的映像推送至 Amazon Elastic Container Registry

Amazon ECR 是一项托管 AWS Docker 注册表服务。客户可以使用熟悉的 Docker CLI 推送、拉取和管理映像。有关 Amazon ECR 产品详细信息、特色客户案例研究和常见问题,请参阅 Amazon Elastic Container Registry 产品详细信息页面

本节要求以下内容:

  • 您已经安装并配置 AWS CLI。如果您尚未在系统中安装 AWS CLI,请参阅 AWS Command Line Interface 用户指南 中的安装 AWS Command Line Interface

  • 您的用户具有访问 Amazon ECR 服务所需的 IAM 权限。有关更多信息,请参阅 Amazon ECR 托管策略

标记映像并将其推送至 Amazon ECR

  1. 创建用于存储您的 hello-world 映像的 Amazon ECR 存储库。在输出中记下 repositoryUri

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

    输出:

    {
        "repository": {
            "registryId": "aws_account_id",
            "repositoryName": "hello-repository",
            "repositoryArn": "arn:aws:ecr:region:aws_account_id:repository/hello-repository",
            "createdAt": 1505337806.0,
            "repositoryUri": "aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository"
        }
    }
  2. 使用上一步中的 repositoryUri 值标记 hello-world 映像。

    docker tag hello-world aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository
  3. 运行 aws ecr get-login --no-include-email 命令以获取您的注册表的 docker login 身份验证命令字符串。

    注意

    AWS CLI 从版本 1.9.15 开始提供 get-login 命令;但对于较新的 Docker 版本(17.06 或更高版本),我们建议使用 1.11.91 版或更高版本。可以使用 aws --version 命令查看 AWS CLI 版本。如果您使用的是 Docker 17.06 或更高版本,请在 get-login 后包含 --no-include-email 选项。如果收到 Unknown options: --no-include-email 错误,请安装最新版本的 AWS CLI。有关更多信息,请参阅 AWS Command Line Interface 用户指南 中的 安装 AWS 命令行界面

    aws ecr get-login --no-include-email --region region
  4. 运行上一步中返回的 docker login 命令。此命令提供一个在 12 小时内有效的授权令牌。

    重要

    在您执行此 docker login 命令时,系统上的其他用户可以在进程列表 (ps -e) 显示中看到该命令字符串。由于 docker login 命令包含身份验证凭证,因此系统上的其他用户可按此方式查看凭证会带来风险。他们可能会使用凭证获取对您的存储库的推送和拉取访问权限。如果您所在的系统不安全,则应考虑此风险,并通过省略 -p password 选项并在系统提示时输入密码来以交互方式登录。

  5. 使用上一步中的 repositoryUri 值将映像推送至 Amazon ECR。

    docker push aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository

(可选)清除

完成试验 Amazon ECR 映像后,您可以删除存储库,从而无需为映像存储付费。

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

后续步骤

现在,您已经创建了一个 Docker 映像并将其推送到 Amazon ECR 存储库,您可以开始创建您的 Amazon ECS 资源以启动容器了。使用以下主题继续: