Compute Engine 上的容器

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

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

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

Compute Engine 上執行的容器技術

一般而言,Compute Engine 執行個體可執行絕大部分的容器技術或工具。您可在新型 Linux 作業系統上執行數種不同類型的容器,也可以在 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-1803-core-for-containers

如果您需要在映像檔上執行特定的容器工具和技術,但該映像檔預設不包含這些工具和技術,請以手動方式安裝

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

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

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

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

在 Windows Server 2016 映像檔上安裝 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 1803 版本。

安裝 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 microsoft/nanoserver:1803 cmd.exe

不過,Docker 的預設網路 MTU 有一項已知問題,會影響到連線至執行個體以及從容器連線至網際網路的能力。若要解決此問題,請在執行個體的 PowerShell 終端機中執行下列指令,以查看執行個體名稱並將 vEthernet MTU 設為 1460

PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295                1          0       5720  Loopback Pseudo-Interface 1
  1500                1      76091     292077  vEthernet (nat)
PS C:\> netsh interface ipv4 set subinterface `
"vEthernet (nat)" mtu=1460 store=persistent

即使修復了執行個體的 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 中,1709 版本的執行個體會使用下列指令,在 1709 版本的 nanoserver 容器中執行命令提示字元,而非在預設的 2016 容器中執行:

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

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

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

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

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

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

若要令此狀況恢復正常,請在執行個體或容器中的 PowerShell 終端機執行下列指令,以查看執行個體名稱和重設 MTU:

PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295                1          0       5720  Loopback Pseudo-Interface 1
  1500                1      76091     292077  vEthernet (HNSTransparent)
PS C:\> netsh interface ipv4 set subinterface `
"vEthernet (HNSTransparent)" mtu=1460 store=persistent

如果您因為無法再透過遠端桌面協定連線至執行個體而無法執行這些指令,您可以透過序列主控台連線至執行個體,再啟動 cmd 提示字元,然後在其中執行 netsh 指令來修復 MTU。如果您不想執行上述動作,可執行 docker network ...New-VMSwitch 指令,當做指令碼的一部分,這樣也可以執行 MTU 修復指令。

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 說明文件