

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

# 準備 Docker 映像以部署至 Elastic Beanstalk
<a name="single-container-docker-configuration"></a>

本節說明如何使用*執行 AL2 或 AL2023 平台分支的其中一個 Docker，準備要部署至 Elastic Beanstalk 的 Docker* 映像。您需要的組態檔案取決於您的映像是本機、遠端，以及您是否使用 Docker Compose。

**注意**  
 如需啟動 Docker 環境的程序範例，請參閱 [Docker 的 QuickStart ](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 網站上的[為什麼要使用 Compose？](https://docs.docker.com/compose/intro/features-uses/)。
+ 建立 `docker-compose.yml`。如果您使用 Docker Compose 透過 Elastic Beanstalk 管理您的應用程式，則需要此檔案。如果您所有的部署都來自公有儲存庫中的映像，則不需要其他組態檔案。如果您部署的來源映像位於私有儲存庫中，則需要執行一些額外的組態。如需詳細資訊，請參閱[使用私有儲存庫中的映像](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 建置並在本機執行自訂映像。
+ 建立 `Dockerrun.aws.json v1` 檔案，以將 Docker 影像從託管儲存庫部署至 Elastic Beanstalk。
+ 您可能需要建立 `.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* 和在 *AL2023 上執行的 ECS* 會使用 `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` 檔案的有效金鑰和值包括以下操作：

**AWSEBDockerrunVersion**  
（必要） `1` 如果您未使用 Docker Compose 來管理映像，請指定版本編號。

**身分驗證**  
(僅私有儲存庫為必要) 指定存放 `.dockercfg` 檔案的 Amazon S3 物件。  
請參閱本章稍後的使用私有儲存庫中的[使用映像儲存庫進行驗證使用 AWS Secrets Manager](docker-configuration.remote-repo.md#docker-configuration.remote-repo.dockerrun-aws)映像。 **

**映像**  
指定將從中建置 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 只會使用第一個連接埠。其使用此連接埠將您的容器連接至主機的反向代理程式，並路由來自公有網際網路的請求。如果您使用的是 `Dockerfile`，第一個 **ContainerPort** 值應該符合 `Dockerfile` **EXPOSE** 清單中的第一個項目。  
您可以選擇性指定在 **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)。

**進入點**  
指定在容器啟動時要執行的預設命令。如需詳細資訊，請參閱 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` 的範例。遵循[Docker 的 QuickStart ](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/)。