隔離模式

Windows 容器提供兩種不同的執行階隔離模式:processHyper-V 隔離。 在這兩種隔離模式下執行的容器都是以相同方式來建立、管理和運作。 而且也會產生及使用相同的容器映像。 隔離模式的差異在於,容器、主機作業系統及該主機上所執行所有其他容器之間建立的隔離程度為何。

程序隔離

這是容器的「傳統」隔離模式,而且是 Windows 容器概觀中所述的內容。 若使用程序隔離,指定主機上可以同時執行多個容器執行個體,但要透過命名空間、資源控制以及程序隔離技術加以隔離。 在此模式中執行時,容器會和彼此及主機共用相同的核心。 這與 Linux 容器的執行方式大致相同。

此圖表顯示一個容器,其包含與作業系統和硬體隔離的完整應用程式。

Hyper-V 隔離

此隔離模式可在主機與容器版本之間提供增強的安全性和更廣泛的相容性。 使用 Hyper-v 隔離時,會在主機上同時執行多個容器實例;不過,每個容器都是在高度優化的虛擬機器中執行,並可有效地取得其本身的核心。 虛擬機器的存在可在每個容器之間 (以及與容器主機之間) 提供硬體層級隔離。

在視覺效果機器 (該機器在實體機器內的作業系統上執行) 上作業系統中隔離之容器的圖表。

隔離範例

建立容器

使用 Docker 管理 Hyper-V 隔離的容器,幾乎與管理程序隔離的容器一樣。 若要透過 Docker 建立具有 Hyper-V 隔離的容器,請使用 --isolation 參數來設定 --isolation=hyperv

docker run -it --isolation=hyperv mcr.microsoft.com/windows/servercore:ltsc2019 cmd

若要透過 Docker 建立具有程序隔離的容器,請使用 --isolation 參數來設定 --isolation=process

docker run -it --isolation=process mcr.microsoft.com/windows/servercore:ltsc2019 cmd

在 Windows Server 上執行的 Windows 容器會預設為以程序隔離執行。 在 Windows 10 專業版和企業版上執行的 Windows 容器會預設為以 Hyper-V 隔離執行。 從 Windows 10 2018 年 10 月更新開始,執行 Windows 10 專業版或企業版主機的使用者可以使用程序隔離來執行 Windows 容器。 使用者必須使用 --isolation=process 旗標直接要求程序隔離。

警告

以程序隔離在 Windows 10 專業版和企業版上執行適用於開發/測試環境。 您的主機必須執行 Windows 10 組建 17763+,而且您必須具有具有搭配引擎 18.09 或更新版本的 Docker 版本。

您應該繼續使用 Windows Server 作為生產部署的主機。 在 Windows 10 專業版和企業版上使用這項功能時,您也必須確定主機和容器的版本標籤相符,否則容器可能會無法啟動,或是會展現出未定義的行為。

隔離說明

此範例會示範程序及 Hyper-V 隔離之間的隔離功能差異。

這裡部署了程序隔離的容器,並且將主控長時間執行的偵測程序。

docker run -d mcr.microsoft.com/windows/servercore:ltsc2019 ping localhost -t

使用 docker top 命令時,會如同容器內所示傳回偵測處理序。 在此範例中處理序的識別碼為 3964。

docker top 1f8bf89026c8f66921a55e773bac1c60174bb6bab52ef427c6c8dbc8698f9d7a

3964 ping

在容器主機上,get-process 命令可以用來從主機傳回任何正在執行的偵測處理序。 此範例中就有一個,而且處理序識別碼符合容器中的偵測處理序。 它是容器和主機顯示的相同處理序。

get-process -Name ping

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
     67       5      820       3836 ...71     0.03   3964   3 PING

做為對比,此範例同時會啟動具有偵測程序的 Hyper-V 隔離容器。

docker run -d --isolation=hyperv mcr.microsoft.com/windows/servercore:ltsc2019 ping localhost -t

同樣地,docker top 可用來從容器傳回執行中處理序。

docker top 5d5611e38b31a41879d37a94468a1e11dc1086dcd009e2640d36023aa1663e62

1732 ping

不過,搜尋容器主機上的程序時,找不到偵測程序,而且擲回錯誤。

get-process -Name ping

get-process : Cannot find a process with the name "ping". Verify the process name and call the cmdlet again.
At line:1 char:1
+ get-process -Name ping
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (ping:String) [Get-Process], ProcessCommandException
    + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand

最後,在主機上會顯示 vmwp 處理序,這是執行中虛擬機器,它會封裝執行的容器並保護主機作業系統中執行的處理序。

get-process -Name vmwp

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
   1737      15    39452      19620 ...61     5.55   2376   0 vmwp