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

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

Docker 配置

本节介绍如何为部署到 Elastic Beanstalk 准备 Docker 映像和容器。

带有 Docker Compose 的 Docker 环境

本节介绍如何为部署到 Elastic Beanstalk 准备 Docker 映像和容器。如果您还使用 Docker Compose 工具,您在 Docker 环境中部署到 Elastic Beanstalk 的任何 Web 应用程序都必须包含一个 docker-compose.yml 文件。您可以通过执行以下操作之一将 Web 应用程序作为容器化服务部署到 Elastic Beanstalk:

  • 创建一个用于将 Docker 映像从托管存储库部署到 Elastic Beanstalk 的 docker-compose.yml 文件。如果所有部署都来自公有存储库中的映像,则不需要其他文件。(如果您的部署必须从专用存储库获取映像,则需要包含其他配置文件以进行身份验证。有关更多信息,请参阅使用私有存储库中的映像。) 有关 docker-compose.yml 文件的更多信息,请参阅 Docker 网站上的 Compose 文件参考

  • 创建 Dockerfile 以使 Elastic Beanstalk 生成并运行自定义映像。此文件是可选的,具体取决于您的部署要求。有关 Dockerfile 的更多信息,请参阅 Docker 网站上的 Dockerfile 参考

  • 创建一个包含应用程序文件、应用程序文件依赖项、.zip 以及 Dockerfile 文件的 docker-compose.yml 文件。如果您使用 EB CLI 部署应用程序,它将为您创建一个 .zip 文件。这两个文件必须位于 .zip 存档的根级或顶级。

    如果您只使用 docker-compose.yml 文件部署应用程序,则无需创建 .zip 文件。

本主题为语法参考。有关使用 Elastic Beanstalk 启动 Docker 环境的详细步骤,请参阅 使用 Docker 平台分支

要了解有关 Docker Compose 以及如何安装它的更多信息,请参阅 Docker 网站 Docker Compose 概述安装 Docker Compose

注意

如果您不使用 Docker Compose 配置 Docker 环境,也不应该使用 docker-compose.yml 文件。而是使用 Dockerrun.aws.json 文件和/或 Dockerfile

有关更多信息,请参阅Docker 平台的配置(不含 Docker Compose)

使用私有存储库中的映像

Elastic Beanstalk 必须使用托管私有存储库的在线注册表进行身份验证,然后才能从私有存储库中提取和部署您的映像。我们提供了两个选项的示例,用于存储和检索 Elastic Beanstalk 环境的凭证,以便向存储库进行身份验证。

  • 这些区域有:Amazon Secrets Manager

  • Dockerrun.aws.json v3 文件

您可以将 Elastic Beanstalk 配置为在它开始部署过程之前登录私有存储库。这样,Elastic Beanstalk 就可以从存储库访问映像并将这些映像部署到您的 Elastic Beanstalk 环境。

此配置在 Elastic Beanstalk 部署过程的预构建 阶段启动事件。您可以在 .ebextentions 配置目录中进行此设置。该配置使用平台挂钩脚本,这些脚本调用 docker login 对托管私有存储库的联机注册表进行身份验证。以下是这些配置步骤的详细分解说明。

使用 Amazon Secrets Manager 将 Elastic Beanstalk 配置为向私有存储库进行身份验证
注意

必须授予特定权限才能完成这些步骤。有关更多信息,请参阅以下参考。

  • 步骤 2 中,您需要相应权限才能创建密钥。有关更多信息,请参阅《Amazon Secrets Manager 用户指南》中的示例:创建密钥的权限

  • 步骤 3 中,您需要相应权限才能使用 secretsmanager 动态引用检索密钥。有关更多信息,请参阅Amazon Secrets Manager 用户指南中的示例:检索密钥值的权限

  1. 按如下方式创建 .ebextensions 目录结构。

    ├── .ebextensions │ └── env.config ├── .platform │ ├── confighooks │ │ └── prebuild │ │ └── 01login.sh │ └── hooks │ └── prebuild │ └── 01login.sh ├── docker-compose.yml
  2. 使用 Amazon Secrets Manager 保存您的私有存储库的凭证,以便 Elastic Beanstalk 在需要时可以检索您的凭证。为此,请运行 Secrets Manager create-secret Amazon CLI 命令。

    aws secretsmanager create-secret \ --name MyTestSecret \ --description "My image repo credentials created with the CLI." \ --secret-string "{\"USER\":\"EXAMPLE-USERNAME\",\"PASSWD\":\"EXAMPLE-PASSWORD\"}"
  3. 创建以下 env.config 文件并将其放在 .ebextensions 目录中,如前面的目录结构所示。此配置使用 aws:elasticbeanstalk:application:environment 命名空间通过对 Amazon Secrets Manager 的动态引用初始化 USERPASSWD Elastic Beanstalk 环境变量。有关 secretsmanager 动态引用的更多信息,请参阅《Amazon Secrets Manager 用户指南》中的在 Amazon CloudFormation 资源中检索 Amazon Secrets Manager 密钥

    注意

    脚本中的 USERPASSWD 必须与前面的 secretsmanager create-secret 命令中使用的相同字符串匹配。

    option_settings: aws:elasticbeanstalk:application:environment: USER: '{{resolve:secretsmanager:MyTestSecret:SecretString:USER}}' PASSWD: '{{resolve:secretsmanager:MyTestSecret:SecretString:PASSWD}}'
  4. 创建以下 01login.sh 脚本文件并将其放在以下目录中(也显示在前面的目录结构中):

    • .platform/confighooks/prebuild

    • .platform/hooks/prebuild

    ### example 01login.sh #!/bin/bash USER=/opt/elasticbeanstalk/bin/get-config environment -k USER /opt/elasticbeanstalk/bin/get-config environment -k PASSWD | docker login -u $USER --password-stdin

    01login.sh 脚本将调用 get-config 平台脚本来检索存储库凭证,然后登录到存储库。它将用户名存储在 USER 脚本变量中。在下一行中,它将检索密码。该脚本不将密码存储在脚本变量中,而是将密码直接传送给 stdin 输入流中的 docker login 命令。--password-stdin 选项使用输入流,因此您不必将密码存储在变量中。有关使用 Docker 命令行界面进行身份验证的更多信息,请参阅 Docker 文档网站上的 docker login

    注意
    • 所有脚本文件都必须具有执行权限。使用 chmod +x 对挂钩文件设置执行权限。对于 2022 年 4 月 29 日或之后发布的所有基于 Amazon Linux 2 的平台版本,Elastic Beanstalk 会自动向所有平台挂钩脚本授予执行权限。在这种情况下,您无需手动授予执行权限。有关这些平台版本的列表,请参阅 Amazon Elastic Beanstalk 发布说明指南中的 2022 年 4 月 29 日 - Linux 平台发布说明。

    • 挂钩文件既可以是二进制文件,也可以是以包含其解释器路径的 #! 行开头的脚本文件,例如 #!/bin/bash

    • 有关更多信息,请参阅扩展 Elastic Beanstalk Linux 平台 中的 平台挂钩

在 Elastic Beanstalk 使用托管私有存储库的在线注册表进行身份验证之后,您可以提取和部署您的映像。

本节介绍向私有存储库验证 Elastic Beanstalk 的另一种方法。使用此方法,您可以使用 Docker 命令生成身份验证文件,然后将身份验证文件上传到 Amazon S3 存储桶。您还必须在 Dockerrun.aws.json v3 文件中包含存储桶信息。

生成身份验证文件并提供给 Elastic Beanstalk
  1. 使用 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 配置中的相关信息。

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

  2. 将名为 .dockercfg 的身份验证文件的副本上传到安全的 Amazon S3 存储桶。

    • Amazon S3 存储桶必须托管在使用它的环境所在的相同 Amazon Web Services 区域 中。Elastic Beanstalk 无法从托管在其他区域的 Amazon S3 存储桶下载文件。

    • 在实例配置文件中授予 IAM 角色执行 s3:GetObject 操作的权限。有关更多信息,请参阅管理 Elastic Beanstalk 实例配置文件

  3. Authentication 文件的 Dockerrun.aws.json v3 参数中包含 Amazon S3 存储桶信息。

    以下是 Dockerrun.aws.json v3 文件的示例。

    { "AWSEBDockerrunVersion": "3", "Authentication": { "bucket": "DOC-EXAMPLE-BUCKET", "key": "mydockercfg" } }
    注意

    AWSEBDockerrunVersion 参数指示 Dockerrun.aws.json 文件的版本。

    • Docker Amazon Linux 2 平台将 Dockerrun.aws.json v3 文件用于使用 Docker Compose 的环境。它将 Dockerrun.aws.json v1 文件用于不使用 Docker Compose 的环境。

    • 多容器 Docker Amazon Linux AMI 平台使用 Dockerrun.aws.json v2 文件。

在 Elastic Beanstalk 可以使用托管私有存储库的在线注册表进行身份验证之后,可以部署和提取您的映像。

使用 Dockerfile 构建自定义映像

如果您尚未在存储库中托管现有映像,则需要创建 Dockerfile

以下代码段是一个 Dockerfile 示例。如果您按照 使用 Docker 平台分支 中的说明进行操作,则可以按编写内容上传此 Dockerfile。在您使用此 Dockerfile 时,Elastic Beanstalk 运行游戏 2048。

有关您可以包含在 Dockerfile 中的指令的更多信息,请参阅 Docker 网站上的 Dockerfile 参考

FROM ubuntu:12.04 RUN apt-get update RUN apt-get install -y nginx zip curl RUN echo "daemon off;" >> /etc/nginx/nginx.conf RUN curl -o /usr/share/nginx/www/master.zip -L https://codeload.github.com/gabrielecirulli/2048/zip/master RUN cd /usr/share/nginx/www/ && unzip master.zip && mv 2048-master/* . && rm -rf 2048-master master.zip EXPOSE 80 CMD ["/usr/sbin/nginx", "-c", "/etc/nginx/nginx.conf"]
注意

您可以从单个 Dockerfile 运行多阶段构建来生成较小尺寸的映像,同时显著降低复杂性。有关更多信息,请参阅 Docker 文档网站上的使用多阶段构建

Docker 平台的配置(不含 Docker Compose)

如果您的 Elastic Beanstalk Docker 环境不使用 Docker Compose,请阅读以下部分中的其他信息。

您部署到 Docker 环境中的 Elastic Beanstalk 的任何 Web 应用程序都必须包含 DockerfileDockerrun.aws.json 文件。您可以通过执行以下操作之一将 Web 应用程序从 Docker 容器部署到 Elastic Beanstalk:

  • 创建 Dockerfile 以使 Elastic Beanstalk 生成并运行自定义映像。

  • 创建一个用于将 Docker 映像从托管存储库部署到 Elastic Beanstalk 的 Dockerrun.aws.json 文件。

  • 创建一个包含应用程序文件、应用程序文件依赖项、.zip 以及 Dockerfile 文件的 Dockerrun.aws.json 文件。如果您使用 EB CLI 部署应用程序,它将为您创建一个 .zip 文件。

    如果您只用一个 Dockerfile 或只用一个 Dockerrun.aws.json 文件部署应用程序,则无需创建 .zip 文件。

本主题为语法参考。有关启动 Docker 环境的详细步骤,请参阅 使用 Docker 平台分支

小节目录

    Dockerrun.aws.json 文件描述如何将远程 Docker 映像部署为 Elastic Beanstalk 应用程序。此 JSON 文件特定于 Elastic Beanstalk。如果应用程序在托管存储库中提供的映像上运行,您可以在 Dockerrun.aws.json v1 文件中指定该映像并忽略 Dockerfile

    Dockerrun.aws.json v1 文件的有效键和值包括以下操作:

    AWSEBDockerrunVersion

    (必需) 为单容器 Docker 环境将版本号指定为值 1

    身份验证

    (仅对私有存储库必需)指定存储 .dockercfg 文件的 Amazon S3 对象。

    请参阅 使用私有存储库中的映像

    映像

    指定现有 Docker 存储库上的 Docker 基本映像,您将从其构建 Docker 容器。指定 Name 键的值:对于 Docker Hub 上的映像,采用 <organization>/<image name> 的格式;对于其他站点,采用 <site>/<organization name>/<image name> 的格式。

    Dockerrun.aws.json 文件中指定一个映像后,您的 Elastic Beanstalk 环境中的每个实例都运行 docker pull 来运行该映像。可以选择包含 Update 键。默认值为 true,指示 Elastic Beanstalk 检查存储库,提取映像的所有更新并覆盖任何缓存的映像。

    使用 Dockerfile 时,请勿在 Dockerrun.aws.json 文件中指定 Image 键。当 Dockerfile 中所述的映像存在时,Elastic Beanstalk 始终构建并使用该映像。

    端口

    (指定 Image 键时必需)列出要在 Docker 容器上公开的端口。Elastic Beanstalk 使用 ContainerPort 值将 Docker 容器连接到主机上运行的反向代理。

    您可以指定多个容器端口,但 Elastic Beanstalk 只使用第一个端口。它只使用此端口将您的容器连接到主机的反向代理并路由来自公有 Internet 的请求。如果您使用的是 Dockerfile,则第一个 ContainerPort 值应与 DockerfileEXPOSE 列表中的第一个条目匹配。

    您可以选择在 HostPort 中指定端口列表。HostPort 条目指定 ContainerPort 值映射到的主机端口。如果您不指定 HostPort 值,则该值默认为 ContainerPort 值。

    { "Image": { "Name": "image-name" }, "Ports": [ { "ContainerPort": 8080, "HostPort": 8000 } ] }

    将卷从 EC2 实例映射到 Docker 容器。指定要映射的一个或多个卷数组。

    { "Volumes": [ { "HostDirectory": "/path/inside/host", "ContainerDirectory": "/path/inside/container" } ] ...
    日志系统

    指定应用程序将日志写入到的容器内目录。当您请求结尾日志或捆绑日志时,Elastic Beanstalk 会将此目录中的所有日志上传到 Amazon S3。如果您将日志轮换到此目录中名为 rotated 的文件夹,则还可以将 Elastic Beanstalk 配置为将轮换的日志上传到 Amazon S3 以进行永久存储。有关更多信息,请参阅查看您的 Elastic Beanstalk 环境中的 Amazon EC2 实例的日志

    命令

    指定要在容器中运行的命令。如果您指定 EntrypointCommand 将作为参数添加至 Entrypoint。有关更多信息,请参阅 Docker 文档中的 CMD

    Entrypoint

    指定要在容器启动时运行的默认命令。有关更多信息,请参阅 Docker 文档中的 ENTRYPOINT

    以下代码段是演示单容器的 Dockerrun.aws.json 文件的语法的一个示例。

    { "AWSEBDockerrunVersion": "1", "Image": { "Name": "janedoe/image", "Update": "true" }, "Ports": [ { "ContainerPort": "1234" } ], "Volumes": [ { "HostDirectory": "/var/app/mydb", "ContainerDirectory": "/etc/mysql" } ], "Logging": "/var/log/nginx", "Entrypoint": "/app/bin/myapp", "Command": "--argument" }

    您可以仅向 Elastic Beanstalk 提供 Dockerrun.aws.json 文件,也可以提供包含 .zipDockerrun.aws.json 文件的 Dockerfile 存档。在提供这两个文件时,Dockerfile 描述 Docker 映像,Dockerrun.aws.json 文件提供其他部署信息,如本节后面所述。

    注意

    这两个文件必须位于 .zip 存档的根级或顶级。请不要从包含这些文件的目录生成存档。而是导航到该目录并在其中生成存档。

    在提供这两个文件时,请不要在 Dockerrun.aws.json 文件中指定映像。Elastic Beanstalk 生成和使用 Dockerfile 中描述的映像,并忽略 Dockerrun.aws.json 文件中指定的映像。

    Authentication 文件的 Dockerrun.aws.json v1 参数中添加有关包含身份验证文件的 Amazon S3 存储桶的信息。确保 Authentication 参数包含有效的 Amazon S3 存储桶和密钥。Amazon S3 存储桶必须托管在使用它的环境所在的相同 Amazon Web Services 区域 中。Elastic Beanstalk 不会从托管在其他区域的 Amazon S3 存储桶下载文件。

    有关生成和上传身份验证文件的信息,请参阅 使用私有存储库中的映像

    下面的示例演示了 DOC-EXAMPLE-BUCKET 存储桶中一个名为 mydockercfg 的身份验证文件如何使用第三方注册表中的私有映像。

    { "AWSEBDockerrunVersion": "1", "Authentication": { "Bucket": "DOC-EXAMPLE-BUCKET", "Key": "mydockercfg" }, "Image": { "Name": "quay.io/johndoe/private-image", "Update": "true" }, "Ports": [ { "ContainerPort": "1234" } ], "Volumes": [ { "HostDirectory": "/var/app/mydb", "ContainerDirectory": "/etc/mysql" } ], "Logging": "/var/log/nginx" }