配置 Elastic Beanstalk Docker 环境 - AWS Elastic Beanstalk

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

配置 Elastic Beanstalk Docker 环境

本章介绍所有支持的 Docker 平台分支(包括ECS托管 Docker 平台分支)的其他配置信息。除非在某个部分中标识了特定的平台分支或平台分支组件,否则它适用于运行受支持的 Docker 和ECS托管 Docker 平台的所有环境。

注意

如果您的 Elastic Beanstalk 环境使用AMI亚马逊 Linux Docker 平台版本(亚马逊 Linux 2 之前的版本),请务必阅读中的其他信息。亚马逊 Linux 上的 Docker 配置AMI(之前的亚马逊 Linux 2)

在 Docker 环境中配置软件

您可以使用 Elastic Beanstalk 控制台来配置在您的环境实例上运行的软件。

在 Elastic Beanstalk 控制台中配置 Docker 环境
  1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 AWS 区域

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 在导航窗格中,选择 Configuration(配置)。

  4. Updates, monitoring, and logging(更新、监控和日志记录)配置类别中,选择 Edit(编辑)。

  5. 进行必要的配置更改。

  6. 要保存更改,请选择页面底部的 Apply(应用)。

有关在任何环境中配置软件设置的信息,请参阅环境属性和其他软件设置。以下各部分介绍特定于 Docker 的信息。

容器选项

容器选项部分具有特定于平台的选项。对于 Docker 环境,它允许您选择您的环境是否包含NGINX代理服务器。

使用 Docker Compose 的环境

如果您使用 Docker Compose 管理 Docker 环境,Elastic Beanstalk 假定您将代理服务器作为容器运行。因此,代理服务器设置默认为,而且 Elastic Beanstalk 不提供配置。NGINX

注意

即使您选择NGINX作为代理服务器,在使用 Docker Compose 的环境中也会忽略此设置。代理服务器设置仍默认为

由于使用 Docker Compose 的 Amazon Linux 2 平台上的 Docker 已禁用NGINX网络服务器代理,因此您必须按照说明生成日志以增强运行状况报告。有关更多信息,请参阅 使用 Docker Compose 生成日志以增强运行状况报告

环境属性和环境变量

环境属性部分允许您在运行您的应用程序的亚马逊弹性计算云 (AmazonEC2) 实例上指定环境配置设置。环境属性会以密钥值对的形式传递到应用程序。在 Docker 环境中,Elastic Beanstalk 将环境属性作为环境变量传递给容器。

在容器中运行的应用程序代码可以按名称引用环境变量并读取其值。读取这些环境变量的源代码将因语言而异。您可以在相应的平台主题中找到采用 Elastic Beanstalk 托管平台支持的编程语言读取环境变量值的说明。有关指向这些主题的链接的列表,请参阅环境属性和其他软件设置

使用 Docker Compose 的环境

如果您使用 Docker Compose 管理 Docker 环境,则必须进行一些额外的配置以检索容器中的环境变量。为了使容器中运行的可执行文件能够访问这些环境变量,您必须在 docker-compose.yml 中引用它们。有关更多信息,请参阅在容器中引用环境变量

在容器中引用环境变量

如果您在 Amazon Linux 2 Docker 平台上使用 Docker Compose 工具,则 Elastic Beanstalk 会在应用程序项目的根目录中生成一个名为 .env 的 Docker Compose 环境文件。此文件存储您为 Elastic Beanstalk 配置的环境变量。

注意

如果您在应用程序包中包含 .env 文件,则 Elastic Beanstalk 将不会生成 .env 文件。

为了让容器引用您在 Elastic Beanstalk 中定义的环境变量,必须遵循以下一种或两种配置方法。

  • 将 Elastic Beanstalk 生成的 .env 文件添加到 env_file 文件的 docker-compose.yml 配置选项中。

  • 直接在 docker-compose.yml 文件中定义环境变量。

以下文件提供了一个示例。示例 docker-compose.yml 文件演示了这两种方法。

  • 如果您定义环境属性 DEBUG_LEVEL=1LOG_LEVEL=error,则 Elastic Beanstalk 会为您生成以下 .env 文件:

    DEBUG_LEVEL=1 LOG_LEVEL=error
  • 在此 docker-compose.yml 文件中,env_file 配置选项指向 .env 文件,并且它还直接在 DEBUG=1 文件中定义环境变量 docker-compose.yml

    services: web: build: . environment: - DEBUG=1 env_file: - .env
注意
  • 如果在两个文件中设置相同的环境变量,则在 docker-compose.yml 文件中定义的变量的优先级高于在 .env 文件中定义的变量。

  • 注意不要在等号 (=) 和分配给变量的值之间留下空格,以防止将空格添加到字符串中。

要了解有关 Docker Compose 中环境变量的更多信息,请参阅 Compose 中的环境变量

在 Docker Compose 中对环境变量使用插值功能

Docker Amazon Linux 2 平台分支从 2023 年 7 月 28 日平台版本发布起,提供 Docker Compose 插值功能。借助此功能,可通过变量设置 Compose 文件中的值,并在运行时进行插值。有关此功能的更多信息,请参阅 Docker 文档网站上的插值

重要

如果您想在应用程序中使用此功能,请注意,您需要应用一种使用平台挂钩的方法。

必须执行此操作,因为我们已在平台引擎中执行缓解操作。该缓解操作可确保不了解新插值功能且现有应用程序使用带 $ 字符环境变量的客户实现向后兼容。默认情况下,更新后的平台引擎通过将 $ 字符替换为 $$ 字符对插值进行转义。

以下是平台挂钩脚本示例,您可以将其设置为允许使用插值功能。

#!/bin/bash : ' example data format in .env file key1=value1 key2=value2 ' envfile="/var/app/staging/.env" tempfile=$(mktemp) while IFS= read -r line; do # split each env var string at '=' split_str=(${line//=/ }) if [ ${#split_str[@]} -eq 2 ]; then # replace '$$' with '$' replaced_str=${split_str[1]//\$\$/\$} # update the value of env var using ${replaced_str} line="${split_str[0]}=${replaced_str}" fi # append the updated env var to the tempfile echo "${line}" ≫"${tempfile}" done < "${envfile}" # replace the original .env file with the tempfile mv "${tempfile}" "${envfile}"

将平台挂钩放在以下两个目录下:

  • .platform/confighooks/predeploy/

  • .platform/hooks/predeploy/

有关更多信息,请参阅本指南中扩展 Linux 平台主题中的 平台挂钩

使用 Docker Compose 生成日志以增强运行状况报告

Elastic Beanstalk 运行状况代理为 Elastic Beanstalk 环境提供操作系统和应用程序运行状况指标。它依赖于以特定格式中继信息的 Web 服务器日志格式。

Elastic Beanstalk 假设您将 Web 服务器代理作为容器运行。因此,运行 Docker Compose 的 Docker 环境禁用了 NGINX Web 服务器代理。您必须将服务器配置为以 Elastic Beanstalk 运行状况代理所使用的位置和格式写入日志。这样就可以充分利用增强型运行状况报告,即使禁用了 Web 服务器代理也是如此。

有关如何执行此操作的说明,请参阅Web 服务器日志配置

使用 Docker Compose 对 Docker 容器进行自定义日志记录

为了有效地解决问题并监控您的容器化服务,您可以通过环境管理控制台或 EB 从 Elastic Beanstalk 请求实例日志。CLI实例日志由服务包日志和结尾日志组成,可组合并打包以便您能够以高效、直接的方式查看日志和最近事件。

Elastic Beanstalk 在容器实例上创建日志目录,在 docker-compose.yml 处为 /var/log/eb-docker/containers/<service name> 文件中定义的每个服务创建一个日志目录。如果您在 Amazon Linux 2 Docker 平台上使用 Docker Compose 功能,则可以将这些目录挂载到容器文件结构中写入日志的位置。当您挂载日志目录以写入日志数据时,Elastic Beanstalk 可以从这些目录中收集日志数据。

如果您的应用程序位于不使用 Docker Compose 的 Docker 平台上,则可以按照 使用 Docker Compose 对 Docker 容器进行自定义日志记录中所述的标准过程进行操作。

将服务的日志文件配置为可撤回的结尾文件和服务包日志
  1. 编辑 docker-compose.yml 文件。

  2. 在服务的 volumes 键下添加绑定挂载,如下所示:

    "${EB_LOG_BASE_DIR}/<service name>:<log directory inside container>

    在下面的示例 docker-compose.yml 文件中:

    • nginx-proxy<service name>

    • /var/log/nginx<log directory inside container>

    services: nginx-proxy: image: "nginx" volumes: - "${EB_LOG_BASE_DIR}/nginx-proxy:/var/log/nginx"

  • var/log/nginx 目录包含容器中 nginx-proxy 服务的日志,它将映射到主机上的 /var/log/eb-docker/containers/nginx-proxy 目录。

  • 此目录中的所有日志现在都可以通过 Elastic Beanstalk 的请求实例日志功能作为捆绑日志和结尾日志进行检索。

注意
  • $ {EB_ _ LOG BASE _DIR} 是 Elastic Beanstalk 设置的环境变量,其值为。/var/log/eb-docker/containers

  • Elastic Beanstalk 会自动为 /var/log/eb-docker/containers/<service name> 文件中的每个服务创建 docker-compose.yml 目录。

Docker 映像

Elastic Beanstalk 的 Docker 和ECS托管 Docker 平台分支支持使用存储在公共或私有在线镜像存储库中的 Docker 镜像。

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

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

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

  • 其他在线存储库中的映像由域名 (例如,quay.io/assemblyline/ubuntuaccount-id.dkr.ecr.us-east-2.amazonaws.com/ubuntu:trusty) 进行进一步限定。

对于仅使用 Docker 平台的环境,您还可以在创建环境期间使用 Dockerfile 构建自己的映像。有关更多信息,请参阅 使用 Dockerfile 构建自定义映像。ECS托管 Docker 平台平台不支持此功能。

配置 Docker 环境的托管更新

利用托管平台更新,您可以将环境配置为按计划自动更新为平台的最新版本。

在使用 Docker 环境时,您可能希望确定在新平台版本包括新 Docker 版本时,是否应跨 Docker 版本进行自动平台更新。从运行高于 2.9.0 的 Docker 平台版本的环境中进行更新时,Elastic Beanstalk 支持跨 Docker 版本的托管平台更新。当新平台版本包含 Docker 的新版本时,Elastic Beanstalk 会递增次要更新版本号。因此,要允许托管平台跨 Docker 版本更新,请为托管平台同时启用次版本更新和修补版本更新。要防止托管平台跨 Docker 版本更新,请为托管平台更新启用仅应用修补版本更新。

例如,以下配置文件允许托管平台在UTC每周二上午 9:00 更新次要版本和补丁版本更新,从而允许在 Docker 版本之间进行托管更新:

例 .ebextensions/ .config managed-platform-update
option_settings: aws:elasticbeanstalk:managedactions: ManagedActionsEnabled: true PreferredStartTime: "Tue:09:00" aws:elasticbeanstalk:managedactions:platformupdate: UpdateLevel: minor

对于运行 Docker 平台版本 2.9.0 或更早版本的环境,在新平台版本包括新 Docker 版本时,Elastic Beanstalk 从不执行托管平台更新。

Docker 配置命名空间

您可以使用配置文件设置配置选项并在部署期间执行其他实例配置。配置选项可以通过您使用的 Elastic Beanstalk 服务或平台定义并组织到命名空间 中。

注意

此信息仅适用于未运行 Docker Compose 的 Docker 环境。此选项在运行 Docker Compose 的 Docker 环境中具有不同的行为。有关使用 Docker Compose 的代理服务的更多信息,请参阅 容器选项

除了所有 Elastic Beanstalk 环境支持的选项外,Docker 平台还支持以下命名空间中的选项:

  • aws:elasticbeanstalk:environment:proxy – 为您的环境选择代理服务器。Docker 支持运行 Nginx 或没有代理服务器。

以下示例配置文件将 Docker 环境配置为不运行代理服务器。

例 .ebextensions/docker-settings.config
option_settings: aws:elasticbeanstalk:environment:proxy: ProxyServer: none

亚马逊 Linux 上的 Docker 配置AMI(之前的亚马逊 Linux 2)

如果您的 Elastic Beanstalk Docker 环境使用亚马逊 AMI Linux 平台版本(亚马逊 Linux 2 之前的版本),请阅读本节中的其他信息。

如果您使用私有存储库中的映像,则此信息对您有用。从 Docker 1.7 版开始,docker login 命令更改了身份验证文件的名称和格式。亚马逊 Linux AMI Docker 平台版本(亚马逊 Linux 2 之前的版本)需要较旧的~/.dockercfg格式配置文件。

对于 Docker 1.7 版和更高版本,docker login 命令采用以下格式在 ~/.docker/config.json 中创建身份验证文件。

{ "auths":{ "server":{ "auth":"key" } } }

对于 Docker 1.6.2 版和更早版本,docker login 命令采用以下格式在 ~/.dockercfg 中创建身份验证文件。

{ "server" : { "auth" : "auth_token", "email" : "email" } }

要转换config.json文件,请移除外auths键,添加email密钥,然后将JSON文档扁平化以匹配旧格式。

在 Amazon Linux 2 Docker 平台版本上,Elastic Beanstalk 使用较新的身份验证文件名和格式。如果您使用的是 Amazon Linux 2 Docker 平台版本,则可以在不进行任何转换的情况下使用 docker login 命令创建的身份验证文件。

为了提高亚马逊 Linux 上的性能AMI,Elastic Beanstalk 为您的 Docker 环境的亚马逊实例配置了EBS两个亚马逊存储卷。EC2除了为所有 Elastic Beanstalk 环境预配置的根卷之外,还为 Docker 环境中的映像存储预配置了第二个 12GB 的卷(名为 xvdcz)。

如果您需要更多存储空间或增加 Docker 镜像IOPS的存储空间,则可以使用 aws: autoscaling: launchconfiguration 命名空间中的BlockDeviceMapping配置选项自定义图像存储量。

例如,以下配置文件在预配置 IOPS 500 的情况下将存储卷的大小增加到 100 GB:

例 .ebextensions/blockdevice-xvdcz.config
option_settings: aws:autoscaling:launchconfiguration: BlockDeviceMappings: /dev/xvdcz=:100::io1:500

如果您使用 BlockDeviceMappings 选项为应用程序配置附加卷,那么您应该包括 xvdcz 的映射以确保创建了该卷。以下示例配置两个卷,一个是具有默认设置的映像存储卷 xvdcz,另一个是名为 sdh 的 24 GB 应用程序卷:

例 .ebextensions/blockdevice-sdh.config
option_settings: aws:autoscaling:launchconfiguration: BlockDeviceMappings: /dev/xvdcz=:12:true:gp2,/dev/sdh=:24
注意

当您更改此命名空间中的设置时,Elastic Beanstalk 会将环境中的所有实例替换为运行新配置的实例。有关详细信息,请参阅 配置更改