配置 Docker 环境 - AWS Elastic Beanstalk
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

配置 Docker 环境

有几种方法可以配置 Elastic Beanstalk Docker 环境的行为。

注意

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

在 Docker 环境中配置软件

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

在 Elastic Beanstalk 控制台中配置 Docker 环境

  1. 打开 Elastic Beanstalk 控制台,然后在 Regions (区域) 列表中选择您的 AWS 区域。

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

    注意

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

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

  4. Software (软件) 配置类别中,选择 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 Web 服务器代理,因此您必须按照为增强型运行状况报告生成日志的说明操作。有关更多信息,请参阅 为增强型运行状况报告生成日志 (Docker Compose)

环境属性和环境变量

Environment properties (环境属性) 部分,您可以在运行应用程序的 Amazon Elastic Compute Cloud (Amazon EC2) 实例上指定环境配置设置。环境属性会以密钥值对的形式传递到应用程序。在 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 文件添加到 docker-compose.yml 文件的 env_file 配置选项中。

  • 直接在 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 文件,并且它还直接在 docker-compose.yml 文件中定义环境变量 DEBUG=1

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

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

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

为增强型运行状况报告生成日志 (Docker Compose)

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

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

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

Docker 容器自定义日志记录 (Docker Compose)

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

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

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

将服务的日志文件配置为可撤回的结尾文件和服务包日志

  1. 编辑 docker-compose.yml 文件。

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

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

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

    • nginx-proxy<服务名称>

    • /var/log/nginx<容器内的日志目录>

    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 会自动为 docker-compose.yml 文件中的每个服务创建 /var/log/eb-docker/containers/<service name> 目录。

Docker 映像

Elastic Beanstalk 的 Docker 和多容器 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 构建自定义映像。多容器 Docker 平台不支持此功能。

您可以使用 Amazon Elastic Container Registry (Amazon ECR) 存储 AWS 中的自定义 Docker 映像。当您将 Docker 映像存储在 Amazon ECR 中时,Elastic Beanstalk 会自动使用环境的实例配置文件向 Amazon ECR 注册表进行身份验证,因此您无需生成身份验证文件并将其上传到 Amazon Simple Storage Service (Amazon S3)。

但您需要为实例提供访问 Amazon ECR 存储库中的镜像的权限 (通过将权限添加到环境的实例配置文件中)。您可以将 AmazonEC2ContainerRegistryReadOnly 托管策略附加到实例配置文件以提供对您账户中所有 Amazon ECR 存储库的只读访问权限,或通过使用以下模板创建自定义策略来授予对单个存储库的访问权限:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowEbAuth", "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken" ], "Resource": [ "*" ] }, { "Sid": "AllowPull", "Effect": "Allow", "Resource": [ "arn:aws:ecr:us-east-2:account-id:repository/repository-name" ], "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:GetRepositoryPolicy", "ecr:DescribeRepositories", "ecr:ListImages", "ecr:BatchGetImage" ] } ] }

将上述策略中的 Amazon 资源名称 (ARN) 替换为存储库的 ARN。

Dockerrun.aws.json 文件中,按 URL 引用镜像。对于 Docker 平台,URL 进入 Image 定义:

"Image": { "Name": "account-id.dkr.ecr.us-east-2.amazonaws.com/repository-name:latest", "Update": "true" },

对于多容器 Docker 平台,请在容器定义对象中使用 image 键:

"containerDefinitions": [ { "name": "my-image", "image": "account-id.dkr.ecr.us-east-2.amazonaws.com/repository-name:latest",

要使用由在线注册表托管的私有存储库中的 Docker 映像,必须提供一个身份验证文件,其中含有向注册表进行身份验证所需的信息。

使用 docker login 命令生成身份验证文件。对于 Docker Hub 上的存储库,请运行 docker login

$ docker login

对于其他注册表,请包括注册表服务器的 URL:

$ docker login registry-server-url
注意

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

将名为 .dockercfg 的身份验证文件副本上传到安全的 Amazon S3 存储桶。Amazon S3 存储桶必须托管在使用它的环境所在的 AWS 区域中。Elastic Beanstalk 无法从托管在其他区域的 Amazon S3 存储桶下载文件。在实例配置文件中授予 IAM 角色执行 s3:GetObject 操作的权限。有关详细信息,请参阅 管理 Elastic Beanstalk 实例配置文件

Dockerrun.aws.json 文件的 Authentication (v1) 或 authentication (v2) 参数中包含 Amazon S3 存储桶信息。

有关 Docker 环境的 Dockerrun.aws.json 格式的更多信息,请参阅Docker 配置。对于多容器环境,请参阅多容器 Docker 配置

有关身份验证文件的更多信息,请参阅 Docker 网站上的在 Docker Hub 上存储映像docker login

回收 Docker 存储空间

对于在运行容器中创建而后删除的文件,Docker 不会清除 (删除) 其使用的空间;此空间只有在删除容器后才返回到池中。当容器进程需要创建和删除很多文件时,如定期转储数据库备份、填充应用程序存储空间等,这就成了一个问题。

一种解决方案是增加应用程序存储空间的大小,如上一部分所述。另一个选项性能较差:定期 (如使用 fstrim) 在主机操作系统上针对容器可用空间运行 cron,以回收未使用的容器数据块。

docker ps -q | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ sudo fstrim /proc/Z/root/

配置 Docker 环境的托管更新

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

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

例如,以下配置文件在每个星期二上午 9:00 (UTC) 启用次版本更新和修补版本更新,从而允许跨 Docker 版本的托管更新:

例 .ebextensions/managed-platform-update.config

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

Amazon Linux AMI(在 Amazon Linux 2 之前)上的 Docker 配置

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

如果您使用私有存储库中的映像,则此信息对您有用。从 Docker 1.7 版开始,docker login 命令更改了身份验证文件的名称和格式。Amazon Linux AMI Docker 平台版本(在 Amazon 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 命令创建的身份验证文件。

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

如果您需要为 Docker 映像增加存储空间或者提高 IOPS,可以使用 aws:autoscaling:launchconfiguration 命名空间中的 BlockDeviceMapping 配置选项来自定义映像存储卷。

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

例 .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 会将环境中的所有实例替换为运行新配置的实例。有关详细信息,请参阅配置更改