隔離模式
適用於:Windows Server 2025、Windows Server 2022、Windows Server 2019、Windows Server 2016
Windows 容器提供兩種不同的運行時間隔離模式:process
和 Hyper-V
隔離。 在兩種隔離模式下執行的容器,其建立、管理及運作方式相同。 它們也會產生和使用相同的容器影像。 隔離模式之間的差異在於容器、主機操作系統和在該主機上執行的其他所有容器之間建立隔離的程度。
進程隔離
這是容器的「傳統」隔離模式,也是 Windows 容器概觀中所述的內容。 透過進程隔離,多個容器實例會在指定的主機上同時執行,並透過命名空間、資源控制和其他進程隔離技術來提供隔離。 在此模式中執行時,容器會與主機以及彼此共用相同的核心。 這與Linux容器的執行方式大致相同。
什麼被隔離
Windows 容器會將各種操作系統命名空間的存取虛擬化。 命名空間可讓您透過名稱存取資訊、對象或資源。 例如,檔案系統可能是已知的命名空間。 Windows 上有許多命名空間會根據每個容器隔離:
- 檔案系統
- 註冊表
- 網路埠
- 進程和線程標識碼空間
- 物件管理員命名空間
刺穿隔離界限
有時候,刺穿隔離界限是有用的。 用戶必須刻意要求這些作業,而且應該仔細考慮,因為它可能會危害容器的安全性狀態。 Windows 容器支援下列專案:
- 將共用檔案或磁碟區從主機對應到容器
- 將來自主機的具名管道對應至容器
- 將主機的埠對應至容器
- 自定義和共用網路命名空間
- 提供來自主機裝置的可視性給容器
Windows 容器目前不支援:
- 共用記憶體
- 共用同步處理物件 (信號、Mutex 等)
- 共用進程命名空間
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 隔離之間的隔離功能差異。
在這裡,正在部署一個過程隔離的容器,並將執行一個長期運行的 ping 程序。
docker run -d mcr.microsoft.com/windows/servercore:ltsc2019 ping localhost -t
使用 docker top
命令時,ping 程式會如同在容器內看到的一樣傳回。 此範例中的程式標識碼為 3964。
docker top 1f8bf89026c8f66921a55e773bac1c60174bb6bab52ef427c6c8dbc8698f9d7a
3964 ping
在容器主機上,get-process
命令可用來從主機傳回任何執行中的 Ping 進程。 在此範例中,有一個進程標識碼符合來自容器的進程標識碼。 這是容器和主機中可見的相同程式。
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
對比之下,此範例也會啟動具有 ping 程序的 Hyper-V 隔離容器。
docker run -d --isolation=hyperv mcr.microsoft.com/windows/servercore:ltsc2019 ping localhost -t
同樣地,docker top
可用來從容器傳回執行中的進程。
docker top 5d5611e38b31a41879d37a94468a1e11dc1086dcd009e2640d36023aa1663e62
1732 ping
不過,在容器主機上搜尋進程時,找不到 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