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

多容器 Docker 配置

Dockerrun.aws.json 文件是一个特定于 Elastic Beanstalk 的 JSON 文件,该文件描述如何将一组 Docker 容器作为一个 Elastic Beanstalk 应用程序进行部署。您可以对多容器 Docker 环境使用 Dockerrun.aws.json 文件。

Dockerrun.aws.json 描述了要部署到环境中的每个容器实例的容器(托管 Docker 容器的 Amazon EC2 实例),以及要在将装载的容器的主机实例上创建的数据卷。

Dockerrun.aws.json 文件既可单独使用,也可与其他源代码一起压缩到一个存档中。与 Dockerrun.aws.json 一起存档的源代码将部署到 Amazon EC2 容器实例,并且可在 /var/app/current/ 目录中进行访问。使用配置的 volumes 部分,为主机实例上运行的 Docker 容器提供文件卷。使用嵌入容器定义的 mountPoints 部分,将这些卷映射到 Docker 容器上的应用程序可以使用的装载点。

Dockerrun.aws.json v2

Dockerrun.aws.json 文件包括三个部分:

AWSEBDockerrunVersion

将多容器 Docker 环境的版本号指定为值“2”。

containerDefinitions

一组容器定义,详细信息如下。

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

注意

Elastic Beanstalk 为日志配置附加卷 (每个卷对应一个容器)。这些卷应由您的 Docker 容器装载,以便将日志写入主机实例。有关更多信息,请参阅 容器定义格式

用以下格式指定卷:

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

(可选)包含私有存储库身份验证数据的 .dockercfg 文件在 Amazon S3 中的位置。使用下列格式:

"authentication": { "bucket": "my-bucket", "key": "mydockercfg" },

有关详细信息,请参阅使用私有存储库中的镜像

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

使用私有存储库中的镜像

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

有关生成和上传身份验证文件的信息,请参阅使用私有存储库中的镜像

容器定义格式

Dockerrun.aws.json 的容器定义和卷部分使用的格式与 Amazon ECS 任务定义文件的相应部分使用的格式相同。

以下示例显示常用参数的子集。将提供更多可选参数。有关任务定义格式和任务定义参数的完整列表的更多信息,请参阅《Amazon ECS 开发人员指南》中的 Amazon ECS 任务定义

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 日志位置映射到 nginx-proxy 容器的 Elastic Beanstalk 生成的卷。

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

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

links

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

volumesFrom

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

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