Compute Engine 上的容器


軟體容器可讓您輕鬆地在多個獨立的使用者空間執行個體中執行應用程式。您可以在 Linux 或 Windows Server 公開 VM 映像檔,或 Container-Optimized OS 映像檔上執行容器。容器可讓應用程式在託管虛擬機器 (VM) 上運作時所帶的依附元件數量較少,且能夠獨立於您在同個 VM 例項上部署的其他容器化應用程式,彼此分開運作。這些特性可讓容器化的應用程式更具可攜性、更易於部署,也能更輕鬆地進行大規模維護作業。

本文件介紹了一些較為常見的容器技術,您可以運用這些技術在 Compute Engine 執行個體上執行容器。您可以在 Compute Engine 提供的大多數公開 VM 映像檔上使用這些技術。

當您需要透過容器環境和容器自動化調度管理工具來取得完全控制時,請在 Compute Engine 上執行容器。

另外,您也可以使用 Google Kubernetes Engine (GKE) 來簡化叢集管理和容器自動化調度管理任務,這樣就不需要管理基礎虛擬機器執行個體。GKE 提供代管環境,讓您透過 Google 基礎架構部署、管理容器化應用程式及調度資源。

GKE 環境包含多部機器,也就是 Compute Engine 執行個體,組合起來即形成一個叢集。執行 GKE 叢集時,您可以享有進階叢集管理功能帶來的優點,例如負載平衡、節點集區、節點自動修復、自動調度資源和升級,以及 Google Cloud 提供的記錄和監控功能。

瞭解如何建立執行 Microsoft Windows Server 的 GKE 叢集

歡迎試用

如果您未曾使用過 Google Cloud,歡迎建立帳戶,親自體驗實際使用 Compute Engine 的成效。新客戶可以獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。

免費試用 Compute Engine

Compute Engine 上執行的容器技術

一般而言,Compute Engine 執行個體可執行絕大部分的容器技術或工具。您可以在新型 Linux 作業系統上執行數種不同類型的容器。您也可以在 Windows Server 2016 以上版本上執行 Docker。下面列出了幾種用於執行和管理容器化的應用程式的常用工具:

  • DockerPodman 是兩種常用的容器技術,可讓您執行容器化應用程式。
  • Kubernetes 是一種容器自動化調度管理平台,可用來針對在多個執行個體上或在混合式雲端環境內部執行的容器,進行管理和資源調度。
  • Compute Engine 上的容器可讓您輕鬆地將容器部署到 Compute Engine VM 執行個體或代管執行個體群組
  • 您可以將現有的系統轉換為 LXD 映像檔,並在 Compute Engine VM 執行個體中執行,做為隨即轉移遷移解決方案。LXD 會在 Ubuntu 映像檔上執行。

此外,也可使用 Artifact Registry 來管理容器映像檔的版本。Artifact Registry 可做為儲存和管理容器映像檔的集中位置,方便之後將映像檔部署至 Compute Engine 上的 Kubernetes 或 Google Kubernetes Engine 叢集。

容器最佳化 VM 映像檔

Compute Engine 提供了數種公開 VM 映像檔,可用來建立執行個體和執行容器工作負載。其中部分公開 VM 映像檔具有簡約的容器最佳化作業系統,內含預先安裝的較新版本 Docker、Podman 或 Kubernetes。下列公開映像檔系列是專門為執行容器所設計:

  • Google 提供的 Container-Optimized OS
    • 包含:Docker、Kubernetes
    • 映像檔專案:cos-cloud
    • 映像檔系列:cos-stable
  • Fedora CoreOS
    • 包含:Podman、Docker
    • 映像檔專案:fedora-coreos-cloud
    • 映像檔系列:fedora-coreos-stable
  • Ubuntu
    • 包含:LXD
    • 映像檔專案:ubuntu-os-cloud
    • 映像檔系列:ubuntu-2004-lts

若需要在映像檔上執行特定的容器工具和技術,但依據預設映像檔並未包含這些工具和技術,則請以手動方式安裝

在執行個體上安裝容器技術

如要在執行個體上啟動單一容器,您可以在建立執行個體時指定容器映像檔。Compute Engine 會自動提供已安裝 Docker 的最新版 Container-Optimized OS 映像檔,並在 VM 啟動時啟動容器。詳情請參閱在 VM 上部署容器

或者,您也可以使用您需要的任何容器技術和自動化調度管理工具,在 Compute Engine 上執行容器工作負載。您可以利用公開 VM 映像檔建立執行個體,然後安裝您要的容器技術。例如:

某些情況下,您可能需要取得這些技術的特定版本,才能保證搭配起來可正常運作。例如,Kubernetes 通常搭配特定版本的 Docker 才能取得最佳運作效果。一般而言,這通常就是指安裝最新版本。

在 Windows Server 映像檔上安裝 Docker

Windows Server 2016 以上版本均包含容器支援。如果您打算在 Windows Server 執行個體上執行 Docker 容器,可以在 Windows Server 基本映像檔上安裝 Docker,或使用 Mirantis 的市集映像檔。

如果您要在 Windows Server 基本映像檔上安裝 Docker CE,請按照下列步驟操作。

首先,請使用 Windows Server 2019 以上版本的公開映像檔建立 Windows Server 執行個體。為取得最佳的容器支援,建議您使用最新的 Windows Server LTSC 版本。如要進一步瞭解 LTSC,請參閱 Windows Server 維護管道

安裝 Docker

在 Windows 上安裝 Docker。詳情請參閱「為容器準備 Windows」。安裝完成後,請重新啟動執行個體。

其他設定步驟

此時,您可在執行個體中使用 Docker 來執行容器。舉例來說,下列指令會下載 Windows nanoserver 容器映像檔,並在 nanoserver 容器中執行命令提示字元:

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver:1809 cmd.exe

Docker 的預設網路 MTU 為 1500 位元組。如果您也將 VPC 網路 MTU 設為 1500 位元組,可以忽略本節的其餘內容。不過,如果您在網路中使用預設的 1460 位元組虛擬私有雲端 MTU,就必須針對每個執行個體進行額外設定。

在每個執行個體的 PowerShell 終端機中執行下列指令,將所有網路介面 (乙太網路和 vEthernet) 的 MTU 設為 1460

PS C:\> Get-NetAdapter | Where-Object Name -like "*Ethernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}
PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295            1          0          0  Loopback Pseudo-Interface 1
  1460                1     306804     668688  Ethernet
  1460                1          0       1282  vEthernet (nat)

即使變更了執行個體的 MTU,容器的網際網路連線能力仍可能不太穩定,因為根據預設,容器的網路介面也會使用 1500 的 MTU。如需為所有容器正確設定 MTU 的指令,請參閱「容器 MTU」一節。

在設定 Docker 網路時,可能需要定期重新執行這些 MTU 指令。如需詳細資料,請參閱「已知問題」一節。

執行 Windows 容器

有許多資源可協助您開始使用 Windows 容器:

  • Microsoft 提供內容廣泛的 Windows 容器說明文件
  • Docker Hub 可做為儲存及提取 Windows 容器的存放區。

Windows 容器的已知問題

淘汰 Windows Server 2019 for Containers 映像檔

Google 提供 Windows Server 映像檔系列,其中預先安裝 Mirantis Container Runtime (先前稱為 Docker EE):

  • Windows
    • 包含:Docker
    • 映像檔專案:windows-cloud
    • 映像檔系列:windows-2019-core-for-containers

2023 年初,Microsoft 停止發行及支援 Windows Server 專用的 Mirantis Container Runtime。雖然 Google 可繼續發布這個映像檔系列,直到 2023 年 10 月 30 日為止,但該系列現已淘汰,系列中的所有圖片也已標示為已淘汰。

在 2023 年 10 月 30 日前建立的映像檔所建立的虛擬機器,將繼續不間斷地執行。不過,如果您想在該日期後以這些映像檔建立新的執行個體,將會失敗。

在 2023 年 10 月 30 日前從這些圖片衍生的自訂圖片,將繼續運作。不過,自訂映像檔不會自動接收任何 Patch Tuesday Windows 更新,也不會接收更新版的 Mirantis Container Runtime。

如果您想繼續使用預先安裝 Mirantis Container Runtime 的映像檔,Mirantis Inc 在 Google Cloud Marketplace 提供映像檔。這些 VM 映像檔的費用包含直接向 Mirantis 取得 Mirantis Container Runtime 的支援和授權。有意使用獨立 Mirantis Container Runtime 的客戶也可以直接從 Mirantis 網站下載。

如果您想遷移至 Docker CE 等其他容器執行階段,請按照上方的操作說明進行。

容器在全體 Windows 版本上不相容

在舊版 Windows 中建立的容器,無法在執行新版 Windows 的 Compute Engine 執行個體中運作。根據預設,Docker 會提取 Windows Server 2019 版本的容器。這表示在執行 Windows Server 1709 或更新版本的執行個體中執行下列指令,就會發生錯誤:

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver cmd.exe
docker: Error response from daemon: container
9a1eb8bbcba4e91792be65f3c40b5a1aee062f02fbc60a78444b47d043438069 encountered an
error during CreateContainer: failure in a Windows system call: The operating
system of the container does not match the operating system of the host.
(0xc0370101)

Microsoft 的「Windows 容器版本相容性」頁面提供相關的詳細資訊。如要解決 Windows 容器版本不相容的問題,請在提取及執行容器時,指定對應至 Windows 版本的標記。舉例來說,在 Windows Server 20H2 版執行個體中,請使用下列指令在 20H2 版 nanoserver 容器中執行命令提示字元,而非在預設的 2019 LTSC (1809) 版容器中執行:

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver:1809 cmd.exe

MTU 的不相容性影響到執行個體與容器的連線能力

當您在 Windows 執行個體上使用 docker network createNew-VMSwitch 指令建立容器網路時,系統通常會將執行個體網路介面的 MTU 強制設為 1500。新 Docker 容器中的預設網路介面,通常也會使用 1500 的 MTU。如果虛擬私有雲網路的 MTU 為 1460,您可能會遇到下列問題:

  • 遠端桌面協定工作階段可能會停止,且無法重新連線。已知在建立透明容器網路時,會發生此問題。

  • 容器內部的 DNS 解析可能會失敗。

  • DNS 解析成功,但可能無法建立容器至網際網路的 HTTP 連線。

解決這些限制的建議解決方法有兩個步驟:將執行個體網路介面的 MTU 設為 1460,以及將容器網路介面的 MTU 設為 1460。或者,您也可以將 VPC 的 MTU 設為 1500,但這需要停止或遷移所有 VM。

1. 設定 Windows 執行個體網路介面的 MTU

在 Windows 執行個體的 PowerShell 終端機中執行下列指令,設定所有網路介面 (乙太網路和 vEthernet) 的 MTU:

PS C:\> Get-NetAdapter | Where-Object Name -like "*Ethernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}

使用以下指令檢查執行個體的乙太網路和 vEthernet 介面 MTU 是否已設為 1460

PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295            1          0          0  Loopback Pseudo-Interface 1
  1460                1  628295912    2613170  Ethernet
  1460                1      37793     223909  vEthernet (nat)

如果您無法再透過遠端桌面協定連線至執行個體,因此無法執行這些指令,可以透過序列主控台連線至執行個體,啟動 cmd 提示,然後在該提示中執行 netsh 指令來修復 MTU。為避免發生這種情況,建議您在執行 MTU 修復指令的腳本中,一併執行任何 docker network ...New-VMSwitch 指令。

2. 設定 Windows 容器網路介面的 MTU

您必須於容器執行期間,在 Windows 容器內或從託管 Windows 容器的執行個體設定 MTU。如果您的容器包含 PowerShell,您可以互動方式或從容器中的指令碼執行以下指令,以正確設定 MTU:

PS C:\> Get-NetAdapter | Where-Object Name -like "vEthernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}

或者,您可以在 Windows 執行個體執行以下指令,為所有執行中的容器設定 MTU:

PS C:\> Get-NetIPInterface -IncludeAllCompartments |
  Where-Object InterfaceAlias -like "vEthernet*" |
  Set-NetIPInterface -IncludeAllCompartments -NlMtuBytes 1460

Hyper-V 容器無法啟動

Compute Engine 目前尚不支援 Hyper-V 容器

後續步驟