使用 Elastic Beanstalk 控制台启动多容器 Docker 环境 - AWS Elastic Beanstalk
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 Elastic Beanstalk 控制台启动多容器 Docker 环境

您可以使用 Elastic Beanstalk 控制台在单实例或可扩展的 Elastic Beanstalk 环境中启动多容器实例集群。本教程详细说明了容器配置和使用两个容器的环境的源代码准备。

容器、PHP 应用程序和 nginx 代理在 Elastic Beanstalk 环境中的每个 Amazon Elastic Compute Cloud (Amazon EC2) 实例上并排运行。创建环境并验证应用程序正在运行后,您将连接到一个容器实例以了解其配合使用情况。

定义 Docker 容器

创建新的 Docker 环境的第一步是为您的应用程序数据创建目录。此文件夹可以位于您的本地计算机上的任何位置,并且可以具有您选择的任何名称。除了容器配置文件外,此文件夹还包含您将上传到 Elastic Beanstalk 并部署到环境的内容。

注意

此教程的所有代码都可在 GitHub(网址为 https://github.com/awslabs/eb-docker-nginx-proxy)上的 awslab 存储库中找到。

Elastic Beanstalk 用于在 Amazon EC2 实例上配置容器的文件是一个名为 Dockerrun.aws.json 的 JSON 格式的文本文件。请使用此名称在应用程序的根目录下创建一个文本文件添加以下文字:

{ "AWSEBDockerrunVersion": 2, "volumes": [ { "name": "php-app", "host": { "sourcePath": "/var/app/current/php-app" } }, { "name": "nginx-proxy-conf", "host": { "sourcePath": "/var/app/current/proxy/conf.d" } } ], "containerDefinitions": [ { "name": "php-app", "image": "php:fpm", "essential": true, "memory": 128, "mountPoints": [ { "sourceVolume": "php-app", "containerPath": "/var/www/html", "readOnly": true } ] }, { "name": "nginx-proxy", "image": "nginx", "essential": true, "memory": 128, "portMappings": [ { "hostPort": 80, "containerPort": 80 } ], "links": [ "php-app" ], "mountPoints": [ { "sourceVolume": "php-app", "containerPath": "/var/www/html", "readOnly": true }, { "sourceVolume": "nginx-proxy-conf", "containerPath": "/etc/nginx/conf.d", "readOnly": true }, { "sourceVolume": "awseb-logs-nginx-proxy", "containerPath": "/var/log/nginx" } ] } ] }

本示例配置定义了两个容器:一个 PHP 网站以及一个位于它前面的 nginx 代理。这两个容器将在 Elastic Beanstalk 环境中每个实例上的 Docker 容器中并排运行,并从主机实例上的卷(也在此文件中定义)访问共享内容(网站的内容)。这两个容器自身从托管于 Docker 中心上的正式存储库中的映像创建。得到的环境与下面类似:

在配置中定义的卷与您接下来要创建并作为应用程序源包的一部分上传的内容相对应。这两个容器将通过在容器定义的 mountPoints 部分中装载卷来访问主机上的内容。

有关 Dockerrun.aws.json 的格式及其参数的更多信息,请参阅容器定义格式

添加内容

接下来,您将为要向访问者显示的 PHP 站点添加一些内容,并为 nginx 代理添加一个配置文件。

php-app/index.php

<h1>Hello World!!!</h1> <h3>PHP Version <pre><?= phpversion()?></pre></h3>

php-app/static.html

<h1>Hello World!</h1> <h3>This is a static HTML page.</h3>

proxy/conf.d/default.conf

server { listen 80; server_name localhost; root /var/www/html; index index.php; location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; if (!-f $document_root$fastcgi_script_name) { return 404; } include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; fastcgi_pass php-app:9000; fastcgi_index index.php; } }

部署到 Elastic Beanstalk

您的应用程序文件夹现在包含以下文件:

├── Dockerrun.aws.json ├── php-app │   ├── index.php │   └── static.html └── proxy └── conf.d └── default.conf

这就是您创建 Elastic Beanstalk 环境所需的全部内容。创建上述文件和文件夹 (不包括顶级项目文件夹) 的 .zip 存档。要在 Windows 资源管理器中创建存档,请选择项目文件夹的内容,右键单击,选择 Send To (发送到),然后单击 Compressed (zipped) Folder (压缩的文件夹)

注意

有关在其他环境中创建存档所需的文件结构和说明的信息,请参阅创建应用程序源包。

接下来,将源包上传到 Elastic Beanstalk 并创建您的环境。对于 Platform (平台),选择 Docker。对于 Platform branch (平台分支),选择 Multi-container Docker running on 64bit Amazon Linux (64 位 Amazon Linux 上运行的多容器 Docker)

启动环境 (控制台)

  1. 使用下面的预配置链接打开 Elastic Beanstalk 控制台:console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced

  2. 对于平台,请选择与应用程序使用的语言匹配的平台和平台分支,或者为基于容器的应用程序选择 Docker 平台。

  3. 对于 Application code (应用程序代码),选择 Upload your code (上传代码)

  4. 选择 Local file (本地文件),再选择 Choose file (选择文件),然后打开源包。

  5. 选择 Review and launch (复查并启动)

  6. 查看可用设置并选择 Create app (创建应用程序)

Elastic Beanstalk 控制台将您重定向到新环境的管理控制面板。此屏幕显示环境的运行状况和由 Elastic Beanstalk 服务输出的事件。当状态为 Green 时,请单击环境名称旁边的 URL 以查看您新的网站。

连接到容器实例

接下来,您将连接到 Elastic Beanstalk 环境中的 Amazon EC2 实例,以查看某些移动部件的实际应用。

要连接到您的环境中的实例,最简单的方法是使用 EB CLI。要使用该工具,请安装 EB CLI(如果尚未安装)。还需要为您的环境配置一个 Amazon EC2 SSH 密钥对。可以使用控制台的安全配置页面或 EB CLI eb init 命令执行该操作。要连接到环境实例,请使用 EB CLI eb ssh 命令。

现在,您已连接到托管 Docker 容器的 Amazon EC2 实例,您可以查看设置情况。对 ls 运行 /var/app/current

[ec2-user@ip-10-0-0-117 ~]$ ls /var/app/current Dockerrun.aws.json php-app proxy

此目录包含您在创建环境期间上传到 Elastic Beanstalk 的源包中的文件。

[ec2-user@ip-10-0-0-117 ~]$ ls /var/log/containers nginx nginx-proxy-ffffd873ada5-stdouterr.log rotated nginx-66a4fd37eb63-stdouterr.log php-app nginx-proxy php-app-b894601a1364-stdouterr.log

这是在容器实例上创建日志并由 Elastic Beanstalk 收集日志的位置。Elastic Beanstalk 在此目录中为每个容器创建一个卷,您将卷挂载到写入日志的容器位置。

您还可以使用 docker ps 查看 Docker 以了解正在运行的容器。

[ec2-user@ip-10-0-0-117 ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ffffd873ada5 nginx:1.7 "nginx -g 'daemon of About an hour ago Up About an hour 443/tcp, 0.0.0.0:80->80/tcp ecs-eb-dv-example-env-ycmk5geqrm-2-nginx-proxy-90fce996cc8cbecb2800 b894601a1364 php:5-fpm "php-fpm" About an hour ago Up About an hour 9000/tcp ecs-eb-dv-example-env-ycmk5geqrm-2-php-app-cec0918ed1a3a49a8001 09fb19828e38 amazon/amazon-ecs-agent:latest "/agent" About an hour ago Up About an hour 127.0.0.1:51678->51678/tcp ecs-agent

这会显示您部署的两个正在运行的容器,以及协调部署的 Amazon ECS 容器代理。

检查 Amazon ECS 容器代理

Elastic Beanstalk 上的多容器 Docker 环境中的 Amazon EC2 实例在 Docker 容器中运行代理进程。此代理连接到 Amazon ECS 服务以协调容器部署。这些部署在 Amazon ECS 中作为任务运行,这些任务在任务定义文件中进行配置。Elastic Beanstalk 根据您在源包中上传的 Dockerrun.aws.json 创建这些任务定义文件。

利用对 http://localhost:51678/v1/metadata 的 HTTP 获取请求查看容器代理的状态:

[ec2-user@ip-10-0-0-117 ~]$ curl http://localhost:51678/v1/metadata { "Cluster":"eb-dv-example-env-qpoxiguye24", "ContainerInstanceArn":"arn:aws:ecs:us-east-2:123456789012:container-instance/6a72af64-2838-400d-be09-3ab2d836ebcd" }

此结构显示 Amazon ECS 集群的名称以及集群实例(您连接到的 Amazon EC2 实例)的 ARN(Amazon 资源名称)。

有关发出 HTTP 获取请求的更多信息可在 http://localhost:51678/v1/tasks 上找到:

[ec2-user@ip-10-0-0-117 ~]$ curl http://localhost:51678/v1/tasks { "Tasks":[ { "Arn":"arn:aws:ecs:us-east-2:123456789012:task/3ff2bf0f-790d-4f6d-affb-5b127b3b6e4a", "DesiredStatus":"RUNNING", "KnownStatus":"RUNNING", "Family":"eb-dv-example-env-qpoxiguye24", "Version":"2", "Containers":[ { "DockerId":"b894601a1364a438156a239813c77cdef17040785bc4d5e49349470dc1556b15", "DockerName":"ecs-eb-dv-example-env-qpoxiguye24-2-php-app-cec0918ed1a3a49a8001", "Name":"php-app" }, { "DockerId":"ffffd873ada5f537c88862cce4e1de7ec3edf962645982fb236961c833a5d0fe", "DockerName":"ecs-eb-dv-example-env-qpoxiguye24-2-nginx-proxy-90fce996cc8cbecb2800", "Name":"nginx-proxy" } ] } ] }

此结构描述了为部署本教程的示例项目中的两个 docker 容器而运行的任务。将显示以下信息:

  • KnownStatusRUNNING 状态表示容器仍处于活动状态。

  • Family – Elastic Beanstalk 从 Dockerrun.aws.json 中创建的任务定义的名称。

  • Version – 任务定义的版本。每当任务定义文件更新时,版本号都会递增。

  • Containers – 有关在实例上运行的容器的信息。

更多信息可从 Amazon ECS 服务本身获得,您可以使用 AWS 命令行界面调用该服务。有关将 AWS CLI 与 Amazon ECS 结合使用的说明以及有关 Amazon ECS 的一般信息,请参阅 Amazon ECS 用户指南