

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

# 从 Amazon Linux 上运行的多容器 Docker 迁移到 Amazon Linux 2 上运行的 Elastic Beanstalk Docker
<a name="docker-multicontainer-migration"></a>

*在 64 位 Amazon Linux 2 上运行的 ECS* 平台分支发布之前，针对拥有基于*在 64 位 Amazon Linux 上运行的多容器 Docker* 平台分支的环境的客户，Elastic Beanstalk 提供了到 Amazon Linux 2 的备用迁移路径。本主题介绍了该迁移路径，并保留在本文档中，作为完成该迁移路径的任何客户的参考。

如果客户拥有基于*在 64 位 Amazon Linux 上运行的多容器 Docker* 平台分支的环境，我们现在建议迁移到*在 64 位 Amazon Linux 2 上运行 ECS* 平台分支。与备用迁移路径不同，此方法继续使用 Amazon ECS 来协调向 ECS 托管式 Docker 环境的容器部署。这方面允许采用更直接的方法。无需更改源代码，支持相同的 `Dockerrun.aws.json` v2。有关更多信息，请参阅 [在亚马逊 Linux 2023 上将你的 Elastic Beanstalk 应用程序从 ECS 托管的多容器 Docker AL1 迁移到 ECS](migrate-to-ec2-AL2-platform.md)。

## 从 Amazon Linux 上的多容器 Docker 到 Docker Amazon Linux 2 平台分支的旧式迁移
<a name="docker-multicontainer-migration-to-docker-al2"></a>

您可以将在 [Amazon Linux AMI 上的多容器 Docker 平台](create_deploy_docker_ecs.md)上运行的应用程序迁移到 Amazon Linux 2 Docker 平台。Amazon Linux AMI 上的多容器 Docker 平台要求您指定要作为容器运行的预构建应用程序映像。迁移后，您将不再有此限制，因为 Amazon Linux 2 Docker 平台还允许 Elastic Beanstalk 在部署期间构建容器映像。您的应用程序将继续在多容器环境中运行，并获得 Docker Compose 工具的额外优势。





Docker Compose 是定义和运行多容器 Docker 应用程序的工具。要了解有关 Docker Compose 以及如何安装它的更多信息，请参阅 Docker 网站 [Docker Compose 概述](https://docs.docker.com/compose/)和[安装 Docker Compose](https://docs.docker.com/compose/install/)。

### `docker-compose.yml` 文件
<a name="docker-multicontainer-migration.files"></a>

Docker Compose 工具使用 `docker-compose.yml` 文件配置您的应用程序服务。此文件将替换应用程序项目目录和应用程序源包中的 `Dockerrun.aws.json v2` 文件。您可以手动创建 `docker-compose.yml` 文件，此时您将发现这对引用您的 `Dockerrun.aws.json v2` 文件以获取大多数参数值很有帮助。

以下是同一应用程序的 `docker-compose.yml` 文件和相应 `Dockerrun.aws.json v2` 文件的示例。有关 `docker-compose.yml` 文件的更多信息，请参阅 [Compose 文件参考](https://docs.docker.com/compose/compose-file/)。有关 `Dockerrun.aws.json v2` 文件的更多信息，请参阅[`Dockerrun.aws.json` v2](create_deploy_docker_v2config.md#create_deploy_docker_v2config_dockerrun)。


| **`docker-compose.yml`** | **`Dockerrun.aws.json v2`** | 
| --- | --- | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/docker-multicontainer-migration.html)  |  [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/docker-multicontainer-migration.html)  | 
|  <pre>version: '2.4'<br />services:<br />  php-app:<br />    image: "php:fpm"<br />    volumes:<br />      - "./php-app:/var/www/html:ro"<br />      - "${EB_LOG_BASE_DIR}/php-app:/var/log/sample-app"<br />    mem_limit: 128m<br />    environment:<br />      Container: PHP<br />  nginx-proxy:<br />    image: "nginx"<br />    ports:<br />      - "80:80"<br />    volumes:<br />      - "./php-app:/var/www/html:ro"<br />      - "./proxy/conf.d:/etc/nginx/conf.d:ro"<br />      - "${EB_LOG_BASE_DIR}/nginx-proxy:/var/log/nginx"<br />    mem_limit: 128m<br />    links:<br />      - php-app</pre>  | 
|  <pre>{<br />  "AWSEBDockerrunVersion": 2,<br />  "volumes": [<br />    {<br />      "name": "php-app",<br />      "host": {<br />        "sourcePath": "/var/app/current/php-app"<br />      }<br />    },<br />    {<br />      "name": "nginx-proxy-conf",<br />      "host": {<br />        "sourcePath": "/var/app/current/proxy/conf.d"<br />      }<br />    }<br />  ],<br />  "containerDefinitions": [<br />    {<br />      "name": "php-app",<br />      "image": "php:fpm",<br />      "environment": [<br />        {<br />          "name": "Container",<br />          "value": "PHP"<br />        }<br />      ],<br />      "essential": true,<br />      "memory": 128,<br />      "mountPoints": [<br />        {<br />          "sourceVolume": "php-app",<br />          "containerPath": "/var/www/html",<br />          "readOnly": true<br />        }<br />      ]<br />    },<br />    {<br />      "name": "nginx-proxy",<br />      "image": "nginx",<br />      "essential": true,<br />      "memory": 128,<br />      "portMappings": [<br />        {<br />          "hostPort": 80,<br />          "containerPort": 80<br />        }<br />      ],<br />      "links": [<br />        "php-app"<br />      ],<br />      "mountPoints": [<br />        {<br />          "sourceVolume": "php-app",<br />          "containerPath": "/var/www/html",<br />          "readOnly": true<br />        },<br />        {<br />          "sourceVolume": "nginx-proxy-conf",<br />          "containerPath": "/etc/nginx/conf.d",<br />          "readOnly": true<br />        },<br />        {<br />          "sourceVolume": "awseb-logs-nginx-proxy",<br />          "containerPath": "/var/log/nginx"<br />        }<br />      ]<br />    }<br />  ]<br />}<br /> </pre>  | 

### 其他迁移注意事项
<a name="docker-multicontainer-migration.considerations"></a>

Docker Amazon Linux 2 平台和多容器 Docker Amazon Linux AMI 平台以不同方式实现环境属性。这两个平台还有 Elastic Beanstalk 为其每个容器创建的不同日志目录。从 Amazon Linux AMI 多容器 Docker 平台迁移后，您需要了解这些不同的实现方式，以便在新 Amazon Linux 2 Docker 平台环境中使用。


|  **领域**  |  **Amazon Linux 2 上带 Docker Compose 的 Docker 平台**  |  **Amazon Linux AMI 上的多容器 Docker 平台**  | 
| --- | --- | --- | 
| 环境属性 | 为使容器能够访问环境属性，您必须在 `.env` 文件中添加对 `docker-compose.yml` 文件的引用。Elastic Beanstalk 生成 `.env` 文件，将每个属性列为环境变量。有关更多信息，请参阅[在容器中引用环境变量](create_deploy_docker.container.console.md#docker-env-cfg.env-variables)。 | Elastic Beanstalk 可以直接将环境属性传递给容器。在容器中运行的代码可以将这些属性作为环境变量访问，而无需任何其他配置。 | 
| 日志目录 | 对于每个容器，Elastic Beanstalk 都会创建一个名为 `/var/log/eb-docker/containers/{{<service name>}}`（或 `${EB_LOG_BASE_DIR}/<service name>`）的日志目录。有关更多信息，请参阅[利用 Docker Compose 的 Docker 容器自定义日志记录](create_deploy_docker.container.console.md#docker-env-cfg.dc-customized-logging)。 | 对于每个容器，Elastic Beanstalk 都会创建一个名为 `/var/log/containers/{{<containername>}}` 的日志目录。有关更多信息，请参阅[容器定义格式](create_deploy_docker_v2config.md#create_deploy_docker_v2config_dockerrun_format)中的 `mountPoints` 字段。 | 

### 迁移步骤
<a name="docker-multicontainer-migration.procedure"></a>

**迁移到 Amazon Linux 2 Docker 平台**

1. 根据应用程序的现有 `docker-compose.yml ` 文件为应用程序创建 `Dockerrun.aws.json v2` 文件。有关更多信息，请参阅上述 [`docker-compose.yml` 文件](#docker-multicontainer-migration.files)部分。

1. 在应用程序项目文件夹的根目录中，将 `Dockerrun.aws.json v2` 文件替换为刚刚创建的 `docker-compose.yml` 文件。

   您的目录结构应如下所示。

   ```
   ~/myApplication
   |-- docker-compose.yml
   |-- .ebextensions
   |-- php-app
   |-- proxy
   ```

1. 使用 **eb init** 命令配置本地目录以部署到 Elastic Beanstalk。

   ```
   ~/myApplication$ eb init -p docker {{application-name}}
   ```

1. 使用 **eb create** 命令创建环境并部署 Docker 映像。

   ```
   ~/myApplication$ eb create {{environment-name}}
   ```

1. 如果您的应用是 Web 应用程序，则在启动环境后，使用 **eb open** 命令在 Web 浏览器中查看它。

   ```
   ~/myApplication$ eb open {{environment-name}}
   ```

1. 您可以使用 **eb status** 命令显示新创建的环境的状态。

   ```
   ~/myApplication$ eb status {{environment-name}}
   ```