您可以設定讓 Compute Engine 執行個體或執行個體範本部署及啟動 Docker 容器。Compute Engine 會提供已安裝 Docker 的最新版 Container-Optimized OS (COS) 映像檔,並在執行個體啟動時啟動容器。
事前準備
- 如果您不熟悉容器,請參閱「容器簡介及優點」。
- 如果您不熟悉 Docker,請閱讀 Docker 說明文件。
- 瞭解 Container-Optimized OS。
- 瞭解代管執行個體群組 (MIG)。
-
如果尚未設定驗證,請先完成設定。
驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:
選取這個頁面上的分頁,瞭解如何使用範例:
控制台
使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,無須設定驗證。
gcloud
-
安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:
gcloud init若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
- 設定預設地區和區域。
選擇在執行個體和 MIG 上部署容器
在 Compute Engine 上部署容器,既可簡化應用程式的部署,又可控管執行個體基礎架構。
- 用您在設定及管理 Compute Engine 基礎架構時,處理其他任何執行個體的相同方式,管理執行容器的執行個體。
- 使用熟悉的流程與工具 (例如 Google Cloud CLI 或 Compute Engine API) 管理含有容器的執行個體。
- 使用執行容器的代管執行個體群組 (MIG) 建立可擴充的服務,可提供自動調度資源、自動修復、滾動式更新、多區域部署和負載平衡之類的功能。
此外,您可能會考慮部署至 Google Kubernetes Engine 以達成下列目的:
- 執行大量的微服務
- 縮短容器的啟動時間
- 利用 Kubernetes 的自動化調度管理,包括自動升級、節點自動修復及自動調度資源
如果在 Compute Engine 的獨立執行個體上執行每個微服務,可能會使作業系統負擔佔去成本的絕大部分。Google Kubernetes Engine 可讓您為每個執行個體部署多個容器及多組容器,更有效率地將主機執行個體資源分配至占用空間較小的微服務。
在 Compute Engine 上部署容器的運作方式
將軟體部署到 Compute Engine 執行個體的常見方法包括:
- 使用開機指令碼或 cloud-init 在執行個體開機時部署軟體。
- 建立已預先安裝軟體的自訂開機磁碟映像檔。
以上兩種方法皆結合了設定應用程式與設定作業系統環境的工作。身為開發人員,您必須仔細追蹤及解決任何執行階段相依性。舉例來說,如果在 VM 上執行的兩個應用程式使用同一個程式庫的不同版本,您就必須安裝這兩個版本,並透過系統變數來指向各版本。
或者,您也可以將容器中的軟體部署到執行個體或 MIG。容器含有應用程式軟體和必要的程式庫,並且會與 OS 應用程式和程式庫分隔開來。容器可在部署環境之間移動,而無需處理容器及其 OS 中發生衝突的程式庫版本。
以下程序說明如何在 Compute Engine 上部署容器:
- 將您的應用程式和必要的程式庫整合到 Docker 映像檔中,然後將這個映像檔發布到 Artifact Registry,或 Docker Hub 等第三方註冊資料庫。
- 為 MIG 建立執行個體或執行個體範本時,指定 Docker 映像檔名稱和
docker run設定。
在您提出要求建立執行個體後,Compute Engine 就會執行下列工作:
- Compute Engine 會使用 Google 提供的 Container-Optimized OS 映像檔,建立 VM 執行個體。這個映像檔內含 Docker 執行階段及負責啟動您的容器的其他軟體。
- Compute Engine 將您的容器設定儲存在
gce-container-declaration中繼資料鍵下的執行個體中繼資料中。 - VM 啟動時,Container-Optimized OS 映像檔會使用儲存在執行個體中繼資料中的
docker run指令設定,從存放區提取容器映像檔,然後啟動容器。
限制
- 每個執行個體只能部署一個容器。如果每個執行個體必須部署多個容器,請考慮使用 Google Kubernetes Engine。
您只能從公開存放區,或可存取的私人 Artifact Registry 或 Container Registry 存放區部署容器。系統不支援其他私人存放區。
如要瞭解私有登錄檔權限,請參閱 Artifact Registry 或 Container Registry 的存取權控管說明文件。
您無法將執行個體的通訊埠對應至容器的通訊埠 (Docker 的
-p選項)。如要啟用容器存取權,請參閱發布容器埠。Container-Optimized OS 映像檔只能與這種部署方法搭配使用。
您只能透過 Google Cloud 控制台或 Google Cloud CLI 使用這項功能,不能透過 API。
準備要部署的容器
請選用下列其中一種方法,讓 Compute Engine 可以存取您的容器映像檔:
- 上傳 Docker 映像檔至 Artifact Registry。
- 使用可從 Docker Hub 或其他註冊資料庫中公開取得的容器映像檔。
在新的執行個體上部署容器
您可以使用Google Cloud 控制台或 Google Cloud CLI,在新的 VM 執行個體上部署容器。
控制台
下列範例將容器從 Google 提供的 Nginx Docker 映像檔 https://gcr.io/cloud-marketplace/google/nginx1:latest 部署至 VM 執行個體。如要使用其他 Docker 映像檔,請在下列步驟中將 Nginx Docker 映像檔替換為所需映像檔。
如果出現提示,請選取專案並按一下「繼續」。「建立執行個體」頁面隨即顯示,並顯示「機器設定」窗格。
在「機器設定」窗格中,前往「名稱」,然後指定執行個體的名稱。詳情請參閱資源命名慣例。
在導覽選單中,按一下「OS and storage」(OS 和儲存空間)。「作業系統和儲存空間」窗格隨即顯示。
前往「容器」部分,然後按一下「部署容器」。在隨即顯示的「設定容器」窗格中,執行下列操作:
- 指定要使用的容器映像檔。請參考以下範例:
- 如要從 Cloud Launcher 選取 NGINX 1.12 容器映像檔,請指定
gcr.io/cloud-marketplace/google/nginx1:1.12。 - 如要從 Docker Hub 部署 Apache 容器映像檔,請一律指定完整的 Docker 映像檔名稱,例如
docker.io/httpd:2.4。
- 如要從 Cloud Launcher 選取 NGINX 1.12 容器映像檔,請指定
- 選用。指定您選擇的任何其他設定參數。 如要進一步瞭解容器設定選項,請參閱「設定執行容器的選項」。
- 如要完成設定容器並返回「作業系統和儲存空間」窗格,請按一下「選取」。
- 指定要使用的容器映像檔。請參考以下範例:
選用:指定其他設定選項。詳情請參閱「建立執行個體時的設定選項」。
如要完成建立執行個體,請按一下「建立」。
建立執行個體後,Compute Engine 會啟動執行個體並啟動容器。
gcloud
-
在 Google Cloud 控制台中啟用 Cloud Shell。
Google Cloud 主控台底部會開啟一個 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已針對您目前的專案設定好相關值。工作階段可能要幾秒鐘的時間才能初始化。
執行
gcloud compute instances create-with-container指令:gcloud compute instances create-with-container INSTANCE_NAME \ --container-image=CONTAINER_IMAGE更改下列內容:
INSTANCE_NAME: 新執行個體的名稱。CONTAINER_IMAGE:容器映像檔的名稱。
舉例來說,下列指令會建立名為
nginx-vm的執行個體,以啟動並執行容器映像檔:gcr.io/cloud-marketplace/google/nginx1:1.12gcloud compute instances create-with-container nginx-vm \ --container-image=gcr.io/cloud-marketplace/google/nginx1:1.12如要從 Docker Hub 部署 Apache 容器映像檔,請一律指定完整的 Docker 映像檔名稱:
docker.io/httpd:2.4。
在執行個體上更新容器
您可以使用 Google Cloud 控制台或 Google Cloud CLI 更新 Docker 映像檔和設定選項,以在執行個體上執行容器。
更新執行容器的 VM 時,Compute Engine 會執行兩個步驟:
- 在執行個體上更新容器宣告。Compute Engine 會將更新後的容器宣告儲存到
gce-container-declaration中繼資料鍵下的執行個體中繼資料中。 - 如果執行個體正在執行中,系統會停止並重新啟動執行個體,以啟用更新後的設定;如果執行個體處於停止狀態,則會更新容器宣告並使執行個體保持停止狀態。執行個體會下載新的映像檔,並在啟動時啟動容器。
控制台
前往「VM instances」(VM 執行個體) 頁面。
按一下要更新的執行個體名稱。
在執行個體詳細資料頁面中,按一下「編輯」。
指定新的容器映像檔,然後更新執行容器的相關選項 (如有需要)。
如要儲存變更,請按一下「儲存並重新啟動」。Compute Engine 隨即儲存變更,接著自動重新啟動執行個體來執行更新。執行個體重新啟動後,會下載新的映像檔並以更新後的設定啟動容器。
gcloud
使用 gcloud compute instances update-container 指令更新容器宣告。例如:
gcloud compute instances update-container nginx-vm \
--container-image gcr.io/cloud-marketplace/google/nginx1:latest
這個指令會將容器映像檔設為 gcr.io/cloud-marketplace/google/nginx1:latest,然後重新啟動執行個體來啟用變更。您也可以藉由新增對應的標記,更新設定選項以執行容器一文中所述的任何屬性。
執行個體重新啟動後,會下載新的容器映像檔並以新的設定啟動容器。
在代管執行個體群組上部署容器
您可以按照下列步驟,使用Google Cloud 控制台或 Google Cloud CLI,將容器部署到新的代管執行個體群組 (MIG):
控制台
下列範例會建立一個執行個體範本,這個範本會從 Google 提供的 Nginx (gcr.io/cloud-marketplace/google/nginx1:15) Docker 映像檔,將容器部署到 MIG。如要使用其他 Docker 映像檔,請將下列範例中的 gcr.io/cloud-marketplace/google/nginx1:15 替換為要使用的映像檔。
前往「Instance templates」(執行個體範本) 頁面。
如要建立執行個體範本,請按一下「建立執行個體範本」。
在「Container」(容器) 下方,選取「Deploy container image」(部署容器映像檔)。
在「Container image」(容器映像檔) 下指定 Docker 映像檔名稱,然後設定執行容器的相關選項。 例如,您可為容器映像檔指定
gcr.io/cloud-marketplace/google/nginx1:15。點選「建立」。
接下來,請使用新的執行個體範本建立 MIG。
gcloud
使用 gcloud compute instance-templates create-with-container 指令,建立用來執行 Docker 映像檔的執行個體範本:
gcloud compute instance-templates create-with-container TEMPLATE_NAME \ --container-image DOCKER_IMAGE
您也可以設定執行容器的選項。
舉例來說,下列指令會建立名為 nginx-template 的新執行個體範本,其內容會包括 Docker 映像檔的相關資訊。從這個範本建立的執行個體會在啟動時,啟動並執行 Docker 映像檔 gcr.io/cloud-marketplace/google/nginx1:15。
gcloud compute instance-templates create-with-container nginx-template \
--container-image gcr.io/cloud-marketplace/google/nginx1:15
接下來,使用新的執行個體範本建立 MIG。
現在您已擁有執行個體範本,可用此來建立 MIG。舉例來說,如要使用 gcloud CLI 和您剛建立的 nginx-template 建立 MIG,請執行下列指令:
gcloud compute instance-groups managed create example-group \
--base-instance-name nginx-vm \
--size 3 \
--template nginx-template
更新執行容器的代管執行個體群組
您可以更新代管執行個體群組 (MIG),以部署新版的 Docker 映像檔或新版的 Container-Optimized OS 映像檔。
將 MIG 更新為新版容器映像檔
您可以使用 Managed Instance Group Updater,按照下列三個步驟,將新版的 Docker 映像檔部署至代管執行個體群組:
- 準備要部署的新 Docker 映像檔。
- 以建立容器型範本的相同方式,建立以新 Docker 映像檔為基礎的執行個體範本。
- 使用 Managed Instance Group Updater,將 MIG 更新為新的執行個體範本。
將代管執行個體群組更新為新版本的 Container-Optimized OS 映像檔
Google 會定期更新 Container-Optimized OS 映像檔,您可能會想將這些更新套用到容器化 MIG,而不變更 Docker 映像檔。您可以使用 Google Cloud 控制台或 Google Cloud CLI,分兩個步驟將 MIG 更新為新版的 Container-Optimized OS 映像檔:
- 根據目前版本的 Docker 映像檔建立執行個體範本,其方法與建立容器型範本以用於新代管執行個體群組的方式相同。根據預設,系統會使用支援的 Container-Optimized OS 映像檔最新版本。
- 使用 Managed Instance Group Updater,以新的執行個體範本更新 MIG。
使用 SSH 連線到容器
您可以使用 SSH 連線到執行個體上的容器,使用 gcloud CLI 執行加上 --container 標記的 gcloud compute ssh:
gcloud compute ssh INSTANCE_NAME --container CONTAINER_NAME
更改下列內容:
INSTANCE_NAME:執行個體的名稱CONTAINER_NAME:容器名稱
進一步瞭解 gcloud compute ssh 指令及其引數。
監控 Compute Engine 上的容器
如要監控執行 Container-Optimized OS 映像檔的執行個體,請使用 Node Problem Detector 代理程式,該代理程式會與 Cloud Monitoring 通訊,並回報與健康狀態相關的指標。從里程碑 77 開始,代理程式已內建於 Container-Optimized OS 映像檔中。
如要啟用代理程式,請在 Milestone 88 以上版本的映像檔中,編輯自訂中繼資料區段,並將 google-monitoring-enabled 設為 true。
如要瞭解啟用節點問題偵測工具的其他方式,請參閱「啟用健康狀態監控功能」。
Node Problem Detector 代理程式支援指標清單中以 guest/ 開頭的指標。
如要與代理程式收集的指標互動,請前往 Metrics Explorer。
查看記錄
您可以查看容器相關的三種類型記錄:
啟動代理程式記錄,也稱為 konlet 記錄。啟動代理程式會剖析容器的設定並執行工作,以在 Compute Engine 執行個體上啟動容器。
Docker 事件記錄會回報容器事件,包括容器啟動和停止事件。
容器中的記錄包含在容器中執行的應用程式中的
STDOUT。
查看啟動代理程式記錄
在序列主控台中、透過 journald 系統服務 (包含在 OS 映像檔中) 及透過 Cloud Logging,都可以取得啟動代理程式記錄。
在序列主控台中查看啟動代理程式記錄
主控台
前往「VM instances」(VM 執行個體) 頁面。
選取要查看啟動代理程式記錄的執行個體。
在「Logs」(記錄) 下,按一下 [Serial port 1 (console)] (序列埠 1 (主控台)) 即可查看序列主控台記錄。
gcloud
使用 get-serial-port-output 指令查看執行個體序列埠的記錄。
gcloud compute instances get-serial-port-output INSTANCE_NAME
將 INSTANCE_NAME 替換為執行個體名稱。
舉例來說,您可以使用下列指令來查看名為 nginx-vm 的執行個體序列埠輸出:
gcloud compute instances get-serial-port-output nginx-vm
在 journald 中查看啟動代理程式記錄
- 使用 SSH 連線到含有容器的執行個體。
執行
sudo journalctl指令,查看執行個體啟動和容器啟動記錄。使用下列指令篩選容器啟動代理程式記錄 (konlet)。sudo journalctl -u konlet*
在 Logging 中查看啟動代理程式記錄
控制台
前往「VM instances」(VM 執行個體) 頁面。
選取要查看啟動代理程式記錄的執行個體。
在「Logs」(記錄) 底下,按一下「Cloud Logging」(Cloud Logging) 即可查看 Cloud Logging 記錄。
輸入搜尋篩選器,擷取啟動代理程式記錄。
resource.type="gce_instance" logName="projects/PROJECT_ID/logs/cos_system" jsonPayload.SYSLOG_IDENTIFIER="konlet-startup" jsonPayload._HOSTNAME="INSTANCE_NAME"
更改下列內容:
PROJECT_ID:包含執行個體的專案 IDINSTANCE_NAME:要取得記錄的執行個體名稱
gcloud
將 gcloud logging read 指令與適當的篩選器搭配使用,即可查看容器啟動代理程式記錄。
gcloud logging read "resource.type=gce_instance AND \
logName=projects/PROJECT_ID/logs/cos_system AND \
jsonPayload.SYSLOG_IDENTIFIER=konlet-startup AND \
jsonPayload._HOSTNAME=INSTANCE_NAME"
更改下列內容:
PROJECT_ID:包含執行個體的專案 IDINSTANCE_NAME:要取得記錄的執行個體名稱
舉例來說,如要針對執行 COS 70 且存在於 my-project 的執行個體 nginx-vm,查看其在 Logging 中最近 10 筆啟動代理程式記錄,請使用下列指令。
gcloud logging read "resource.type=gce_instance AND \
logName=projects/my-project/logs/cos_system AND \
jsonPayload.SYSLOG_IDENTIFIER=konlet-startup AND \
jsonPayload._HOSTNAME=nginx-vm" \
--limit 10
查看 Docker 事件記錄
您可以在 journald 和 Cloud Logging 中查看 Docker 事件記錄。
在 journald 中查看 Docker 事件記錄
- 使用 SSH 連線到含有容器的執行個體。
搭配下列篩選器執行
sudo journalctl指令,即可查看 Docker 事件記錄。sudo journalctl -u docker-events-collector
在 Logging 中查看 Docker 事件記錄
控制台
前往「VM instances」(VM 執行個體) 頁面。
選取要查看啟動代理程式記錄的執行個體。
在「Logs」(記錄) 底下,按一下「Cloud Logging」(Cloud Logging) 即可查看 Cloud Logging 記錄。
輸入下列搜尋篩選器,擷取 Docker 事件記錄。
resource.type="gce_instance" logName="projects/PROJECT_ID/logs/cos_system" jsonPayload._HOSTNAME="INSTANCE_NAME" jsonPayload.SYSLOG_IDENTIFIER="docker"
更改下列內容:
PROJECT_ID:包含執行個體的專案 IDINSTANCE_NAME:要取得記錄的執行個體名稱
gcloud
將 gcloud logging read 指令與適當的篩選器搭配使用,即可查看 Docker 事件記錄。
gcloud logging read "resource.type=gce_instance AND \
logName=projects/PROJECT_ID/logs/cos_system AND \
jsonPayload._HOSTNAME=INSTANCE_NAME AND \
jsonPayload.SYSLOG_IDENTIFIER=docker"
更改下列內容:
PROJECT_ID:包含執行個體的專案 IDINSTANCE_NAME:要取得記錄的執行個體名稱
舉例來說,如要針對執行 COS 70 且存在於 my-project 的執行個體 nginx-vm,查看其在 Logging 中最近 10 筆 Docker 事件記錄,請使用下列指令。
gcloud logging read "resource.type=gce_instance AND \
logName=projects/my-project/logs/cos_system AND \
jsonPayload._HOSTNAME=nginx-vm AND \
jsonPayload.SYSLOG_IDENTIFIER=docker" \
--limit 10
查看容器記錄
主控台
前往「VM instances」(VM 執行個體) 頁面。
選取要查看啟動代理程式記錄的執行個體。
在「Logs」(記錄) 底下,按一下「Cloud Logging」(Cloud Logging) 即可查看 Cloud Logging 記錄。
「Cloud Logging」頁面會載入預設搜尋篩選器。複製
resource.labels.instance_id的值。以供稍後使用。更新搜尋篩選器,擷取容器記錄。
resource.type="gce_instance" logName="projects/PROJECT_ID/logs/cos_containers" resource.labels.instance_id="INSTANCE_ID"
更改下列內容:
PROJECT_ID:包含執行個體的專案 IDINSTANCE_ID:要取得記錄的執行個體 ID
gcloud
使用 gcloud logging read 指令查看容器記錄。
決定您要取得其記錄的執行個體 ID:
gcloud compute instances describe INSTANCE_NAME \ --zone ZONE \ --format="value(id)"
更改下列內容:
INSTANCE_NAME:要取得記錄的執行個體名稱ZONE:執行個體所在的可用區
使用下列指令與篩選器查看執行個體的容器記錄。
gcloud logging read "resource.type=gce_instance AND \ logName=projects/PROJECT_ID/logs/cos_containers AND \ resource.labels.instance_id=INSTANCE_ID"更改下列內容:
PROJECT_ID:包含執行個體的專案 ID。INSTANCE_ID:執行個體的 ID。
舉例來說,如要針對執行 COS 70、存在於
my-project且執行個體 ID 為555123456789012345的執行個體,查看其在 Cloud Logging 中最近 10 筆容器記錄,請使用下列指令。gcloud logging read "resource.type=gce_instance AND \ logName=projects/my-project/logs/cos_containers AND \ resource.labels.instance_id=555123456789012345" \ --limit 10
指定容器最佳化的映像檔或映像檔系列
根據預設,容器化執行個體或執行個體範本會使用支援的最新容器最佳化映像檔。這個映像檔屬於 cos-cloud 專案。
您可以從 cos-cloud 專案中選取其他圖片,覆寫這項預設值。
如要瞭解可用的映像檔系列及其屬性,請參閱選擇合適的 Container-Optimized OS 版本。
舉例來說,在 gcloud CLI 中,瞭解要使用的映像檔後,請提供 --image 旗標覆寫預設的容器最佳化映像檔,或提供 --image-family 旗標,在建立執行個體時從指定系列中挑選最新的映像檔。
以下範例會建立容器化執行個體,並使用來自 cos-dev 映像檔系列中的最新映像檔:
gcloud compute instances create-with-container nginx-vm \
--image-family cos-dev \
--image-project cos-cloud \
--container-image gcr.io/cloud-marketplace/google/nginx1:1.15
設定防火牆規則
容器化執行個體會啟動網路設為主機模式的容器。容器共用主機網路堆疊,而主機中的所有介面都可提供給容器使用。
根據預設, Google Cloud 防火牆規則會封鎖執行個體的所有連入連線,並允許執行個體的所有連出連線。
建立防火牆規則,讓您的執行個體允許連入連線,進而允許連線連入容器。
設定執行容器的選項
您可以設定下列選項來執行容器:
- 指定容器重新啟動政策。
- 覆寫容器
ENTRYPOINT(在容器啟動時所要執行的預設指令)。 - 將引數傳遞到容器
ENTRYPOINT指令。 - 在特權模式中執行容器。
- 掛接主機目錄或
tmpfs做為容器內的資料磁碟區。 - 設定環境變數。
- 為容器執行階段中的
STDIN分配緩衝區。 - 分配虛擬 TTY。
進一步瞭解如何設定選項以執行容器。
後續步驟
- 瞭解如何設定選項以執行容器。
- 進一步瞭解代管執行個體群組。
- 瞭解 Container-Optimized OS。