設定 Docker 環境 - AWS Elastic Beanstalk

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

設定 Docker 環境

有幾種方法可以配置 Elastic Beanstalk Docker 環境的行為。

注意

如果您的 Elastic Beanstalk 環境使用 Amazon Linux AMI 平台版本 (Amazon Linux 2 之前的版本),請閱讀 Amazon Linux AMI (Amazon Linux 2 之前的版本) 上的 Docker 組態 中的其他資訊。

在 Docker 環境中設定軟體

您可使用 Elastic Beanstalk 主控台來設定於您環境的執行個體上執行的軟體。

在 Elastic Beanstalk 主控台中設定 Docker 環境
  1. 開啟彈性魔豆控制台,然後在區域清單中選取您的. AWS 區域

  2. 在導覽窗格中,選擇環境,然後在清單中選擇您環境的名稱。

    注意

    如果您有許多環境,請使用搜尋列來篩選環境清單。

  3. 在導覽窗格中,選擇組態

  4. 更新、監控和日誌記錄組態類別中,選擇編輯

  5. 進行必要的組態變更。

  6. 若要儲存變更,請選擇頁面底部的儲存變更

如需有關在任何環境中配置軟體設定的資訊,請參閱 環境屬性與其他軟體設定。以下各節介紹 Docker 的特定資訊。

容器選項

Container options (容器選項) 區段具有平台特定選項。對於 Docker 環境而言,它可讓您選擇您的環境是否包含 NGINX 代理伺服器。

使用 Docker Compose 的環境

如果您使用 Docker Compose 來管理 Docker 環境,則 Elastic Beanstalk 會假定您以容器身分來執行代理伺服器。因此,對於 Proxy server (代理伺服器) 設定,其預設為 None (無),而且 Elastic Beanstalk 不會提供 NGINX 組態。

注意

即使您選取 NGINX 做為代理伺服器,在使用 Docker Compose 的環境中也會忽略此設定。Proxy server (代理伺服器) 設定仍預設為 None (無)

由於使用 Docker Compose 的 Amazon Linux 2 平台上的 Docker 已停用 NGINX Web 伺服器 Proxy,因此,您必須依照指示產生增強型運作狀態報告的日誌。如需更多詳細資訊,請參閱 產生增強型運作狀態報告的日誌 (Docker Compose)

環境屬性和環境變數

Environment Properties (環境屬性) 的部分可讓您針對執行您應用程式的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,來指定其上的環境資訊設定。環境屬性會以金鑰值對的形式傳到應用程式。在 Docker 環境中,Elastic Beanstalk 會將環境屬性傳遞給容器做為環境變數。

您在容器中執行的應用程式的程式碼,可以依名稱參照環境變數並讀取其值。讀取這些環境變數的原始程式碼會因程式語言而有所不同。您可以在個別平台主題中,找到在 Elastic Beanstalk 受管平台支援之程式設計語言中讀取環境變數值的指示。如需這些主題的連結清單,請參閱 環境屬性與其他軟體設定

使用 Docker Compose 的環境

如果您使用 Docker Compose 來管理 Docker 環境,您必須進行一些額外的設定,以擷取容器中的環境變數。若要讓容器中執行的可執行檔存取這些環境變數,您必須在 docker-compose.yml 中參考這些變數。如需詳細資訊,請參閱 在容器中參考環境變數

在容器中參考環境變數

如果您在 Amazon Linux 2 Docker 平台上使用 Docker Compose 工具,Elastic Beanstalk 會在應用程式專案的根目錄中產生名為 .env 的 Docker Compose 環境。此檔案會存放針對 Elastic Beanstalk 設定的環境變數。

注意

如果您在應用程式套件中加入 .env 檔案,Elastic Beanstalk 將不會產生 .env 檔案。

為了讓容器參考您在 Elastic Beanstalk 中定義的環境變數,您必須遵循其中一種或兩種設定方法。

  • 將 Elastic Beanstalk 產生的 .env 檔案新增至 env_file 檔案中的 docker-compose.yml 組態選項。

  • 直接定義 docker-compose.yml 檔案中的環境變數。

以下檔案提供範例。範例 docker-compose.yml 檔案會示範這兩種方法。

  • 如果您定義環境屬性 DEBUG_LEVEL=1LOG_LEVEL=error,Elastic Beanstalk 會為您產生以下 .env 檔案:

    DEBUG_LEVEL=1 LOG_LEVEL=error
  • 在此 docker-compose.yml 檔案中,env_file 組態選項會指向 .env 檔案,而且它也會在 DEBUG=1 檔案中直接定義環境變數 docker-compose.yml

    services: web: build: . environment: - DEBUG=1 env_file: - .env
備註
  • 如果您在兩個檔案中設定相同的環境變數,則 docker-compose.yml 檔案中定義之變數的優先順序高於 .env 檔案中定義的變數。

  • 請小心不要在等號 (=) 和指派給變數的值之間留下空格,以防止空格加入字串中。

若要進一步了解 Docker Compose 中的環境變數,請參閱 Compose 中的環境變數

對環境變數使用插補功能 (Docker Compose)

2023 年 7 月 28 日的平台發行開始,Docker Amazon Linux 2 平台分支提供 Docker Compose 插補功能。使用此功能,Compose 檔案中的值可由變數設定,並在執行期進行插補。如需有關此功能的詳細資訊,請參閱 Docker 文件網站上的插補

重要

如果想搭配使用此功能與您的應用程式,請注意,您需要實作使用平台勾點的方法。

這是必要的,因為我們在平台引擎中實作了緩解措施。這種緩解措施可讓不知道新插補功能,且擁有使用環境變數搭配 $ 字元之現有應用程式的客戶確保回溯相容性。預設情況下,更新後的平台引擎透過將 $ 字元取代為 $$ 字元來轉義插補。

以下是平台勾點指令碼範例,您可以將其設定為允許使用插補功能。

#!/bin/bash : ' example data format in .env file key1=value1 key2=value2 ' envfile="/var/app/staging/.env" tempfile=$(mktemp) while IFS= read -r line; do # split each env var string at '=' split_str=(${line//=/ }) if [ ${#split_str[@]} -eq 2 ]; then # replace '$$' with '$' replaced_str=${split_str[1]//\$\$/\$} # update the value of env var using ${replaced_str} line="${split_str[0]}=${replaced_str}" fi # append the updated env var to the tempfile echo "${line}" ≫"${tempfile}" done < "${envfile}" # replace the original .env file with the tempfile mv "${tempfile}" "${envfile}"

將平台勾點放在這兩個目錄下:

  • .platform/confighooks/predeploy/

  • .platform/hooks/predeploy/

如需詳細資訊,請參閱本指南的擴充 Linux 平台主題中的 平台勾點

產生增強型運作狀態報告的日誌 (Docker Compose)

Elastic Beanstalk 運作狀態代理程式提供 Elastic Beanstalk 環境的作業系統和應用程式運作狀態指標。其依賴以特定格式轉送資訊的 Web 伺服器日誌格式。

Elastic Beanstalk 假設您以容器身分來執行 Web 伺服器 Proxy。因此,針對執行 Docker Compose 的 Docker 環境,已停用 NGINX Web 伺服器 Proxy。您必須將伺服器設為以 Elastic Beanstalk 運作狀態代理程式所使用的位置和格式來寫入日誌。這麼做可讓您即使在已停用 Web 伺服器 Proxy 的狀態下,也能充分利用增強型運作狀態報告。

如需如何執行此動作的詳細資訊,請參閱 Web 伺服器日誌組態

Docker 容器自訂記錄 (Docker Compose)

為了有效疑難排解問題,並監控您的容器化服務,您可以透過環境管理主控台或 EB CLI,從 Elastic Beanstalk 要求執行個體日誌。執行個體日誌由套件日誌和結尾日誌組成,經過組合和封裝,可讓您以有效且直接的方式,檢視日誌和最近的事件。

Elastic Beanstalk 會在容器執行個體上建立日誌目錄,針對 docker-compose.yml 檔案中定義的每個服務建立一個日誌目錄,位置是 /var/log/eb-docker/containers/<service name>。如果您在 Amazon Linux 2 Docker 平台上使用 Docker Compose 功能,您可以將這些目錄掛載到容器檔案結構中寫入日誌的位置。當您掛載日誌目錄以寫入日誌資料時,Elastic Beanstalk 可從這些目錄收集日誌資料。

如果您的應用程式位於未使用 Docker Compose 的 Docker 平台上,則可以遵循 Docker 容器自訂記錄 (Docker Compose) 中所述的標準程序。

若要將服務的日誌檔案設為可擷取的結尾檔案和套件日誌
  1. 編輯 docker-compose.yml 檔案。

  2. 在您服務的 volumes 金鑰下,將綁定掛載新增至以下內容:

    "${EB_LOG_BASE_DIR}/<service name>:<log directory inside container>

    在以下範例 docker-compose.yml 檔案中:

    • nginx-proxy<服務名稱>

    • /var/log/nginx<容器內的日誌目錄>

    services: nginx-proxy: image: "nginx" volumes: - "${EB_LOG_BASE_DIR}/nginx-proxy:/var/log/nginx"

  • var/log/nginx 目錄包含容器中 nginx-proxy 服務的日誌,其將映射至主機上的 /var/log/eb-docker/containers/nginx-proxy 目錄。

  • 此目錄中的所有日誌現在可以透過 Elastic Beanstalk 的請求執行個體日誌功能,以套件和結尾日誌的形式擷取。

備註
  • ${EB_LOG_BASE_DIR} 是 Elastic Beanstalk 設定的環境變數,具有數值 /var/log/eb-docker/containers

  • Elastic Beanstalk 會針對 /var/log/eb-docker/containers/<service name> 檔案中的每個服務,自動建立 docker-compose.yml 目錄。

Docker 影像

Elastic Beanstalk 的 Docker 和 ECS 受管 Docker 平台分支可支援使用存放於公有或私有線上映像儲存庫的 Docker 影像。

根據 Dockerrun.aws.json 中的名稱來指定映像。請注意這些慣例:

  • Docker Hub 上官方儲存庫中的映像,使用的是單一名稱 (例如,ubuntumongo)。

  • Docker Hub 上的其他儲存庫中的映像要求使用組織名稱 (例如,amazon/amazon-ecs-agent)。

  • 其他線上儲存庫中的映像更進一步要求使用網域名稱 (例如,quay.io/assemblyline/ubuntuaccount-id.dkr.ecr.us-east-2.amazonaws.com/ubuntu:trusty)。

您也可以在環境建立期間,使用 Dockerfile 建置自己的映像。這僅適用於使用 Docker 平台的環境。如需詳細資訊,請參閱「透過 Dockerfile 建置自訂映像」。多容器 Docker 平台無法支援此功能。

您可以 AWS 使用 Amazon 彈性容器註冊表(Amazon ECR)存儲自定義碼頭映像。若將 Docker 影像存放於 Amazon ECR,Elastic Beanstalk 會自動透過您環境的執行個體描述檔向 Amazon ECR 登錄檔進行驗證,因此您無須產生身分驗證檔案並將其上傳至 Amazon Simple Storage Service (Amazon S3)。

不過,您必須於環境的執行個體設定檔新增許可,讓您的執行個體具備存取 Amazon ECR 儲存庫內映像的許可。您可以將 AmazonEC2 ContainerRegistryReadOnly 受管政策附加到執行個體設定檔,以提供對帳戶中所有 Amazon ECR 儲存庫的唯讀存取權,或使用下列範本建立自訂政策授予單一儲存庫的存取權:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowEbAuth", "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken" ], "Resource": [ "*" ] }, { "Sid": "AllowPull", "Effect": "Allow", "Resource": [ "arn:aws:ecr:us-east-2:account-id:repository/repository-name" ], "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:GetRepositoryPolicy", "ecr:DescribeRepositories", "ecr:ListImages", "ecr:BatchGetImage" ] } ] }

將上述原則內的 Amazon Resource Name (ARN) 替換為您儲存庫的 ARN。

在您的 Dockerrun.aws.json 檔案,以 URL 引用映像。若為 Docker 平台,URL 會由 Image 定義:

"Image": { "Name": "account-id.dkr.ecr.us-east-2.amazonaws.com/repository-name:latest", "Update": "true" },

若為多容器 Docker 平台,請使用容器定義物件中的 image 金鑰。

"containerDefinitions": [ { "name": "my-image", "image": "account-id.dkr.ecr.us-east-2.amazonaws.com/repository-name:latest",

欲使用線上登錄檔託管的私有儲存庫內的 Docker 影像,您必須提供身分驗證檔案,內含向登錄檔進行驗證所需的資訊。

透過 docker login 命令產生身分驗證檔案。若是 Docker Hub 上的儲存庫,請執行 docker login

$ docker login

若是其他登錄檔,請納入登錄伺服器的 URL:

$ docker login registry-server-url
注意

如果您的 Elastic Beanstalk 環境使用 Amazon Linux AMI 平台版本 (Amazon Linux 2 之前的版本),請閱讀 Amazon Linux AMI (Amazon Linux 2 之前的版本) 上的 Docker 組態 中的其他資訊。

將名為 .dockercfg 的身分驗證檔案副本上傳至安全的 Amazon S3 儲存貯體。Amazon S3 儲存貯體必須託管在與使用該儲存貯體的環境相同的 AWS 區域。Elastic Beanstalk 無法從其他區域託管的 Amazon S3 儲存貯體下載檔案。針對執行個體設定檔中的 IAM 角色,授予 s3:GetObject 操作的許可。如需詳細資訊,請參閱管理 Elastic Beanstalk 執行個體描述檔

將 Amazon S3 儲存貯體資訊納入 Authentication 檔案內的 authentication (v1) 或 Dockerrun.aws.json (v2) 參數。

如需 Docker 環境的 Dockerrun.aws.json 格式的詳細資訊,請參閱 Docker 組態。針對多容器環境,請參閱 ECS 受管 Docker 組態

如需身分驗證檔案的詳細資訊,請至 Docker 網站參閱 Store images on Docker Hubdocker login

為 Docker 環境設定受管更新

使用受管平台更新,您可以設定環境,根據排程自動更新至平台的最新版本。

如果是 Docker 環境,您可能會要決定自動平台更新是否應跨 Docker 版本實施 — 當新的平台版本包含新的 Docker 版本時。當從執行 2.9.0 版本以上的 Docker 平台版本的環境更新時,Elastic Beanstalk 支援跨 Docker 版本的受管理平台更新。當新的平台版本包含新版本的 Docker 時,Elastic Beanstalk 便會增加小型更新版本的號碼。因此,要允許跨 Docker 版本的受管平台更新,啟用次要和修補程式版本更新的受管平台更新。要避免跨 Docker 版本的受管平台更新,僅啟用修補程式版本更新的受管平台更新。

例如,以下組態檔案可讓受管平台於每個星期二的 9:00 AM UTC 為次要與修補程試版本更新,進而允許跨 Docker 版本的受管更新:

範例 .ebextension/. managed-platform-update 配置
option_settings: aws:elasticbeanstalk:managedactions: ManagedActionsEnabled: true PreferredStartTime: "Tue:09:00" aws:elasticbeanstalk:managedactions:platformupdate: UpdateLevel: minor

針對執行 2.9.0 或更早版本 Docker 平台的環境,若新的平台版本包含新的 Docker 版本,則 Elastic Beanstalk 永遠不會執行受管平台更新。

Docker 組態命名空間

您可以使用組態檔案來設定組態選項,並在部署期間執行其他的執行個體設定工作。組態選項可由 Elastic Beanstalk 服務或您使用的平台來定義,並且會組織成「命名空間」

注意

此資訊僅適用於未執行 Docker Compose 的 Docker 環境。此選項與執行 Docker Compose 的 Docker 環境有不同的行為。如需使用 Docker Compose 之 Proxy 服務的詳細資訊,請參閱 容器選項

除了適用於所有 Elastic Beanstalk 環境的支援選項之外,Docker 也支援使用下列命名空間的選項:

  • aws:elasticbeanstalk:environment:proxy – 選擇適用於您環境的代理伺服器。Docker 支援執行 Nginx 或沒有代理伺服器。

下列範例配置檔案會將 Docker 環境設定為在沒有代理伺服器的情況下運作。

範例 .ebextensions/docker-settings.config
option_settings: aws:elasticbeanstalk:environment:proxy: ProxyServer: none

Amazon Linux AMI (Amazon Linux 2 之前的版本) 上的 Docker 組態

如果您的 Elastic Beanstalk Docker 環境使用 Amazon Linux AMI 平台版本 (之前的 Amazon Linux 2),請閱讀本節中的其他資訊。

如果您要使用私有儲存庫的映像,則此資訊與您相關。自 Docker 版本 1.7 起,docker login 命令會變更身分驗證檔案的名稱和檔案格式。Amazon Linux AMI Docker 平台版本 (Amazon Linux 2 之前的版本) 需要較舊的 ~/.dockercfg 格式組態檔案。

若使用 Docker 版本 1.7 和更新版本,docker login 命令會於 ~/.docker/config.json 建立身分驗證檔案,格式如下。

{ "auths":{ "server":{ "auth":"key" } } }

若使用 Docker 版本 1.6.2 和更早版本,docker login 命令會於 ~/.dockercfg 建立身分驗證檔案,格式如下。

{ "server" : { "auth" : "auth_token", "email" : "email" } }

欲轉換 config.json 檔案,請移除外部 auths 金鑰、新增 email 金鑰並平展 JSON 文件,以符合舊的格式。

在 Amazon Linux 2 Docker 平台版本上,Elastic Beanstalk 會使用較新的身分驗證檔案名稱和格式。如果您使用的是 Amazon Linux 2 Docker 平台版本,則可以使用 docker login 命令建立的身分驗證檔案,而無需進行任何轉換。

為了提高 Amazon Linux AMI 的效能,Elastic Beanstalk 為您 Docker 環境的 Amazon EC2 執行個體設定兩個 Amazon EBS 儲存磁碟區。除了所有 Elastic Beanstalk 環境佈建的根磁碟區,Docker 環境會佈建第二個名為 xvdcz 的 12GB 磁碟區供映像儲存使用。

若您需要更多儲存空間或增加 IOPS 供 Docker 影像使用,您可於 aws:autoscaling:launchconfiguration 命名空間使用 BlockDeviceMapping 組態選項,藉此自訂映像儲存磁碟區。

例如,下列組態檔案會將儲存磁碟區的大小提高為 100 GB,而佈建 IOPS 為 500:

範例 .ebextensions/blockdevice-xvdcz.config
option_settings: aws:autoscaling:launchconfiguration: BlockDeviceMappings: /dev/xvdcz=:100::io1:500

若您使用 BlockDeviceMappings 選項來設定您應用程式的其他磁碟區,您應該納入 xvdcz 的映射,以確保該磁碟區已建立。下列範例設定兩個磁碟區,一個為使用預設設定的映像儲存磁碟區 xvdcz,另一個則是名為 sdh 的額外 24 GB 應用程式磁碟區:

範例 .ebextensions/blockdevice-sdh.config
option_settings: aws:autoscaling:launchconfiguration: BlockDeviceMappings: /dev/xvdcz=:12:true:gp2,/dev/sdh=:24
注意

當於此命名空間變更設定時,Elastic Beanstalk 會將您環境中的所有執行個體,替換為執行新組態的執行個體。如需詳細資訊,請參閱「組態變更」。