Udostępnij za pośrednictwem


Tryby izolacji

Dotyczy: Windows Server 2025, Windows Server 2022, Windows Server 2019, Windows Server 2016

Kontenery Windows oferują dwa różne tryby izolacji środowiska uruchomieniowego: process i Hyper-V. Kontenery działające w obu trybach izolacji są tworzone, zarządzane i działają identycznie. Tworzą również te same obrazy kontenerów i je wykorzystują. Różnica między trybami izolacji polega na tym, jaki stopień izolacji jest tworzony między kontenerem, systemem operacyjnym hosta i wszystkimi innymi kontenerami uruchomionymi na tym hoście.

Izolacja procesu

Jest to "tradycyjny" tryb izolacji dla kontenerów, opisany w Kontenery systemu Windows — omówienie. W przypadku izolacji procesów wiele instancji kontenerów działa równocześnie na danym hoście, z izolacją zapewnianą przez przestrzeń nazw, kontrolę zasobów i inne technologie izolacji procesów. W przypadku uruchamiania w tym trybie kontenery współdzielą to samo jądro z hostem, a także ze sobą. Jest to mniej więcej takie samo, jak w przypadku uruchamiania kontenerów systemu Linux.

Diagram przedstawiający kontener pełen aplikacji odizolowanych od systemu operacyjnego i sprzętu.

Co jest izolowane

Kontenery systemu Windows wirtualizują dostęp do różnych przestrzeni nazw w systemie operacyjnym. Przestrzeń nazw zapewnia dostęp do informacji, obiektów lub zasobów za pomocą nazwy. Na przykład system plików jest prawdopodobnie najbardziej znaną przestrzenią nazw. W systemie Windows istnieje wiele przestrzeni nazw, które są izolowane dla poszczególnych kontenerów:

  • system plików
  • rejestr
  • porty sieciowe
  • przestrzeń identyfikatorów procesu i wątku
  • Przestrzeń nazw Menedżera obiektów

Przeszuwanie granicy izolacji

Istnieją przypadki, w których warto przebić granicę izolacji. Te operacje muszą być celowo żądane przez użytkownika i należy je starannie rozważyć, ponieważ może to naruszyć stan zabezpieczeń kontenera. Kontenery systemu Windows obsługują następujące elementy:

Kontenery systemu Windows nie obsługują obecnie:

  • pamięć udostępniona
  • udostępnianie obiektów synchronizacji (semafory, muteksy itp.)
  • udostępnione przestrzenie nazw procesów

izolacja Hyper-V

Ten tryb izolacji zapewnia zwiększone zabezpieczenia i szerszą zgodność między wersjami hosta i kontenera. W przypadku izolacji Hyper-V wiele wystąpień kontenerów jest uruchamianych współbieżnie na hoście; jednak każdy kontener działa wewnątrz wysoce zoptymalizowanej maszyny wirtualnej i skutecznie otrzymuje własne jądro. Obecność maszyny wirtualnej zapewnia izolację na poziomie sprzętu między każdym kontenerem a hostem kontenera.

Diagram kontenera, który jest izolowany w systemie operacyjnym na maszynie wizualnej działającej w systemie operacyjnym na maszynie fizycznej.

Przykłady izolacji

Tworzenie kontenera

Zarządzanie kontenerami izolowanymi przez Hyper-V za pomocą Docker jest niemal identyczne z zarządzaniem kontenerami izolowanymi procesami. Aby utworzyć kontener z izolacją Hyper-V za pomocą Docker, użyj parametru --isolation, aby ustawić --isolation=hyperv.

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

Aby utworzyć kontener z izolacją procesów za pomocą platformy Docker, użyj parametru --isolation, aby ustawić --isolation=process.

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

Kontenery systemu Windows uruchomione w systemie Windows Server są domyślnie uruchamiane z izolacją procesu. Kontenery systemu Windows działające w systemach Windows 10 Pro i Windows 10 Enterprise są domyślnie uruchamiane z izolacją Hyper-V. Począwszy od aktualizacji systemu Windows 10 z października 2018 r., użytkownicy z systemem Windows 10 Pro lub Enterprise mogą uruchamiać kontener systemu Windows z izolacją procesu. Użytkownicy muszą bezpośrednio żądać izolacji procesu przy użyciu flagi --isolation=process.

Ostrzeżenie

Uruchamianie z izolacją procesów w systemach Windows 10 Pro i Enterprise jest przeznaczone do programowania/testowania. Na hoście musi być uruchomiony system Windows 10 kompilacja 17763+ i musisz mieć wersję Dockera z silnikiem 18.09 lub nowszym.

W przypadku wdrożeń produkcyjnych należy nadal używać systemu Windows Server jako hosta. Korzystając z tej funkcji w systemach Windows 10 Pro i Enterprise, należy również upewnić się, że tagi wersji hosta i kontenera są zgodne. W przeciwnym razie uruchomienie kontenera może zakończyć się niepowodzeniem lub wykazywanie niezdefiniowanego zachowania.

Wyjaśnienie izolacji

W tym przykładzie przedstawiono różnice w możliwościach izolacji między izolacją procesową a izolacją Hyper-V.

W tym miejscu wdrażany jest kontener izolowany przez proces i będzie hostował długotrwały proces ping.

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

Za pomocą polecenia docker top proces ping jest zwracany tak, jak jest widoczny wewnątrz kontenera. Proces w tym przykładzie ma identyfikator 3964.

docker top 1f8bf89026c8f66921a55e773bac1c60174bb6bab52ef427c6c8dbc8698f9d7a

3964 ping

Na hoście kontenera polecenie get-process może służyć do pobrania jakichkolwiek uruchomionych procesów ping z tego hosta. W tym przykładzie istnieje jeden, a identyfikator procesu jest zgodny z tym identyfikatorem z kontenera. Jest to ten sam proces widoczny zarówno z kontenera, jak i hosta.

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

Dla porównania, w tym przykładzie uruchomiony zostanie izolowany kontener Hyper-V z procesem ping.

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

Podobnie można użyć docker top do zwrócenia uruchomionych procesów z kontenera.

docker top 5d5611e38b31a41879d37a94468a1e11dc1086dcd009e2640d36023aa1663e62

1732 ping

Jednak podczas wyszukiwania procesu na hoście kontenera nie znajduje się procesu ping i pojawia się błąd.

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

Na koniec na hoście widoczny jest proces vmwp, czyli uruchomiona maszyna wirtualna, która hermetyzuje uruchomiony kontener i chroni uruchomione procesy z systemu operacyjnego hosta.

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