AWS Elastic Beanstalk
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 AWS 管理控制台启动多容器 Docker 环境

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

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

定义 Docker 容器

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

注意

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

Elastic Beanstalk 用来在 EC2 实例上配置容器的文件是一个 JSON 格式的文本文件,名为 Dockerrun.aws.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 并创建您的环境。系统提示您选择平台时,选择 Multi-container Docker (多容器 Docker)

启动环境 (控制台)

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

  2. 对于平台,选择与应用程序使用的语言匹配的平台。

  3. 对于应用程序代码,选择上传

  4. 选择本地文件,再选择浏览,然后打开源包。

  5. 选择 Upload

  6. 选择复查并启动

  7. 查看可用设置并选择创建应用程序

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

连接到容器实例

它的运行情况如何? 接下来,您将连接到 Elastic Beanstalk 环境中的 EC2 实例以查看某些移动部件的实际应用。

首先,确定实例并记下其公有 IP 地址(可在 https://console.amazonaws.cn/ec2/ 上的 Amazon EC2 控制台中找到)。如果有多个实例在运行,而您难以确定属于您的环境的实例,请在环境控制面板上浏览事件并查找实例 ID。此 ID 出现在 Elastic Beanstalk 启动 EC2 实例时列出的事件中。在 Amazon EC2 控制台中搜索实例 ID 并查看其详细信息以查找公有 IP 地址。

接下来,使用 SSH 客户端和您的私有密钥文件来连接到实例。使用以下设置:

SSH 设置

  • 地址 – EC2 实例的公有 IP 地址或 DNS 名称。

  • 端口22。当您在环境配置过程中选择 Amazon EC2 密钥对时,此端口将打开以供 Elastic BeanstalkBeanstalk 进入。

  • 用户名ec2-user。这是运行 Amazon Linux 的 EC2 实例的默认用户名。

  • 私有密钥 – 您的私有密钥文件。

有关使用 SSH 连接到 EC2 实例的完整说明,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的使用 SSH 连接到您的 Linux 实例

现在,您已连接到托管您的 docker 容器的 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 环境中的 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-cn:ecs:us-west-2:123456789012:container-instance/6a72af64-2838-400d-be09-3ab2d836ebcd" }

此结构显示了 Amazon ECS 集群的名称以及集群实例(您连接到的 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-cn:ecs:us-west-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 状态表示容器仍处于活动状态。

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

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

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

甚至可以从 Amazon ECS 服务本身获取更多信息,您可以使用 AWS Command Line Interface调用该服务。有关将 AWS CLI 与 Amazon ECS 一起使用的说明以及有关 Amazon ECS 的常规信息,请参阅 Amazon ECS 用户指南