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

多容器 Docker 环境

您可以使用适用于 Elastic Beanstalk 的多容器 Docker 平台创建支持每个 Amazon EC2 实例对应多个容器的 Docker 环境。

Elastic Beanstalk 使用 Amazon Elastic Container Service (Amazon ECS) 协调到多容器 Docker 环境的容器部署。Amazon ECS 提供工具来管理运行 Docker 容器的实例集群。Elastic Beanstalk 处理 Amazon ECS 任务,包括集群创建、任务定义和执行。

注意

有些区域不提供 Amazon ECS。这些区域中不支持多容器 Docker 环境。

有关每个区域中提供的 AWS 服务的信息,请参阅区域表

多容器 Docker 平台

Elastic Beanstalk 上的标准通用和预配置 Docker 平台仅支持每个 Elastic Beanstalk 环境对应一个 Docker 容器。为了充分利用 Docker,Elastic Beanstalk 允许您创建您的 Amazon EC2 实例可在其中同时运行多个 Docker 容器的环境。

下图显示一个配置了三个 Docker 容器的示例 Elastic Beanstalk 环境,这三个 Docker 容器在一个 Auto Scaling 组中的每个 Amazon EC2 实例上运行:

Dockerrun.aws.json 文件

容器实例(在 Elastic Beanstalk 环境中运行多容器 Docker 的 Amazon EC2 实例)需要名为 Dockerrun.aws.json 的配置文件。此文件特定于 Elastic Beanstalk,可单独使用或与源包中的源代码和内容结合使用以在 Docker 平台上创建环境。

注意

版本 1 的 Dockerrun.aws.json 格式用于对 Elastic Beanstalk 环境启动单个 Docker 容器。版本 2 添加了对每个 Amazon EC2 实例对应多个容器的支持,并且只能与多容器 Docker 平台一起使用。格式与单容器 Docker 配置中详细介绍的上一个版本存在很大的差异

请参阅 Dockerrun.aws.json v2 以了解有关更新的格式和示例文件的详细信息。

Docker 映像

适用于 Elastic Beanstalk 的多容器 Docker 平台需要预构建映像并将其存储在公共或私有在线映像存储库中。

注意

Elastic Beanstalk 上的多容器 Docker 平台不支持使用 Dockerfile 在部署期间构建自定义映像。在创建 Elastic Beanstalk 环境之前,先构建映像并将其部署到在线存储库中。

Dockerrun.aws.json 中按名称指定映像。记下这些约定:

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

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

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

要将 Elastic Beanstalk 配置为针对私有存储库进行验证,请在 Dockerrun.aws.json 文件中包含 authentication 参数。

容器实例角色

Elastic Beanstalk 将 Amazon ECS 优化的 AMI 与在 Docker 容器中运行的 Amazon ECS 容器代理一起使用。该代理与 Amazon ECS 进行通信以协调容器部署。要与 Amazon ECS 进行通信,每个 Amazon EC2 实例必须具有 IAM 中的相应权限。当您在 Elastic Beanstalk 管理控制台中创建环境时,这些权限会附加到默认实例配置文件

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ECSAccess", "Effect": "Allow", "Action": [ "ecs:Poll", "ecs:StartTask", "ecs:StopTask", "ecs:DiscoverPollEndpoint", "ecs:StartTelemetrySession", "ecs:RegisterContainerInstance", "ecs:DeregisterContainerInstance", "ecs:DescribeContainerInstances", "ecs:Submit*" ], "Resource": "*" } ] }

如果您自行创建实例配置文件,可连接 AWSElasticBeanstalkMulticontainerDocker 托管策略,以确定许可保持最新。有关在 IAM 中创建策略和角色的说明,请参阅《IAM 用户指南》中的创建 IAM 角色

Elastic Beanstalk 创建的 Amazon ECS 资源

当您使用多容器 Docker 平台创建环境时,Elastic Beanstalk 会在构建环境的同时自动创建并配置一些 Amazon Elastic Container Service 资源,以便在每个 Amazon EC2 实例上创建所需的容器。

  • Amazon ECS 集群 – Amazon ECS 中的容器实例已分成多个集群。在与 Elastic Beanstalk 一起使用时,总是为每个多容器 Docker 环境创建一个集群。

  • Amazon ECS 任务定义 – Elastic Beanstalk 使用您项目中的 Dockerrun.aws.json 文件生成用于在环境中配置容器实例的 Amazon ECS 任务定义。

  • Amazon ECS 任务 – Elastic Beanstalk 与 Amazon ECS 进行通信以在环境中的每个实例上运行一个任务,从而协调容器部署。在 Auto Scaling 环境中,在将一个实例添加到集群时,Elastic Beanstalk 就会启动一个新任务。在极少数情况下,您可能需要增加为容器和映像预留的空间量。请阅读配置 Docker 环境部分了解更多信息。

  • Amazon ECS 容器代理 – 代理在您环境中的实例上的 Docker 容器中运行。该代理轮询 Amazon ECS 服务并等待任务运行。

  • Amazon ECS 数据卷 – Elastic Beanstalk 将卷定义(以及您在 Dockerrun.aws.json 中定义的卷)插入任务定义中以方便日志收集。

    Elastic Beanstalk 在 /var/log/containers/containername 处的容器实例上创建日志卷,每个容器一个。这些卷将命名为 awseb-logs-containername 并提供给要装载的容器。请参阅容器定义格式以了解有关如何挂载容器的详细信息。

使用多个 Elastic Load Balancing 侦听器

您可以在多容器 Docker 环境中配置多个 Elastic Load Balancing 侦听器,以支持代理的入站流量或不在默认 HTTP 端口上运行的其他服务。

在您的源包中创建一个 .ebextensions 文件夹并添加一个文件扩展名为 .config 的文件。以下示例显示了用于在端口 8080 上创建 Elastic Load Balancing 侦听器的配置文件。

.ebextensions/elb-listener.config

option_settings: aws:elb:listener:8080: ListenerProtocol: HTTP InstanceProtocol: HTTP InstancePort: 8080

如果您的环境在您创建的自定义 Amazon Virtual Private Cloud (Amazon VPC) 中运行,则 Elastic Beanstalk 会处理剩余的工作。在默认 VPC 中,您需要配置实例的安全组以允许来自负载均衡器的入口流量。添加将入口流量规则添加到安全组的第二个配置文件:

.ebextensions/elb-ingress.config

Resources: port8080SecurityGroupIngress: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]} IpProtocol: tcp ToPort: 8080 FromPort: 8080 SourceSecurityGroupName: { "Fn::GetAtt": ["AWSEBLoadBalancer", "SourceSecurityGroup.GroupName"] }

有关配置文件格式的更多信息,请参阅添加自定义 Elastic Beanstalk 环境资源选项设置

除了将侦听器添加到 Elastic Load Balancing 配置并在安全组中开放端口外,您还需要在 Dockerrun.aws.json 文件的 containerDefinitions 部分中将主实例上的端口映射到 Docker 容器上的端口。以下摘录显示了一个示例:

"portMappings": [ { "hostPort": 8080, "containerPort": 8080 } ]

请参阅 Dockerrun.aws.json v2 以了解有关 Dockerrun.aws.json 文件格式的详细信息。

失败的容器部署

如果 Amazon ECS 任务失败,您的 Elastic Beanstalk 环境中的一个或多个容器将不会启动。Elastic Beanstalk 因 Amazon ECS 任务失败不回滚多容器环境。如果容器在您的环境中无法启动,请从 AWS 管理控制台中重新部署当前版本或先前运行的版本。

部署现有版本

  1. 在您环境的区域中打开 Elastic Beanstalk 控制台。

  2. 单击应用程序名称右侧的操作,然后单击查看应用程序版本

  3. 选择应用程序的版本,然后单击部署