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

单容器 Docker 配置

本节介绍如何为部署到 Elastic Beanstalk 准备 Docker 映像和容器。您部署到单容器 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 v1

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

Dockerrun.aws.json 文件的有效键和值如下:

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 文件,或为其提供同时包含 Dockerrun.aws.jsonDockerfile 文件的 .zip 存档。在提供这两个文件时,Dockerfile 描述 Docker 映像,Dockerrun.aws.json 文件提供其他部署信息,如本节后面所述。

注意

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

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

使用私有存储库中的镜像

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

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

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

{ "AWSEBDockerrunVersion": "1", "Authentication": { "Bucket": "my-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" }

使用 Dockerfile 构建自定义映像

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

以下代码段是一个 Dockerfile 示例。在按照单容器 Docker 环境中的说明操作时,您可以按编写内容上传此 Dockerfile。在您使用此 Dockerfile 时,Elastic Beanstalk 运行游戏 2048。

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 网站上的 Dockerfile 参考