Dela via


Isoleringslägen

Gäller för: Windows Server 2025, Windows Server 2022, Windows Server 2019, Windows Server 2016

Windows-containers erbjuder två distinkta lägen för körisolering: process- och Hyper-V-isolering. Containrar som körs under båda isoleringslägena skapas, hanteras och fungerar på samma sätt. De producerar och använder också samma containeravbildningar. Skillnaden mellan isoleringslägena är vilken grad av isolering som skapas mellan containern, värdoperativsystemet och alla andra containrar som körs på värddatorn.

Processisolering

Detta är det "traditionella" isoleringsläget för containrar och beskrivs i översikten över Windows-containrar. Med processisolering körs flera containerinstanser samtidigt på en viss värd med isolering som tillhandahålls via namnrymd, resurskontroll och andra processisoleringstekniker. När de körs i det här läget delar containrar samma kernel med värden och varandra. Detta är ungefär samma som hur Linux-containrar körs.

Ett diagram som visar en container full av program som isoleras från operativsystemet och maskinvaran.

Vad blir isolerat

Windows-containrar virtualiserar åtkomsten till olika operativsystemnamnområden. Ett namnområde ger åtkomst till information, objekt eller resurser via ett namn. Till exempel är filsystemet förmodligen det mest kända namnområdet. Det finns många namnområden i Windows som isoleras per container:

  • filsystem
  • register
  • nätverksportar
  • process- och tråd-ID-utrymme
  • Namnområde för Object Manager

Genomborra isoleringsgränsen

Det finns fall då det är användbart att genomborra isoleringsgränsen. Dessa åtgärder måste avsiktligt begäras av användaren och bör utföras noggrant eftersom det kan äventyra containerns säkerhetsstatus. Windows-containrar stöder följande:

Windows-containrar stöder för närvarande inte:

  • delat minne
  • dela synkroniseringsobjekt (semaphores, mutexes osv.)
  • namnområden för delad process

Hyper-V isolering

Det här isoleringsläget ger förbättrad säkerhet och bredare kompatibilitet mellan värd- och containerversioner. Med Hyper-V isolering körs flera containerinstanser samtidigt på en värd. Varje container körs dock inuti en mycket optimerad virtuell dator och får effektivt sin egen kernel. Närvaron av den virtuella maskinen säkerställer maskinvarunivåisolering mellan varje container och värdmaskinen.

Ett diagram över en container som isoleras i ett operativsystem på en virtuell maskin som körs på ett operativsystem i en fysisk dator.

Isoleringsexempel

Skapa container

Att hantera Hyper-V-isolerade containrar med Docker är nästan identiskt med hanteringen av processisolerade containrar. Om du vill skapa en container med Hyper-V isolering med Docker använder du parametern --isolation för att ange --isolation=hyperv.

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

Om du vill skapa en container med processisolering via Docker använder du parametern --isolation för att ange --isolation=process.

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

Windows-containrar som körs på Windows Server körs som standard med processisolering. Windows-containrar som körs på Windows 10 Pro och Enterprise körs som standard med Hyper-V isolering. Från och med uppdateringen av Windows 10 oktober 2018 kan användare som kör en Windows 10 Pro- eller Enterprise-värd köra en Windows-container med processisolering. Användarna måste begära processisolering direkt med hjälp av flaggan --isolation=process.

Varning

Att köra med processisolering i Windows 10 Pro och Enterprise är avsett för utveckling/testning. Din värd måste köra Windows 10 version 17763+ och du måste ha en Docker-version med version 18.09 av Engine eller senare.

Du bör fortsätta att använda Windows Server som värd för produktionsdistributioner. Genom att använda den här funktionen i Windows 10 Pro och Enterprise måste du också se till att taggarna för värd- och containerversion matchar, annars kan containern misslyckas med att starta eller uppvisa odefinierat beteende.

Förklaring av isolering

Det här exemplet visar skillnaderna i isoleringsmöjligheter mellan process och Hyper-V isolering.

Här distribueras en processisolerad container som är värd för en tidskrävande pingprocess.

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

Med hjälp av kommandot docker top returneras pingprocessen enligt vad som visas i containern. Processen i det här exemplet har ett ID på 3964.

docker top 1f8bf89026c8f66921a55e773bac1c60174bb6bab52ef427c6c8dbc8698f9d7a

3964 ping

På containervärden kan kommandot get-process användas för att visa alla pingprocesser som körs från containervärden. I det här exemplet finns det en, och process-ID:t matchar det från containern. Det är samma process som visas från både containern och värden.

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

Det här exemplet startar däremot även en Hyper-V isolerad container med en pingprocess.

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

På samma sätt kan docker top användas för att returnera processer som körs från containern.

docker top 5d5611e38b31a41879d37a94468a1e11dc1086dcd009e2640d36023aa1663e62

1732 ping

När du söker efter processen på containervärden hittas dock ingen pingprocess och ett fel utlöses.

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

Slutligen, på värden, är processen vmwp synlig, vilket är den körande virtuella maskinen som inkapslar den körande containern och skyddar de körande processerna från värdoperativsystemet.

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