ECS 托管式 Docker 配置 - AWS Elastic Beanstalk

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

ECS 托管式 Docker 配置

Dockerrun.aws.json 是 Elastic Beanstalk 配置文件,描述如何将一组托管在 ECS 集群中的 Docker 容器部署到 Elastic Beanstalk 环境中。Elastic Beanstalk 平台创建 ECS 任务定义,其中包括 ECS 容器定义。这些定义在 Dockerrun.aws.json 配置文件中描述。

Dockerrun.aws.json 文件中的容器定义描述了要部署到 ECS 集群中每个 Amazon EC2 实例的容器。在这种情况下,Amazon EC2 实例也被称为主机容器实例,因为其托管 Docker 容器。配置文件还描述了要在主机容器实例上创建的用于挂载 Docker 容器的数据卷。有关 Elastic Beanstalk 上的 ECS 托管 Docker 环境中的组件的更多信息和示意图,请参阅本章前面的 ECS 托管的 Docker 平台

Dockerrun.aws.json 文件既可单独使用,也可与其他源代码一起压缩到一个存档中。与 Dockerrun.aws.json 一起存档的源代码将部署到 Amazon EC2 容器实例中,并且可在 /var/app/current/ 目录中进行访问。

Dockerrun.aws.json v2

Dockerrun.aws.json 文件包含以下部分:

AWSEBDockerrunVersion

对于 ECS 托管式 Docker 环境,请将版本号指定为值 2

从 Amazon EC2 容器实例中的文件夹或从源包(部署到 /var/app/current)创建卷。使用 containerDefinitions 部分中的 mountPoints 将这些卷装载到您的 Docker 容器中的路径。

containerDefinitions

容器定义数组。

身份验证(可选)

包含私有存储库身份验证数据的 .dockercfg 文件在 Amazon S3 中的位置。

Dockerrun.aws.jsoncontainerDefinitions部分使用的格式与 Amazon ECS 任务定义文件的相应部分使用的格式相同。有关任务定义格式和完整任务定义参数列表的更多信息,请参阅 Amazon Elastic Container Service 开发人员指南中的 Amazon ECS 任务定义

卷格式

volume 参数从 Amazon EC2 容器实例中的文件夹或从源包(部署到 /var/app/current)创建卷。

用以下格式指定卷:

"volumes": [ { "name": "volumename", "host": { "sourcePath": "/path/on/host/instance" } } ],

使用容器定义中的 mountPoints,将这些卷装载到您的 Docker 容器中的路径。

Elastic Beanstalk 为日志配置附加卷(为每个容器配置一个)。这些卷应由您的 Docker 容器装载,以便将日志写入主机实例。

有关更多详细信息,请参阅后面的容器定义格式部分中的 mountPoints 字段。

容器定义格式

以下示例显示 containerDefinitions 部分中常用参数的子集。将提供更多可选参数。

Beanstalk 平台创建 ECS 任务定义,其中包括 ECS 容器定义。Beanstalk 支持 ECS 容器定义的参数子集。有关更多信息,请参阅 Amazon Elastic Container Service 开发人员指南中的容器定义

Dockerrun.aws.json 文件包含一组 (一个或多个) 带以下字段的容器定义对象:

name

容器的名称。有关最大长度和允许字符数的信息,请参阅标准容器定义参数

image

您从中构建 Docker 容器的在线 Docker 存储库中的 Docker 映像的名称。记下这些约定:

  • Docker Hub 上的官方存储库中的映像使用一个名称 (例如,ubuntumongo)。

  • Docker Hub 上其他存储库中的映像通过组织名称 (例如,amazon/amazon-ecs-agent) 进行限定。

  • 其他在线存储库中的映像由域名 (例如,quay.io/assemblyline/ubuntu) 进行进一步限定。

环境

一组要传递到容器的环境变量。

例如,以下条目定义名称为 Container 且值为 PHP 的环境变量:

"environment": [ { "name": "Container", "value": "PHP" } ],
essential

如果在容器出现故障时应停止任务,则为 true。非主要容器可在不影响实例上的其余容器的情况下完成或发生崩溃。

memory

要为容器预留的容器实例上的内存量。在容器定义中为 memory 和/或 memoryReservation 参数指定一个非零整数。

memoryReservation

要为容器预留的内存量的软限制(以 MiB 为单位)。在容器定义中为 memory 和/或 memoryReservation 参数指定一个非零整数。

mountPoints

Amazon EC2 容器实例中要挂载的卷,以及 Docker 容器文件系统上要挂载这些卷的位置。如果您装载的卷中包含应用程序内容,您的容器能够读取您在源包中上传的数据。当您挂载日志卷以写入日志数据时,Elastic Beanstalk 可以从这些卷中收集日志数据。

Elastic Beanstalk 在 /var/log/containers/containername 处的容器实例上创建日志卷(为每个 Docker 容器创建一个日志卷)。这些卷将命名为 awseb-logs-containername 且将挂载到将日志写入到的容器文件结构中的位置。

例如,以下挂载点将容器中的 nginx 日志位置映射到 Elastic Beanstalk 为 nginx-proxy 容器生成的卷。

{ "sourceVolume": "awseb-logs-nginx-proxy", "containerPath": "/var/log/nginx" }
portMappings

将容器上的网络端口映射到主机上的端口。

links

要链接到的容器的列表。链接的容器可互相发现并安全地通信。

volumesFrom

从不同容器装载所有卷。例如,从名为 web 的容器装载卷:

"volumesFrom": [ { "sourceContainer": "web" } ],

验证库格式 – 使用私有存储库中的映像

authentication 部分包含私有存储库的身份验证数据。此条目是可选项。

authentication 文件的 Dockerrun.aws.json 参数中添加有关包含身份验证文件的 Amazon S3 存储桶的信息。确保 authentication 参数包含有效的 Amazon S3 存储桶和密钥。Amazon S3 存储桶必须托管在使用它的环境所在的区域中。Elastic Beanstalk 不会从托管在其他区域的 Amazon S3 存储桶下载文件。

使用下列格式:

"authentication": { "bucket": "DOC-EXAMPLE-BUCKET", "key": "mydockercfg" },

有关生成和上传身份验证文件的信息,请参阅本章的环境配置主题中的 使用私有存储库中的映像

示例 Dockerrun.aws.json v2

以下代码段是一个示例,该示例说明了带两个容器实例的 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", "environment": [ { "name": "Container", "value": "PHP" } ], "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" } ] } ] }