Amazon EC2 Container Service
开发人员指南 (API Version 2014-11-13)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

Docker 基本知识

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

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

安装 Docker

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

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

在 Amazon Linux 实例上安装 Docker

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

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

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

    Copy
    [ec2-user ~]$ sudo yum update -y
  4. 安装最新的 Docker Community Edition 程序包。

    Copy
    [ec2-user ~]$ sudo yum install -y docker
  5. 启动 Docker 服务。

    Copy
    [ec2-user ~]$ sudo service docker start Starting cgconfig service: [ OK ] Starting docker: [ OK ]
  6. ec2-user 添加到 docker 组,以便您能够执行 Docker 命令,而无需使用 sudo

    Copy
    [ec2-user ~]$ sudo usermod -a -G docker ec2-user
  7. 退出,再重新登录以接受新的 docker 组权限。

  8. 验证 ec2-user 是否能在没有 sudo 的情况下运行 Docker 命令。

    Copy
    [ec2-user ~]$ docker info Containers: 2 Images: 24 Storage Driver: devicemapper Pool Name: docker-202:1-263460-pool Pool Blocksize: 65.54 kB Data file: /var/lib/docker/devicemapper/devicemapper/data Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata Data Space Used: 702.3 MB Data Space Total: 107.4 GB Metadata Space Used: 1.864 MB Metadata Space Total: 2.147 GB Library Version: 1.02.89-RHEL6 (2014-09-01) Execution Driver: native-0.2 Kernel Version: 3.14.27-25.47.amzn1.x86_64 Operating System: Amazon Linux AMI 2014.09

    注意

    在某些情况下,您可能需要重新启动实例,以便为 ec2-user 提供访问 Docker 守护程序的权限。如果您看到以下错误消息,请尝试重启您的实例:

    Copy
    Cannot connect to the Docker daemon. Is the docker daemon running on this host?

(可选)注册 Docker Hub 账户

Docker 使用存储在存储库中的用来启动容器的映像。最常见的 Docker 映像存储库(以及 Docker 守护程序的默认存储库)是 Docker Hub。虽然您无需 Docker Hub 账户即可使用 Amazon ECS 或 Docker,但拥有 Docker Hub 账户可让您自由存储修改后的 Docker 映像,以便在 ECS 任务定义中使用这些映像。

有关 Docker Hub 以及注册账户的更多信息,请转到 https://hub.docker.com

Docker Hub 提供公共注册表和私有注册表。您可以在 Docker Hub 上创建私有注册表,并将 ECS 容器实例上的私有注册表身份验证配置为在任务定义中使用私有映像。

(可选)Amazon EC2 Container Registry

另一个注册表选项是 Amazon EC2 Container Registry (Amazon ECR)。Amazon ECR 是一项托管 AWS Docker 注册表服务。客户可以使用熟悉的 Docker CLI 推送、拉取和管理映像。有关 Amazon ECR 产品详细信息、特色客户案例研究和常见问题,请参阅 Amazon EC2 Container Registry 产品详细信息页面。要使用 Amazon ECR 完成此演练,请参阅 Amazon EC2 Container Registry 用户指南 中的创建 Docker 映像

创建 Docker 映像并将其上传到 Docker Hub

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

创建 PHP Web 应用程序的 Docker 映像

  1. 安装 git 并使用它将简单 PHP 应用程序从 GitHub 存储库克隆到系统中。

    1. 安装 git。

      Copy
      [ec2-user ~]$ sudo yum install -y git
    2. 将简单 PHP 应用程序克隆到系统中。

      Copy
      [ec2-user ~]$ git clone https://github.com/awslabs/ecs-demo-php-simple-app
  2. 将目录更改为 ecs-demo-php-simple-app 文件夹。

    Copy
    [ec2-user ~]$ cd ecs-demo-php-simple-app
  3. 在此文件中检查 Dockerfile。Dockerfile 是一个清单文件,描述了用于 Docker 映像的基本映像以及要安装的项目以及在此项目上运行的内容。有关 Dockerfile 的更多信息,请转到 Dockerfile 参考

    Copy
    [ec2-user ecs-demo-php-simple-app]$ cat Dockerfile FROM ubuntu:12.04 # Install dependencies RUN apt-get update -y RUN apt-get install -y git curl apache2 php5 libapache2-mod-php5 php5-mcrypt php5-mysql # Install app RUN rm -rf /var/www/* ADD src /var/www # Configure apache RUN a2enmod rewrite RUN chown -R www-data:www-data /var/www ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 EXPOSE 80 CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]

    此 Dockerfile 使用 Ubuntu 12.04 映像。RUN 指令将更新程序包缓存,为 Web 服务器和 PHP 支持安装一些软件包,然后将您的 PHP 应用程序添加到 Web 服务器的文档根目录。EXPOSE 指令在容器上公开端口 80,CMD 指令启动 Web 服务器。

  4. 从您的 Dockerfile 构建 Docker 映像。my-dockerhub-username 替换为您的 Docker Hub 用户名。

    注意

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

    Copy
    [ec2-user ecs-demo-php-simple-app]$ docker build -t my-dockerhub-username/amazon-ecs-sample .
  5. 运行 docker images 以验证是否已正确创建映像以及映像名称是否包含可推送到的存储库(在此示例中,您的 Docker Hub 用户名)。

    Copy
    [ec2-user ecs-demo-php-simple-app]$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE my-dockerhub-username/amazon-ecs-sample latest 43c52559a0a1 12 minutes ago 258.1 MB ubuntu 12.04 78cef618c77e 3 weeks ago 133.7 MB
  6. 运行新构建的映像。-p 80:80 选项将容器上公开的端口 80 映射到主机系统上的端口 80。有关 docker run 的更多信息,请转到 Docker 运行参考

    Copy
    [ec2-user ecs-demo-php-simple-app]$ docker run -p 80:80 my-dockerhub-username/amazon-ecs-sample apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2 for ServerName

    注意

    来自 Apache Web 服务器的输出将显示在终端窗口中。您可以忽略“Could not reliably determine the server's fully qualified domain name”消息。

  7. 打开浏览器并指向正在运行 Docker 并托管您的容器的服务器。

    • 如果您使用的是 EC2 实例,这将是服务器的 Public DNS 值,此值与您用于通过 SSH 连接到实例的地址相同。确保实例的安全组允许端口 80 上的入站流量。

    • 如果您正在本地运行 Docker,可将您的浏览器指向 http://localhost/

    • 如果您正在 Windows 或 Mac 计算机上使用 docker-machine,请使用 docker-machine ip 命令查找托管 Docker 的 VirtualBox VM 的 IP 地址,并将 machine-name 替换为您正在使用的 Docker 计算机的名称。

      Copy
      $ docker-machine ip machine-name 192.168.59.103

    您应看到正在运行简单 PHP 应用程序的网页。

     简单 PHP 应用程序
  8. 通过键入 Ctrl +c 来停止 Docker 容器。

  9. 利用您的 Docker Hub 证书对 Docker 客户端进行身份验证。

    Copy
    [ec2-user ecs-demo-php-simple-app]$ docker login
  10. 将映像推送到 Docker Hub。

    Copy
    [ec2-user ecs-demo-php-simple-app]$ docker push my-dockerhub-username/amazon-ecs-sample

后续步骤

在完成映像推送后,您可以在 Amazon ECS 任务定义中使用可用于运行任务的 my-dockerhub-username/amazon-ecs-sample 映像。

使用 amazon-ecs-sample 映像注册任务定义

  1. 检查 ecs-demo-php-simple-app 文件夹中的 simple-app-task-def.json 文件。

    Copy
    { "family": "console-sample-app", "volumes": [ { "name": "my-vol", "host": {} } ], "containerDefinitions": [ { "environment": [], "name": "simple-app", "image": "amazon/amazon-ecs-sample", "cpu": 10, "memory": 500, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "mountPoints": [ { "sourceVolume": "my-vol", "containerPath": "/var/www/my-vol" } ], "entryPoint": [ "/usr/sbin/apache2", "-D", "FOREGROUND" ], "essential": true }, { "name": "busybox", "image": "busybox", "cpu": 10, "memory": 500, "volumesFrom": [ { "sourceContainer": "simple-app" } ], "entryPoint": [ "sh", "-c" ], "command": [ "/bin/sh -c \"while true; do /bin/date > /var/www/my-vol/date; sleep 1; done\"" ], "essential": false } ] }

    此任务定义 JSON 文件指定两个容器,其中一个容器使用 amazon-ecs-sample 映像。默认情况下,将从 Amazon Docker Hub 存储库中提取此映像,但如果您想使用之前推送的 my-dockerhub-username/amazon-ecs-sample 映像,则可以将上面定义的 amazon 存储库更改为您自己的存储库。

  2. 使用 simple-app-task-def.json 文件注册任务定义。

    Copy
    [ec2-user ecs-demo-php-simple-app]$ aws ecs register-task-definition --cli-input-json file://simple-app-task-def.json

    任务定义已在 console-sample-app 系列中注册,如 JSON 文件中所定义。

使用 console-sample-app 任务定义运行任务

重要

您需要先将容器实例启动到您的集群中,然后才能在 Amazon ECS 中运行任务。有关如何设置和启动容器实例的更多信息,请参阅Amazon ECS 的设置开始使用 Amazon ECS

  • 使用以下 AWS CLI 命令以通过 console-sample-app 任务定义运行任务。

    Copy
    [ec2-user ecs-demo-php-simple-app]$ aws ecs run-task --task-definition console-sample-app