Windows Server Containers

Met Windows Server 2016 (vanaf Technical Preview 3) is het mogelijk om Windows Containers te maken. Windows Containers zijn ‘light weight‘ virtuele machines waarin een applicatie geïsoleerd kan draaien. Dus zonder het onderliggende OS aan te tasten!

Windows Server 2016 is in dit geval de ‘Container Host’ waarin één of meerdere containers kunnen draaien en Windows gaat hier erg efficient mee om door bestanden, directories en services van het host-OS te delen tussen de geïnstalleerde containers. (in feite in de ‘NameSpaces’ van de containers) Op het moment dat er wijzigingen plaatsvinden in een container, zal deze een kopie krijgen en deze gebruiken binnen zijn eigen namespace. Dit in tegenstelling tot traditionele VM’s die elk hun eigen OS hebben.

Containers kunnen beperkt worden in resources die van de host toebedeeld worden zoals CPU en Memory resources. De containers zullen nooit meer resources van de host kunnen gebruiken dan ingesteld zodat andere containers nooit beïnvloed worden.

Start powershell als Administrator en geef het volgende commando:

wget -uri https://aka.ms/setupcontainers -OutFile C:\ContainerSetup.ps1
C:\ContainerSetup.ps1

Dit zal ervoor zorgen dat er een Container Host wordt aangemaakt op de server en er een image wordt geladen.

container01

Nadat de installatie gereed is, vragen we de naam van de image op met:

Get-ContainerImage

Name              Publisher    Version      IsOSImage
----              ---------    -------      ---------
WindowsServerCore CN=Microsoft 10.0.10514.0 True

De naam hebben we nodig om de container te maken, samen met de naam van de virtuele netwerk-switch die ook met het script ContainerSetup.ps1 is aangemaakt. De naam van de switch vragen we op met:

Get-VMSwitch

Name           SwitchType NetAdapterInterfaceDescription
----           ---------- ------------------------------
Virtual Switch NAT

Nieuwe container maken

Nu kunnen we de container zelf gaan maken. Geef het volgende commando:

$container = New-Container -Name "MyContainer" -ContainerImageName WindowsServerCore -SwitchName "Virtual Switch"

Ervan uitgaande dat dit gelukt is, vragen we de status op met:

Get-Container

Name        State Uptime   ParentImageName
----        ----- ------   ---------------
MyContainer Off   00:00:00 WindowsServerCore

Om de container te starten:

Start-Container -Name "MyContainer"

Om nu commando’s te geven binnen de container, kan met powershell het commando Invoke-Command, of Enter-PSSession gebruikt worden. Als voorbeeld hieronder een remote powershell sessie met Enter-PSSession. Hiervoor is dan wel het id van de container nodig maar die kunnen we eenvoudig opvragen via de container-eigenschappen. De prompt zal wijzigen in een remote-powershell prompt met het begin van het ID:

Enter-PSSession -ContainerId $container.ContainerId -RunAsAdministrator

[b4145ba5-3bd]: PS C:\Windows\system32>

We gaan een tekstbestand aanmaken met hierin de ipconfig van de container:

container

Het IP adres 172.16.0.2 is van de netwerk-adapter in de container en die heeft een default gateway adres gekregen dat het IP adres is van de Container Host, onze Windows Server.

Om de container te stoppen:

Stop-Container -Name "MyContainer"

Snapshot (image) van container maken

Nu kunnen we een image maken van de container die we versie 1.0 noemen:

$newimage = New-ContainerImage -ContainerName MyContainer -Publisher DigitalInfo -Name newimage -Version 1.0

Controleren met Get-ContainerImage:

Get-ContainerImage

Name              Publisher    		Version      IsOSImage
----              ---------    		-------      ---------
newimage          CN=DigitalInfo      	1.0.0.0      False
WindowsServerCore CN=Microsoft 		10.0.10254.0 True

Deze image kunnen we later gebruiken om weer een container te maken…