

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

# 使用 Elastic Beanstalk Docker 平台分支
Docker 平台分支

本節說明如何使用*執行 AL2 或 AL2023 的任一 Elastic Beanstalk 平台分支 Docker 準備啟動 Docker *映像。

依照中的步驟[Docker 的 QuickStart ](docker-quickstart.md)建立 Docker "Hello World" 應用程式，並使用 EB CLI 將其部署到 Elastic Beanstalk 環境。

**Topics**
+ [

# QuickStart：將 Docker 應用程式部署至 Elastic Beanstalk
](docker-quickstart.md)
+ [

# QuickStart：將 Docker Compose 應用程式部署至 Elastic Beanstalk
](docker-compose-quickstart.md)
+ [

# 準備 Docker 映像以部署至 Elastic Beanstalk
](single-container-docker-configuration.md)

# QuickStart：將 Docker 應用程式部署至 Elastic Beanstalk
Docker 的 QuickStart

本 QuickStart 教學課程將逐步引導您建立 Docker 應用程式並將其部署到 AWS Elastic Beanstalk 環境。

**不適用於生產用途**  
範例僅用於示範。請勿在生產環境中使用範例應用程式。

**Topics**
+ [

## AWS 您的帳戶
](#docker-quickstart-aws-account)
+ [

## 先決條件
](#docker-quickstart-prereq)
+ [

## 步驟 1：建立 Docker 應用程式和容器
](#docker-quickstart-create-app)
+ [

## 步驟 2：在本機執行您的應用程式
](#docker-quickstart-run-local)
+ [

## 步驟 3：使用 EB CLI 部署您的 Docker 應用程式
](#docker-quickstart-deploy)
+ [

## 步驟 4：在 Elastic Beanstalk 上執行應用程式
](#docker-quickstart-run-eb-ap)
+ [

## 步驟 5：清除
](#go-tutorial-cleanup)
+ [

## AWS 應用程式的 資源
](#docker-quickstart-eb-resources)
+ [

## 後續步驟
](#docker-quickstart-next-steps)
+ [

## 使用 Elastic Beanstalk 主控台部署
](#docker-quickstart-console)

## AWS 您的帳戶


如果您還不是 AWS 客戶，則需要建立 AWS 帳戶。註冊可讓您存取 Elastic Beanstalk 和其他您需要 AWS 的服務。

如果您已經有 AWS 帳戶，您可以繼續進行 [先決條件](#docker-quickstart-prereq)。

### 建立 AWS 帳戶


#### 註冊 AWS 帳戶


如果您沒有 AWS 帳戶，請完成下列步驟來建立一個。

**註冊 AWS 帳戶**

1. 開啟 [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)。

1. 請遵循線上指示進行。

   部分註冊程序需接收來電或簡訊，並在電話鍵盤輸入驗證碼。

   當您註冊 時 AWS 帳戶，*AWS 帳戶根使用者*會建立 。根使用者有權存取該帳戶中的所有 AWS 服務 和資源。作為安全最佳實務，請將管理存取權指派給使用者，並且僅使用根使用者來執行[需要根使用者存取權的任務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

AWS 會在註冊程序完成後傳送確認電子郵件給您。您可以隨時登錄 [https://aws.amazon.com/](https://aws.amazon.com/) 並選擇**我的帳戶**，以檢視您目前的帳戶活動並管理帳戶。

#### 建立具有管理存取權的使用者


註冊 後 AWS 帳戶，請保護 AWS 帳戶根使用者、啟用 AWS IAM Identity Center和建立管理使用者，以免將根使用者用於日常任務。

**保護您的 AWS 帳戶根使用者**

1.  選擇**根使用者**並輸入 AWS 帳戶 您的電子郵件地址，以帳戶擁有者[AWS 管理主控台](https://console.aws.amazon.com/)身分登入 。在下一頁中，輸入您的密碼。

   如需使用根使用者登入的說明，請參閱 *AWS 登入 使用者指南*中的[以根使用者身分登入](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)。

1. 若要在您的根使用者帳戶上啟用多重要素驗證 (MFA)。

   如需說明，請參閱《*IAM 使用者指南*》中的[為您的 AWS 帳戶 根使用者 （主控台） 啟用虛擬 MFA 裝置](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html)。

**建立具有管理存取權的使用者**

1. 啟用 IAM Identity Center。

   如需指示，請參閱《AWS IAM Identity Center 使用者指南》**中的[啟用 AWS IAM Identity Center](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)。

1. 在 IAM Identity Center 中，將管理存取權授予使用者。

   如需使用 IAM Identity Center 目錄 做為身分來源的教學課程，請參閱*AWS IAM Identity Center 《 使用者指南*》中的[使用預設值設定使用者存取 IAM Identity Center 目錄](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html)。

**以具有管理存取權的使用者身分登入**
+ 若要使用您的 IAM Identity Center 使用者簽署，請使用建立 IAM Identity Center 使用者時傳送至您電子郵件地址的簽署 URL。

  如需使用 IAM Identity Center 使用者登入的說明，請參閱*AWS 登入 《 使用者指南*》中的[登入 AWS 存取入口網站](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)。

**指派存取權給其他使用者**

1. 在 IAM Identity Center 中，建立一個許可集來遵循套用最低權限的最佳實務。

   如需指示，請參閱《AWS IAM Identity Center 使用者指南》**中的[建立許可集](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)。

1. 將使用者指派至群組，然後對該群組指派單一登入存取權。

   如需指示，請參閱《AWS IAM Identity Center 使用者指南》**中的[新增群組](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)。

## 先決條件


為了遵循本指南的程序，您需要命令列終端機或 shell 來執行命令。命令清單前會出現提示字元 (\$1) 及目前的目錄名稱 (如有)。

```
~/eb-project$ this is a command
this is output
```

在 Linux 和 macOS 上，您可以使用偏好的 Shell 和套件軟體管理工具。在 Windows [上，您可以安裝適用於 Linux 的 Windows 子系統](https://docs.microsoft.com/en-us/windows/wsl/install-win10)，以取得與 Windows 整合的 Ubuntu 和 Bash 版本。

### EB CLI


本教學使用 Elastic Beanstalk 命令列界面 (EB CLI)。關於安裝和設定 EB CLI 的詳細資訊，請參閱[使用設定指令碼安裝 EB CLI （建議）](eb-cli3.md#eb-cli3-install) 和[設定 EB CLI](eb-cli3-configuration.md)。

### Docker


若要遵循本教學課程，您需要在本機進行 Docker 的工作安裝。如需詳細資訊，請參閱 Docker 文件網站上的[取得 Docker](https://docs.docker.com/get-docker/)。

執行下列命令，確認 Docker 協助程式已啟動 。

```
~$ docker info
```

## 步驟 1：建立 Docker 應用程式和容器


在此範例中，我們會建立範例 Flask 應用程式的 Docker 影像，該應用程式也在 中參考[將 Flask 應用程式部署至 Elastic Beanstalk](create-deploy-python-flask.md)。

應用程式包含兩個檔案：
+ `app.py`— Python 檔案，其中包含將在容器中執行的程式碼。
+ `Dockerfile`— 用來建置映像的 Dockerfile。

將兩個檔案放在目錄的根目錄。

```
~/eb-docker-flask/
|-- Dockerfile
|-- app.py
```

將下列內容新增至您的 `Dockerfile`。

**Example `~/eb-docker-flask/Dockerfile`**  

```
FROM public.ecr.aws/docker/library/python:3.12
COPY . /app
WORKDIR /app
RUN pip install Flask==3.1.1
EXPOSE 5000
CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]
```

將下列內容新增至您的 `app.py` 檔案。

**Example `~/eb-docker-flask/app.py`**  

```
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello Elastic Beanstalk! This is a Docker application'
```

使用 [docker build](https://docs.docker.com/reference/cli/docker/image/build/) 命令在本機建置容器映像，並使用 標記映像`eb-docker-flask`。路徑為本機目錄之命令規格結尾的期間 (`.`)。

```
~/eb-docker-flask$ docker build -t eb-docker-flask .
```

## 步驟 2：在本機執行您的應用程式


使用 [docker run ](https://docs.docker.com/reference/cli/docker/container/run/)命令執行您的容器。命令會列印執行中容器的 ID。**-d** 選項會在背景模式下執行 docker。**-p** 選項會在連接埠 5000 公開您的應用程式。根據預設，Elastic Beanstalk 會將流量提供給 Docker 平台上的連接埠 5000。

```
~/eb-docker-flask$ docker run -dp 127.0.0.1:5000:5000 eb-docker-flask
```

在瀏覽器`http://127.0.0.1:5000/ `中導覽至 。您應該會看到文字「Hello Elastic Beanstalk！這是 Docker 應用程式"。

執行 [docker kill](https://docs.docker.com/reference/cli/docker/container/kill/) 命令來終止容器。

```
~/eb-docker-flask$ docker kill container-id
```

## 步驟 3：使用 EB CLI 部署您的 Docker 應用程式


執行下列命令，為此應用程式建立 Elastic Beanstalk 環境。

 

**建立環境並部署 Docker 應用程式**

1. 透過 **eb init** 命令初始化您的 EB CLI 儲存庫。

   ```
   ~/eb-docker-flask$ eb init -p docker docker-tutorial --region us-east-2
   Application docker-tutorial has been created.
   ```

   此命令會建立名為 的應用程式，`docker-tutorial`並設定您的本機儲存庫，以使用最新的 Docker 平台版本建立環境。

1. (選用) 再次執行 **eb init** 來設定預設金鑰對，藉此使用 SSH 連接至執行您應用程式的 EC2 執行個體：

   ```
   ~/eb-docker-flask$ eb init
   Do you want to set up SSH for your instances?
   (y/n): y
   Select a keypair.
   1) my-keypair
   2) [ Create new KeyPair ]
   ```

   若您已有金鑰對，請選擇一對，或依照提示建立金鑰對。若未出現提示，或稍後需要變更設定，請執行 **eb init -i**。

1. 使用 **eb create** 建立環境並於其中部署您的應用程式。Elastic Beanstalk 會自動為您的應用程式建置 zip 檔案，並在連接埠 5000 上啟動它。

   ```
   ~/eb-docker-flask$ eb create docker-tutorial
   ```

   Elastic Beanstalk 大約需要五分鐘的時間來建立您的環境。

## 步驟 4：在 Elastic Beanstalk 上執行應用程式


當建立環境的程序完成時，請使用 開啟您的網站**eb open**。

```
~/eb-docker-flask$ eb open
```

恭喜您！您已使用 Elastic Beanstalk 部署 Docker 應用程式！這會開啟瀏覽器視窗，並使用為應用程式建立的網域名稱。

## 步驟 5：清除


您可以在完成使用應用程式時終止您的環境。Elastic Beanstalk 會終止與您的環境相關聯的所有 AWS 資源。

若要使用 EB CLI 終止 Elastic Beanstalk 環境，請執行下列命令。

```
~/eb-docker-flask$ eb terminate
```

## AWS 應用程式的 資源


您剛建立單一執行個體應用程式。它可作為具有單一 EC2 執行個體的直接範例應用程式，因此不需要負載平衡或自動擴展。對於單一執行個體應用程式，Elastic Beanstalk 會建立下列 AWS 資源：
+ **EC2 執行個體** – 設定在您所選平台上執行 Web 應用程式的 Amazon EC2 虛擬機器。

  每個平台會執行不同一套軟體、設定檔和指令碼，來支援特定的語言版本、架構、Web 容器或其組合。大多數的平台會使用 Apache 或 nginx 做為反向代理，處理您 Web 應用程式前端的網路流量、向它轉送請求、提供靜態資產，並產生存取和錯誤日誌。
+ **執行個體安全群組** – 設定允許從連接埠 80 傳入流量的 Amazon EC2 安全群組。此資源可讓負載平衡器傳來的 HTTP 傳輸資料，到達執行您 Web 應用程式的 EC2 執行個體。在預設情況下，不允許傳輸資料從其他通訊埠傳送。
+ **Amazon S3 儲存貯體** - 儲存位置，用來儲存當您使用 Elastic Beanstalk 時所建立的原始程式碼、日誌和其他成品。
+ **Amazon CloudWatch 警示** – 兩種 CloudWatch 警示，用來監控您環境中執行個體上的負載，會在負載過高或過低時觸發。當警示觸發時，您的 Auto Scaling 群組會擴展或縮減以進行回應。
+ **CloudFormation 堆疊** – Elastic Beanstalk 使用 CloudFormation 啟動環境中的資源並傳播組態變更。資源定義於範本中，您可在 [CloudFormation 主控台](https://console.aws.amazon.com/cloudformation)中檢視此範本。
+  **網域名稱** – 會路由到您 Web 應用程式的網域名稱，其格式為 **subdomain*.*region*.elasticbeanstalk.com*。

Elastic Beanstalk 會管理所有這些資源。當您終止環境時，Elastic Beanstalk 會終止其中的所有資源。

## 後續步驟


在您擁有執行應用程式的環境後，可以隨時部署應用程式的新版本或不同的應用程式。部署新的應用程式版本非常快速，因無須佈建或重新啟動 EC2 執行個體。您也可以使用 Elastic Beanstalk 主控台探索您的新環境。如需詳細步驟，請參閱本指南*入門*章節中的[探索您的環境](GettingStarted.md#GettingStarted.Explore)。

部署範例應用程式一兩個，並準備好開始在本機開發和執行 Docker 應用程式後，請參閱 [準備 Docker 映像以部署至 Elastic Beanstalk](single-container-docker-configuration.md)。

## 使用 Elastic Beanstalk 主控台部署
使用 主控台部署

您也可以使用 Elastic Beanstalk 主控台來啟動範例應用程式。如需詳細步驟，請參閱本指南*入門*章節中的[建立範例應用程式](GettingStarted.md#GettingStarted.CreateApp)。

# QuickStart：將 Docker Compose 應用程式部署至 Elastic Beanstalk
Docker Compose 的 QuickStart

本 QuickStart 教學課程將逐步引導您建立多容器 Docker Compose 應用程式並將其部署至 AWS Elastic Beanstalk 環境。您將使用 nginx 反向代理建立 Flask Web 應用程式，以示範 Docker Compose 如何簡化協調多個容器的操作。

**不適用於生產用途**  
範例僅用於示範。請勿在生產環境中使用範例應用程式。

**Topics**
+ [

## AWS 您的帳戶
](#docker-compose-quickstart-aws-account)
+ [

## 先決條件
](#docker-compose-quickstart-prereq)
+ [

## 步驟 1：建立 Docker Compose 應用程式
](#docker-compose-quickstart-create-app)
+ [

## 步驟 2：在本機執行您的應用程式
](#docker-compose-quickstart-run-local)
+ [

## 步驟 3：使用 EB CLI 部署 Docker Compose 應用程式
](#docker-compose-quickstart-deploy)
+ [

## 步驟 4：在 Elastic Beanstalk 上測試您的應用程式
](#docker-compose-quickstart-run-eb-ap)
+ [

## 步驟 5：清除
](#docker-compose-quickstart-cleanup)
+ [

## AWS 您應用程式的 資源
](#docker-compose-quickstart-eb-resources)
+ [

## 後續步驟
](#docker-compose-quickstart-next-steps)
+ [

## 使用 Elastic Beanstalk 主控台部署
](#docker-compose-quickstart-console)

## AWS 您的帳戶


如果您還不是 AWS 客戶，則需要建立 AWS 帳戶。註冊可讓您存取 Elastic Beanstalk 和其他您需要 AWS 的服務。

如果您已有 AWS 帳戶，您可以繼續前往 [先決條件](#docker-compose-quickstart-prereq)。

### 建立 AWS 帳戶


#### 註冊 AWS 帳戶


如果您沒有 AWS 帳戶，請完成下列步驟來建立一個。

**註冊 AWS 帳戶**

1. 開啟 [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)。

1. 請遵循線上指示進行。

   部分註冊程序需接收來電或簡訊，並在電話鍵盤輸入驗證碼。

   當您註冊 時 AWS 帳戶，*AWS 帳戶根使用者*會建立 。根使用者有權存取該帳戶中的所有 AWS 服務 和資源。作為安全最佳實務，請將管理存取權指派給使用者，並且僅使用根使用者來執行[需要根使用者存取權的任務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

AWS 會在註冊程序完成後傳送確認電子郵件給您。您可以隨時登錄 [https://aws.amazon.com/](https://aws.amazon.com/) 並選擇**我的帳戶**，以檢視您目前的帳戶活動並管理帳戶。

#### 建立具有管理存取權的使用者


註冊 後 AWS 帳戶，請保護 AWS 帳戶根使用者、啟用 AWS IAM Identity Center和建立管理使用者，以免將根使用者用於日常任務。

**保護您的 AWS 帳戶根使用者**

1.  選擇**根使用者**並輸入 AWS 帳戶 您的電子郵件地址，以帳戶擁有者[AWS 管理主控台](https://console.aws.amazon.com/)身分登入 。在下一頁中，輸入您的密碼。

   如需使用根使用者登入的說明，請參閱 *AWS 登入 使用者指南*中的[以根使用者身分登入](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)。

1. 若要在您的根使用者帳戶上啟用多重要素驗證 (MFA)。

   如需說明，請參閱《*IAM 使用者指南*》中的[為您的 AWS 帳戶 根使用者 （主控台） 啟用虛擬 MFA 裝置](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html)。

**建立具有管理存取權的使用者**

1. 啟用 IAM Identity Center。

   如需指示，請參閱《AWS IAM Identity Center 使用者指南》**中的[啟用 AWS IAM Identity Center](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)。

1. 在 IAM Identity Center 中，將管理存取權授予使用者。

   如需使用 IAM Identity Center 目錄 做為身分來源的教學課程，請參閱*AWS IAM Identity Center 《 使用者指南*》中的[使用預設值設定使用者存取權 IAM Identity Center 目錄](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html)。

**以具有管理存取權的使用者身分登入**
+ 若要使用您的 IAM Identity Center 使用者簽署，請使用建立 IAM Identity Center 使用者時傳送至您電子郵件地址的簽署 URL。

  如需使用 IAM Identity Center 使用者登入的說明，請參閱*AWS 登入 《 使用者指南*》中的[登入 AWS 存取入口網站](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)。

**指派存取權給其他使用者**

1. 在 IAM Identity Center 中，建立一個許可集來遵循套用最低權限的最佳實務。

   如需指示，請參閱《AWS IAM Identity Center 使用者指南》**中的[建立許可集](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)。

1. 將使用者指派至群組，然後對該群組指派單一登入存取權。

   如需指示，請參閱《AWS IAM Identity Center 使用者指南》**中的[新增群組](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)。

## 先決條件


為了遵循本指南的程序，您需要命令列終端機或 shell 來執行命令。命令清單前會出現提示字元 (\$1) 及目前的目錄名稱 (如有)。

```
~/eb-project$ this is a command
this is output
```

在 Linux 和 macOS 上，您可以使用偏好的 Shell 和套件軟體管理工具。在 Windows [上，您可以安裝適用於 Linux 的 Windows 子系統](https://docs.microsoft.com/en-us/windows/wsl/install-win10)，以取得與 Windows 整合的 Ubuntu 和 Bash 版本。

### EB CLI


本教學使用 Elastic Beanstalk 命令列界面 (EB CLI)。關於安裝和設定 EB CLI 的詳細資訊，請參閱[使用設定指令碼安裝 EB CLI （建議）](eb-cli3.md#eb-cli3-install) 和[設定 EB CLI](eb-cli3-configuration.md)。

### Docker 和 Docker Compose


若要遵循本教學課程，您需要在本機進行 Docker 和 Docker Compose 的工作安裝。如需詳細資訊，請參閱 [Docker 文件網站上的取得](https://docs.docker.com/get-docker/) [Docker 和安裝 Docker Compose](https://docs.docker.com/compose/install/)。

執行下列命令，確認已安裝並執行 Docker 和 Docker Compose。

```
~$ docker info
~$ docker compose version
```

## 步驟 1：建立 Docker Compose 應用程式


在此範例中，我們使用 Docker Compose 建立多容器應用程式，其中包含 Flask Web 應用程式和 nginx 反向代理。這示範了 Docker Compose 如何簡化協同運作的多個容器。

應用程式包含運作狀態監控組態，可讓 Elastic Beanstalk 從您的 nginx 代理收集詳細的應用程式指標。

應用程式包含下列結構：

```
~/eb-docker-compose-flask/
|-- docker-compose.yml
|-- web/
|   |-- Dockerfile
|   |-- app.py
|   `-- requirements.txt
|-- proxy/
|   |-- Dockerfile
|   `-- nginx.conf
`-- .platform/
    `-- hooks/
        `-- postdeploy/
            `-- 01_setup_healthd_permissions.sh
```

建立目錄結構並新增下列檔案：

首先，建立定義服務及其關係的主`docker-compose.yml`檔案。

**Example `~/eb-docker-compose-flask/docker-compose.yml`**  

```
services:
  web:
    build: ./web
    expose:
      - "5000"

  nginx-proxy:
    build: ./proxy
    ports:
      - "80:80"
    volumes:
      - "/var/log/nginx:/var/log/nginx"
    depends_on:
      - web
```

在 `web`目錄中建立 Flask Web 應用程式。將下列內容新增至您的 `app.py` 檔案。

**Example `~/eb-docker-compose-flask/web/app.py`**  

```
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello Elastic Beanstalk! This is a Docker Compose application'
```

將下列內容新增至您的 Web 服務 `Dockerfile`。

**Example `~/eb-docker-compose-flask/web/Dockerfile`**  

```
FROM public.ecr.aws/docker/library/python:3.12
COPY . /app
WORKDIR /app
RUN pip install Flask==3.1.1
EXPOSE 5000
CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]
```

在 `proxy`目錄中建立 nginx 反向代理。將下列內容新增至您的 `nginx.conf` 檔案。

此組態包含運作狀態監控設定，允許 Elastic Beanstalk 收集詳細的應用程式指標。如需自訂運作狀態監控日誌格式的詳細資訊，請參閱[增強型運作狀態日誌格式](health-enhanced-serverlogs.md)。

**Example `~/eb-docker-compose-flask/proxy/nginx.conf`**  

```
events {
    worker_connections 1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    map $http_upgrade $connection_upgrade {
        default       "upgrade";
    }

    # Health monitoring log format for Elastic Beanstalk
    log_format healthd '$msec"$uri"$status"$request_time"$upstream_response_time"$http_x_forwarded_for';
    
    upstream flask_app {
        server web:5000;
    }

    server {
        listen 80 default_server;
        root /usr/share/nginx/html;

        # Standard access log
        access_log /var/log/nginx/access.log;
        
        # Health monitoring log for Elastic Beanstalk
        if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
            set $year $1;
            set $month $2;
            set $day $3;
            set $hour $4;
        }
        access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
        
        location / {
            proxy_pass http://flask_app;
            proxy_http_version    1.1;

            proxy_set_header    Connection             $connection_upgrade;
            proxy_set_header    Upgrade                $http_upgrade;
            proxy_set_header    Host                   $host;
            proxy_set_header    X-Real-IP              $remote_addr;
            proxy_set_header    X-Forwarded-For        $proxy_add_x_forwarded_for;
        }
    }
}
```

將下列內容新增至代理服務 `Dockerfile`。

**Example `~/eb-docker-compose-flask/proxy/Dockerfile`**  

```
FROM public.ecr.aws/nginx/nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
```

最後，建立平台掛接指令碼來設定運作狀態監控所需的日誌目錄和許可。平台掛鉤可讓您在部署程序期間執行自訂指令碼。如需平台掛鉤的詳細資訊，請參閱 [平台勾點](platforms-linux-extend.hooks.md)。

**Example `~/eb-docker-compose-flask/.platform/hooks/postdeploy/01_setup_healthd_permissions.sh`**  

```
#!/bin/bash
set -ex

NGINX_CONTAINER=$(docker ps --filter "name=nginx-proxy" -q)

if [ -z "$NGINX_CONTAINER" ]; then
    echo "Error: No nginx-proxy container found running"
    exit 1
fi

NGINX_UID=$(docker exec ${NGINX_CONTAINER} id -u nginx)
NGINX_GID=$(docker exec ${NGINX_CONTAINER} id -g nginx)

mkdir -p /var/log/nginx/healthd
chown -R ${NGINX_UID}:${NGINX_GID} /var/log/nginx
```

## 步驟 2：在本機執行您的應用程式


使用 [docker compose up](https://docs.docker.com/compose/reference/up/) 命令在本機建置和執行多容器應用程式。Docker Compose 將建置兩個容器映像，並啟動`docker-compose.yml`檔案中定義的服務。

```
~/eb-docker-compose-flask$ docker compose up --build
```

**--build** 選項可確保 Docker Compose 在啟動服務之前建置容器映像。您應該會看到同時顯示 Web 服務和 nginx-proxy 服務啟動的輸出。

在瀏覽器`http://localhost`中導覽至 。您應該會看到文字「Hello Elastic Beanstalk！這是 Docker Compose 應用程式"。nginx 代理會在連接埠 80 上接收您的請求，並將其轉送至連接埠 5000 上執行的 Flask 應用程式。

當您完成測試時，請在終端機**Ctrl\$1C**中按 停止應用程式，或在個別終端機中執行下列命令：

```
~/eb-docker-compose-flask$ docker compose down
```

## 步驟 3：使用 EB CLI 部署 Docker Compose 應用程式


執行下列命令，為此應用程式建立 Elastic Beanstalk 環境。

 

**建立環境並部署 Docker Compose 應用程式**

1. 透過 **eb init** 命令初始化您的 EB CLI 儲存庫。

   ```
   ~/eb-docker-compose-flask$ eb init -p docker docker-compose-tutorial --region us-east-2
   Application docker-compose-tutorial has been created.
   ```

   此命令會建立名為 的應用程式，`docker-compose-tutorial`並設定您的本機儲存庫，以使用最新的 Docker 平台版本建立環境。

1. (選用) 再次執行 **eb init** 來設定預設金鑰對，藉此使用 SSH 連接至執行您應用程式的 EC2 執行個體：

   ```
   ~/eb-docker-compose-flask$ eb init
   Do you want to set up SSH for your instances?
   (y/n): y
   Select a keypair.
   1) my-keypair
   2) [ Create new KeyPair ]
   ```

   若您已有金鑰對，請選擇一對，或依照提示建立金鑰對。若未出現提示，或稍後需要變更設定，請執行 **eb init -i**。

1. 使用 **eb create** 建立環境並於其中部署您的應用程式。Elastic Beanstalk 會自動偵測您的`docker-compose.yml`檔案，並部署您的多容器應用程式。

   ```
   ~/eb-docker-compose-flask$ eb create docker-compose-tutorial
   ```

   Elastic Beanstalk 大約需要五分鐘的時間來建立您的環境並部署多容器應用程式。

## 步驟 4：在 Elastic Beanstalk 上測試您的應用程式


當建立環境的程序完成時，請使用 開啟您的網站**eb open**。

```
~/eb-docker-compose-flask$ eb open
```

很棒！您已使用 Elastic Beanstalk 部署多容器 Docker Compose 應用程式！這會開啟瀏覽器視窗，並使用為應用程式建立的網域名稱。您應該會看到來自 Flask 應用程式的訊息，透過 nginx 反向代理提供。

## 步驟 5：清除


您可以在完成使用應用程式時終止您的環境。Elastic Beanstalk 會終止與您的環境相關聯的所有 AWS 資源。

若要使用 EB CLI 終止 Elastic Beanstalk 環境，請執行下列命令。

```
~/eb-docker-compose-flask$ eb terminate
```

## AWS 您應用程式的 資源


您剛建立執行多個容器的單一執行個體應用程式。它可作為具有單一 EC2 執行個體的簡單範例應用程式，因此不需要負載平衡或自動擴展。對於單一執行個體應用程式，Elastic Beanstalk 會建立下列 AWS 資源：
+ **EC2 執行個體** – 設定在您所選平台上執行 Web 應用程式的 Amazon EC2 虛擬機器。

  每個平台會執行不同一套軟體、設定檔和指令碼，來支援特定的語言版本、架構、Web 容器或其組合。大多數的平台會使用 Apache 或 nginx 做為反向代理，處理您 Web 應用程式前端的網路流量、向它轉送請求、提供靜態資產，並產生存取和錯誤日誌。
+ **執行個體安全群組** – 設定允許從連接埠 80 傳入流量的 Amazon EC2 安全群組。此資源可讓負載平衡器傳來的 HTTP 傳輸資料，到達執行您 Web 應用程式的 EC2 執行個體。在預設情況下，不允許傳輸資料從其他通訊埠傳送。
+ **Amazon S3 儲存貯體** - 儲存位置，用來儲存當您使用 Elastic Beanstalk 時所建立的原始程式碼、日誌和其他成品。
+ **Amazon CloudWatch 警示** – 兩種 CloudWatch 警示，用來監控您環境中執行個體上的負載，會在負載過高或過低時觸發。當警示觸發時，您的 Auto Scaling 群組會擴展或縮減以進行回應。
+ **CloudFormation 堆疊** – Elastic Beanstalk 使用 CloudFormation 啟動環境中的資源並傳播組態變更。資源定義於範本中，您可在 [CloudFormation 主控台](https://console.aws.amazon.com/cloudformation)中檢視此範本。
+  **網域名稱** – 會路由到您 Web 應用程式的網域名稱，其格式為 **subdomain*.*region*.elasticbeanstalk.com*。

Elastic Beanstalk 會管理所有這些資源。當您終止環境時，Elastic Beanstalk 會終止其中的所有資源。您的 Docker Compose 應用程式會在單一 EC2 執行個體上執行多個容器，Elastic Beanstalk 會自動處理協同運作。

## 後續步驟


在您擁有執行應用程式的環境後，可以隨時部署應用程式的新版本或不同的應用程式。部署新的應用程式版本非常快速，因無須佈建或重新啟動 EC2 執行個體。您也可以使用 Elastic Beanstalk 主控台探索您的新環境。如需詳細步驟，請參閱本指南*入門*章節中的[探索您的環境](GettingStarted.md#GettingStarted.Explore)。

部署範例應用程式一兩個，並準備好開始在本機開發和執行 Docker Compose 應用程式後，請參閱 [準備 Docker 映像以部署至 Elastic Beanstalk](single-container-docker-configuration.md)。

## 使用 Elastic Beanstalk 主控台部署
使用 主控台部署

您也可以使用 Elastic Beanstalk 主控台來啟動 Docker Compose 應用程式。建立包含您的`docker-compose.yml`檔案以及所有相關目錄和檔案的 ZIP 檔案，然後在建立新的應用程式時將其上傳。如需詳細步驟，請參閱本指南*入門*章節中的[建立範例應用程式](GettingStarted.md#GettingStarted.CreateApp)。

# 準備 Docker 映像以部署至 Elastic Beanstalk
Docker 映像組態

本節說明如何使用*執行 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 管理您的映像
使用 Docker Compose 管理您的映像

您可以選擇使用 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 的映像
在沒有 Docker Compose 的情況下管理映像

如果您不是使用 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 組態檔案
`Dockerrun.aws.json` v1

`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


`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 建置自訂映像


若您尚未於儲存庫內託管現有映像，您需要建立 `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/)。