多容器 Docker 配置 - 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": "DOC-EXAMPLE-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 Elastic Container Service 开发人员指南 中的 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 日志位置映射到 Elastic Beanstalk 为 nginx-proxy 容器生成的卷。

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

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

links

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

volumesFrom

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

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