准备 Docker 映像以部署到 Elastic Beanstalk - AWS Elastic Beanstalk

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

准备 Docker 映像以部署到 Elastic Beanstalk

本节介绍如何准备 Docker 映像,以便使用运行 AL2 或 AL2023 的 Docker 平台分支部署到 Elastic Beanstalk。您所需的配置文件取决于您的映像是本地映像、远程映像,以及您是否使用 Docker Compose。

注意

有关启动 Docker 环境的过程示例,请参阅 Docker 快速入门 主题。

在 Elastic Beanstalk 中使用 Docker Compose 管理映像

您可以选择使用 Docker Compose 在一个 YAML 文件中管理各种服务。要了解有关 Docker Compose 的更多信息,请参阅 Docker 网站上的 Why use Compose?

  • 创建 docker-compose.yml。如果使用 Docker Compose 来通过 Elastic Beanstalk 管理应用程序,则需要此文件。如果您的所有部署都来自公共存储库中的映像,则不需要其他配置文件。如果您的部署的源映像位于私有存储库中,则需要进行一些额外配置。有关更多信息,请参阅 Using images from a private repository。有关 docker-compose.yml 文件的更多信息,请参阅 Docker 网站上的 Compose 文件参考

  • Dockerfile 是可选项。如果您需要 Elastic Beanstalk 来构建和运行本地自定义映像,请创建一个。有关 Dockerfile 的更多信息,请参阅 Docker 网站上的 Dockerfile 参考

  • 您可能需要创建一个 .zip 文件。如果您仅使用 Dockerfile 文件来部署应用程序,则无需创建一个。如果使用其他配置文件,则 .zip 文件必须包含 Dockerfiledocker-compose.yml 文件、您的应用程序文件和任何应用程序文件依赖项。Dockerfiledocker-compose.yml 必须位于 .zip 存档的根级或顶级。如果您使用 EB CLI 部署应用程序,它将为您创建一个 .zip 文件。

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

在 Elastic Beanstalk 中不使用 Docker Compose 管理映像

如果您没有使用 Docker Compose 来管理 Docker 映像,则需要配置一个 Dockerfile 和/或 Dockerrun.aws.json 文件。

  • 创建 Dockerfile 以使 Elastic Beanstalk 在本地构建并运行自定义映像。

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

  • 您可能需要创建一个 .zip 文件。如果您只使用其中一个文件(DockerfileDockerrun.aws.json),则无需创建 .zip 文件。如果您同时使用这两个文件,则需要一个 .zip 文件。.zip 文件必须同时包含 DockerfileDockerrun.aws.json,以及包含您的应用程序文件和所有应用程序文件依赖项的文件。如果您使用 EB CLI 部署应用程序,它将为您创建一个 .zip 文件。

Dockerrun.aws.json v1 配置文件

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

Dockerrun.aws.json 版本

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

  • Docker AL2 平台和 AL2023 平台使用以下版本的文件。

    • Dockerrun.aws.json v3 — 使用 Docker Compose 的环境。

    • Dockerrun.aws.json v1 — 不使用 Docker Compose 的环境。

  • 在 Amazon Linux 2 上运行的 ECS在 AL2023 上运行的 ECS 使用 Dockerrun.aws.json v2 文件。已停用的平台 ECS-The Multicontainer Docker Amazon Linux AMI(AL1)也使用此相同版本。

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

AWSEBDockerrunVersion

(必需)如果没有使用 Docker Compose 来管理映像,请指定版本号 1

身份验证

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

请参阅本章后面的使用私有存储库中的映像中的 使用 Elastic Beanstalk 中私有存储库中的图像

映像

指定现有 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 环境中查看来自亚马逊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 文件中指定的映像。

使用 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 文档网站上的使用多阶段构建