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

配置 Docker 环境

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

访问 Elastic Beanstalk 环境的软件配置

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择 Configuration

  4. Software 配置卡上,选择 Modify

“日志选项”部分有两个设置:

  • 实例配置文件 – 您环境的实例配置文件,必须对您环境的 Amazon S3 存储桶具有写入访问权限以便上传日志。

  • 启用日志文件轮换至 Amazon S3 的功能 – 配置您的环境中的实例以上传轮换日志

环境属性部分让您可指定可从应用程序代码中读取的环境变量。

Docker 映像

Elastic Beanstalk 的单容器和多容器 Docker 平台支持使用公有或私有在线映像存储库中存储的 Docker 映像。

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

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

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

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

您还可以在环境创建期间使用 Dockerfile 构建自己的映像,这仅限于单容器环境。有关详细信息,请参阅使用 Dockerfile 构建自定义映像

使用 Amazon ECR 存储库中的映像

您可使用 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": "2008-10-17", "Statement": [ { "Sid": "AllowEbAuth", "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken" ], "Resource": [ "*" ] }, { "Sid": "AllowPull", "Effect": "Allow", "Resource": [ "arn:aws-cn:ecr:us-west-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 引用镜像。对于单容器平台,URL 进入 Image 定义:

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

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

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

使用私有存储库中的镜像

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

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

$ docker login

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

$ docker login registry-server-url

重要

从 Docker 1.7 版开始,docker login 命令更改了身份验证文件的名称和格式。Elastic Beanstalk 需要较早版本的 ~/.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 S3 存储桶。Amazon S3 存储桶必须托管于与使用它的环境相同的区域中。Elastic Beanstalk 无法从托管在其他区域中的 Amazon S3 存储桶下载文件。在实例配置文件中授予 IAM 角色执行 s3:GetObject 操作的权限。有关详细信息,请参阅 管理 Elastic Beanstalk 实例配置文件

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

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

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

配置额外的存储卷

为了提高性能,Elastic Beanstalk 为您的 Docker 环境的 EC2 实例配置了两个 Amazon EBS 存储卷。除了为所有 Elastic Beanstalk 环境预配置的根卷之外,在 Docker 环境中配置了第二个 12 GB 的卷用于映像存储,名为 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 会使用运行新配置的实例替换环境中的所有实例。有关详细信息,请参阅配置更改

回收 Docker 存储空间

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

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

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

配置 Docker 环境的托管更新

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

在使用 Docker 环境时,您可能希望确定在新平台版本包含新 Docker 版本时,是否应跨 Docker 版本进行自动平台更新。在从运行的 Docker 平台版本高于 2.9.0 的环境更新时,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 从不执行托管平台更新。