

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

# 准备 Docker 映像以部署到 Elastic Beanstalk
<a name="single-container-docker-configuration"></a>

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

**注意**  
 有关启动 Docker 环境的过程示例，请参阅 [QuickStart 适用于 Docker](docker-quickstart.md) 主题。

**Topics**
+ [在 Elastic Beanstalk 中使用 Docker Compose 管理映像](#single-container-docker-configuration-dc)
+ [在 Elastic Beanstalk 中不使用 Docker Compose 管理映像](#single-container-docker-configuration.no-compose)
+ [使用 Dockerfile 构建自定义映像](#single-container-docker-configuration.dockerfile)

## 在 Elastic Beanstalk 中使用 Docker Compose 管理映像
<a name="single-container-docker-configuration-dc"></a>

您可以选择使用 Docker Compose 在一个 YAML 文件中管理各种服务。要了解有关 Docker Compose 的更多信息，请参阅 Docker 网站上的 [Why use Compose?](https://docs.docker.com/compose/intro/features-uses/)。
+ 创建 `docker-compose.yml`。如果使用 Docker Compose 来通过 Elastic Beanstalk 管理应用程序，则需要此文件。如果您的所有部署都来自公共存储库中的映像，则不需要其他配置文件。如果您的部署的源映像位于私有存储库中，则需要进行一些额外配置。有关更多信息，请参阅 [Using images from a private repository](docker-configuration.remote-repo.md)。有关 `docker-compose.yml` 文件的更多信息，请参阅 Docker 网站上的 [Compose 文件参考](https://docs.docker.com/compose/compose-file/)。
+  `Dockerfile` 是可选项。如果您需要 Elastic Beanstalk 来构建和运行本地自定义映像，请创建一个。有关 `Dockerfile` 的更多信息，请参阅 Docker 网站上的 [Dockerfile 参考](https://docs.docker.com/engine/reference/builder/)。
+  您可能需要创建一个 `.zip` 文件。如果您仅使用 `Dockerfile` 文件来部署应用程序，则无需创建一个。如果使用其他配置文件，则 .zip 文件必须包含 `Dockerfile`、`docker-compose.yml` 文件、您的应用程序文件和任何应用程序文件依赖项。`Dockerfile` 和 `docker-compose.yml` 必须位于 .zip 存档的根级或顶级。如果您使用 EB CLI 部署应用程序，它将为您创建一个 .zip 文件。

要了解有关 Docker Compose 以及如何安装它的更多信息，请参阅 Docker 网站 [Docker Compose 概述](https://docs.docker.com/compose/)和[安装 Docker Compose](https://docs.docker.com/compose/install/)。

## 在 Elastic Beanstalk 中不使用 Docker Compose 管理映像
<a name="single-container-docker-configuration.no-compose"></a>

如果您没有使用 Docker Compose 来管理 Docker 映像，则需要配置一个 `Dockerfile` 和/或 `Dockerrun.aws.json` 文件。
+ 创建 `Dockerfile` 以使 Elastic Beanstalk 在本地构建并运行自定义映像。
+ 创建一个用于将 Docker 映像从托管存储库部署到 Elastic Beanstalk 的 `Dockerrun.aws.json v1` 文件。
+ 您可能需要创建一个 `.zip` 文件。如果您*只使用其中一个*文件（`Dockerfile` 或 `Dockerrun.aws.json`），则无需创建 .zip 文件。如果您同时使用这两个文件，则需要一个 .zip 文件。.zip 文件必须同时包含 `Dockerfile` 和 `Dockerrun.aws.json`，以及包含您的应用程序文件和所有应用程序文件依赖项的文件。如果您使用 EB CLI 部署应用程序，它将为您创建一个 `.zip` 文件。

### `Dockerrun.aws.json` v1 配置文件
<a name="single-container-docker-configuration.dockerrun"></a>

`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 和在上面运行*的 ECS AL2023 使用该`Dockerrun.aws.json v2`文件。已停用的平台 *ECS 多容器 Docker Amazon Linux AMI (AL1)* 也使用了相同的版本。



#### Dockerrun.aws.json v1
<a name="single-container-docker-configuration.dockerrun.awsjson"></a>

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

**AWSEBDockerrun版本**  
（必需）如果没有使用 Docker Compose 来管理映像，请指定版本号 `1`。

**身份验证**  
（仅对私有存储库必需）指定存储 `.dockercfg` 文件的 Amazon S3 对象。  
请参阅本章后面的*使用私有存储库中的映像*中的 [映像存储库的身份验证使用 AWS Secrets Manager](docker-configuration.remote-repo.md#docker-configuration.remote-repo.dockerrun-aws)。

**映像**  
指定现有 Docker 存储库上的 Docker 基本映像，您将从其构建 Docker 容器。以 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**值应与的 EXPOSE 列表中的`Dockerfile`第一个条目相匹配。**  
或者，您也可以在中指定端口列表**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 实例的日志](using-features.logging.md)。

**命令**  
指定要在容器中运行的命令。如果您指定 **Entrypoint**，**Command** 将作为参数添加至 **Entrypoint**。有关更多信息，请参阅 Docker 文档中的 [CMD](https://docs.docker.com/engine/reference/run/#cmd-default-command-or-options)。

**Entrypoint**  
指定要在容器启动时运行的默认命令。有关更多信息，请参阅 Docker 文档中的 [ENTRYPOINT](https://docs.docker.com/engine/reference/run/#cmd-default-command-or-options)。

以下代码段是演示单容器的 `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` 文件，也可以提供包含 `.zip` 和 `Dockerrun.aws.json` 文件的 `Dockerfile` 存档。在提供这两个文件时，`Dockerfile` 描述 Docker 映像，`Dockerrun.aws.json` 文件提供其他部署信息，如本节后面所述。

**注意**  
这两个文件必须位于 `.zip` 存档的根级或顶级。请不要从包含这些文件的目录生成存档。而是导航到该目录并在其中生成存档。  
在提供这两个文件时，请不要在 `Dockerrun.aws.json` 文件中指定映像。Elastic Beanstalk 生成和使用 `Dockerfile` 中描述的映像，并忽略 `Dockerrun.aws.json` 文件中指定的映像。

## 使用 Dockerfile 构建自定义映像
<a name="single-container-docker-configuration.dockerfile"></a>

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

以下代码段是一个 `Dockerfile` 示例。如果您按照 [QuickStart 适用于 Docker](docker-quickstart.md) 中的说明进行操作，则可以按编写内容上传此 `Dockerfile`。在您使用此 `Dockerfile` 时，Elastic Beanstalk 运行游戏 2048。

有关您可以包含在 `Dockerfile` 中的指令的更多信息，请参阅 Docker 网站上的 [Dockerfile 参考](https://docs.docker.com/engine/reference/builder)。

```
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 文档网站上的[使用多阶段构建](https://docs.docker.com/develop/develop-images/multistage-build/)。