Compute Engine 上的容器

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

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

當您需要透過容器環境和容器自動化調度管理工具來取得完全控制時,請在 Compute Engine 上執行容器。也可以使用 Google Kubernetes Engine 來簡化叢集管理與容器自動化調度管理工作,如此即無需管理基礎虛擬機器執行個體。

Compute Engine 上執行的容器技術

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

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

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

容器最佳化 VM 映像檔

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

  • Google 提供的容器最佳化 OS
    • 包含:Docker、Kubernetes
    • 映像檔專案:cos-cloud
    • 映像檔系列:cos-stable
  • CoreOS
    • 包含:Docker、rkt、Kubernetes
    • 映像檔專案:coreos-cloud
    • 映像檔系列:coreos-stable
  • Ubuntu
    • 包含:LXD
    • 映像檔專案:ubuntu-os-cloud
    • 映像檔系列:ubuntu-1604-lts
  • Windows
    • 包含:Docker
    • 映像檔專案:windows-cloud
    • 映像檔系列:windows-1809-core-for-containers

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

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

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

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

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

在 Windows Server 映像檔上安裝 Docker

Windows Server 2016 以上版本均包含容器支援。如果您打算在 Windows Server 執行個體上執行 Docker 容器,Google 建議您從 Windows Server for Containers 公開映像檔開始。此映像檔已安裝下列元件:

如果您要在 Windows Server 基本映像檔上安裝 Docker 並執行容器化應用程式,請依照以下步驟操作,而不要使用 Windows Server for Containers 映像檔。

首先,請使用 Windows Server 2016 以上版本的公開映像檔建立 Windows Server 執行個體。為取得最佳的容器支援,Google 建議您使用最新的 Windows Server 半年版本,例如 Windows Server 1809 版本。

安裝 Docker

  1. 連線至 Windows 執行個體

  2. 以系統管理員身分開啟 PowerShell 終端機。

  3. 從 Microsoft 存放區安裝 Docker:

    PS C:\> Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
    
    PS C:\> Install-Package -Name docker -ProviderName DockerMsftProvider
    
  4. 在 Compute Engine 上使用 Windows 容器執行下列指令,以解決已知問題

    • 停用「接收區段聯合」:

      PS C:\> netsh netkvm setparam 0 *RscIPv4 0
      
    • 啟用 IPv6:

      PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
      /v DisabledComponents /t REG_DWORD /d 0x0 /f
      
  5. 重新啟動執行個體:

    PS C:\> Restart-Computer -Force
    

其他設定步驟

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

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

請注意,Docker 的預設網路 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 容器:

Windows 容器的已知問題

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

若容器是以舊版 Windows 建構而成,會無法在執行較新版本 Windows 的 Compute Engine 執行個體中運作。根據預設,Docker 會提取 Windows Server 2016 版本的容器。這表示,如果您在執行 Windows Server 1709 以上版本的執行個體中執行下列指令,就會發生錯誤:

PS C:\> docker run -it microsoft/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 中,1809 版本的執行個體會使用下列指令,在 1809 版本的 nanoserver 容器中執行命令提示字元,而非在預設的 2016 容器中執行:

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

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

使用 docker network createNew-VMSwitch 指令在 Windows 執行個體上建立容器網路時,通常會將執行個體網路介面的 MTU 強制設為 1500。新 Docker 容器中的預設網路介面,通常也會使用 1500 的 MTU。Google Cloud Platform 僅支援 1460 的 MTU,因此如果將 MTU 強制設為 1500,就可能會發生下列問題:

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

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

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

解決這些限制的方法有兩個步驟:設定執行個體網路介面的 MTU,以及設定容器網路介面的 MTU

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。如果您不想執行上述動作,建議您執行任何 docker network ...New-VMSwitch 指令,當做指令碼的一部分,這樣也可以執行 MTU 修復指令。

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

Docker 容器無法啟動

使用 docker run 啟動容器可能會失敗,並顯示下列錯誤:

C:\Program Files\Docker\docker.exe: Error response from daemon: container ...
encountered an error during CreateContainer: failure in a Windows system call:
Element not found. (0x490)

問題會發生於安裝 Windows Update KB4015217 的 Windows Server 2016 執行個體。若要解決此問題,請使用下列 PowerShell 指令,在執行個體上啟用 IPv6:

PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
/v DisabledComponents /t REG_DWORD /d 0x0 /f

請在啟用 IPv6 後,重新啟動執行個體:

PS C:\> Restart-Computer -Force

如果日後的作業系統更新修正了這個問題,您就能恢復本來的 IPv6 設定:

PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
/v DisabledComponents /t REG_DWORD /d 0xff /f

Hyper-V 容器無法啟動

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

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Compute Engine 說明文件