

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 從在 Amazon Linux 上執行的多容器 Docker 遷移至在 Amazon Linux 2 上執行的 Elastic Beanstalk Docker
<a name="docker-multicontainer-migration"></a>

在發佈*執行於 64 位元 Amazon Linux 2 的 ECS* 平台分支之前，Elastic Beanstalk 為使用以*執行於 64 位元 Amazon Linux 2 的多容器 Docker* 平台分支為基礎的環境的客戶提供了替代遷移路徑。本主題介紹該遷移路徑，並保留作為完成該遷移路徑的所有客戶的參考文件。

對於使用以*執行於 64 位元 Amazon Linux 的多容器 Docker* 平台分支為基礎的環境的客戶，我們現在建議遷移至*執行於 64 位元 Amazon Linux 2 行的 ECS* 平台分支。與替代遷移路徑不同，此方法繼續使用 Amazon ECS 來協調部署至 ECS 受管 Docker 環境的容器。這方面允許採取更直接的方法。無需變更原始程式碼，並且支援相同的 `Dockerrun.aws.json` v2。如需詳細資訊，請參閱[將您的 Elastic Beanstalk 應用程式從 AL1 上的 ECS 受管多容器 Docker 遷移至 Amazon Linux 2023 上的 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_tw/elasticbeanstalk/latest/dg/docker-multicontainer-migration.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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 平台環境的不同實作。


|  **Area**  |  **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
   ```