4.0. Windows containers

4.0.1. Inleiding

Containers zijn een middel om snel gevirtualiseerde, geïsoleerde besturingssysteem omgevingen te implementeren, voor applicatie-implementatie en uitvoering. Windows Server 2016 bevat ondersteuning voor containers, in samenwerking met een open source container-engine genaamd Docker.

4.1. Deploy Windows containers

Virtualisatie is al sinds de begindagen van Windows een belangrijk kenmerk. Virtueel geheugen bestaat al tientallen jaren; Windows kan schijfruimte gebruiken om het systeem te laten lijken alsof het meer geheugen heeft dan het werkelijk heeft. Hyper-V virtualiseert hardware, creërt computers op een computer die hun eigen processors, geheugen en schijven lijken te hebben, terwijl ze in feite de bronnen van de hostserver delen. Containers is een nieuwe functie in Windows Server 2016 dat besturingssystemen virtualiseert.

4.1.1. Bepaal de installatievereisten en de juiste scenario’s voor Windows containers

Net zoals virtuele machines voorzien wat afzonderlijke computers lijken, bieden containers dat ook, wat afzonderlijke exemplaren van het besturingssysteem lijken te zijn, elk met een eigen geheugen en bestandssysteem en met een schoon, nieuw exemplaar van het besturingssysteem. In tegenstelling tot virtuele machines, die echter afzonderlijke kopieën van het besturingssysteem draaien, delen containers het besturingssysteem van het hostsysteem. Het is niet nodig om een afzonderlijk exemplaar van het besturingssysteem te instellaren voor elke container, noch voert de container een opstartvolgorde uit, het laden bibliotheken of geheugen besteden aan de bestanden van het besturingssysteem. Containers starten binnen enkele seconden, en u kunt meer containers maken op een hostsysteem dan virtuele machines.

Gebruikers die met containers werken, zien ze in eerste als een schoen systeeminstallatie instantie, klaar voor toepassingen. De omgeving is volledig gescheiden van de host en andere containers, met behulp van naamruimte-isolatie en resource governance (bronbestuur).

Naamruimte-isolatie betekent dat elke container alleen toegang heeft tot de bronnen die beschikbaar voor hen beschikbaar zijn. Bestanden, poorten en actieve processen lijken allemaal specifiek voor de container te zijn, zelfs wanneer deze gedeeld worden met de host en andere containers. De werkomgeving lijkt op die van een virtuele machine, maar in tegenstelling tot een virtuele machine, die afzonderlijke kopieën van alle bestanden van het besturingssysteem onderhoudt, deelt een container deze bestanden met de host, en kopieert ze niet. Enkel wanneer een gebruiker of toepassing een bestand in een container wijzigt wordt een kopie is gemaakt in het bestandssysteem van de container.

Resource governance betekent dat een container alleen toegang heeft tot een gespecificeerde hoeveelheid van processorcycli, systeemgeheugen, netwerkbandbreedte en andere bronnen, en niet meer. Een toepassing die in een container wordt uitgevoerd, heeft een schone sandbox-omgeving, zonder toegang tot bronnen die aan andere containers of aan de host zijn toegewezen.

4.1.1.1. Container images

De mogelijkheid om in enkele seconden nieuwe containers te maken en de geïsoleerde aard van elke container, maakt ze tot een ideaal platform voor applicatieontwikkeling en het testen van software. Echter, er is meer dan dat alleen.

Containers zijn gebaseerd op images. Om een nieuwe container te maken moet men een image downloaden vanuit een repository en het uitvoeren. Als u een afbeelding van Windows Server 2016 Server Core uitvoert, verkrijgt u een container met een schone instantie van het besturingssysteem dat erin draait. Alternatief, kunt u Windows Server-images downloaden met rollen of toepassingen, zoals internet Information Services (IIS) of Microsoft SQL Server, reeds geïnstalleerd en klaar voor gebruik.

De image van het basisbesturingssysteem verandert nooit. Als u een toepassing installeert in de container en vervolgens een nieuwe afbeelding maakt, zal de resulterende image alleen de bestanden en instellingen bevatten die nodig zijn om de applicatie uit te voeren. Natuurlijk is de nieuwe afbeelding die u hebt gemaakt relatief klein, omdat het niet het hele besturingssysteem bevat. Om de applicatie met andere mensen te delen te delen, hoeft u alleen de nieuwe, kleinere image te sturen, als ze de afbeelding van het basisbesturingssysteem hebben.

Dit proces kan zoveel iteraties doorlopen als je nodig hebt, met laag na laag van images die op de originele basis voortbouwen. Dit kan resulteren in een uiterst efficiënte software ontwikkelomgeving. In plaats van enorme VHD-bestanden over te dragen of constant te creëren en het installeren van nieuwe virtuele machines, kunt u kleine containerafbeeldingen overbrengen die uitgevoerd worden zonder hardware compatibiliteitsproblemen.

4.1.2. Installeer en configureer Windows Server container host in fysieke of gevirtualiseerde omgevingen

Windows Server 2016 ondersteunt twee soorten containers: Windows Server Containers en Hyper-V-containers. Het verschil tussen de twee ligt in de mate van container-isolatie die ze bieden. Windows Server Containers werken in de gebruikersmodus en delen alles met de hostcomputer, inclusief de kernel van het besturingssysteem en het systeemgeheugen.

Daarom is het denkbaar dat een toepassing, hetzij per ongeluk of doelbewust, zou kunnen ontsnappen uit de grenzen van zijn container en andere processen beïnvloeden die op de host of in andere containers worden uitgevoerd. Deze optie wordt daarom verondersteld om de voorkeur te hebben wanneer de applicaties die in verschillende containers worden uitgevoerd in principe betrouwbaar zijn.

Hyper-V-containers biedt een extra isolatieniveau door de hypervisor te gebruiken die afzonderlijke kopie van de kernel van het besturingssysteem voor elke container maakt. Hoewel ze zijn niet zichtbaar of getoond aan handmatig beheer, maakt Hyper-V, met behulp van de basiscontainerafbeeldingen, virtuele machines met Windows-containers erin. De containerimplementatie is in wezen hetzelfde, het verschil zit in de omgevingen waarin de twee soorten containers bestaan.

Omdat ze binnen een VM bestaan, hebben Hyper-V-containers hun eigen geheugen aan hen toegewezen, evenals geïsoleerde opslag en netwerk-I/O. Dit biedt een containeromgeving die geschikt is voor wat Microsoft “vijandige multi-tenant”-applicaties noemt, zoals een situatie waarin een bedrijf containers aan klanten levert voor het uitvoeren van hun eigen code, die misschien niet betrouwbaar is. Dus met de toevoeging van Hyper-V-containers, biedt Windows Server 2016 drie isolatieniveaus, variërend van het afzonderlijke besturingssysteem installatie van virtuele Hyper-V-machines, de gescheiden kernel en geheugen van Hyper-V containers, of de gedeelde kernel en andere bronnen van Windows Server Containers.

4.1.2.1. Installeer een container host

Windows Server 2016 bevat een functie genaamd Containers, welke u moet installeren om containerondersteuning te bieden. Maar om containers te maken en te beheren, moet u  de applicatie Docker downloaden en installeren die deze functie ondersteunt.

Om de functie Containers te installeren, kunt u de wizard Rollen en Functies toevoegen in gebruiken Hyper-V Manager en Containers op de pagina Functies selecteren.

Opmerking Installatie van Windows Server

Om Windows Server-containers te maken, moet het hostbesturingssysteem geïnstalleerd zijn op de C-schijf van de computer, wat de standaardinstelling is. Dit is om het delen van de kernel van het besturingssysteem te vergemakkelijken. Dit is geen vereiste voor het maken van Hyper-V-containers, want de hypervisor is verantwoordelijk om elke container een kopie van de kernel te voorzien.

Als u Hyper-V-containers wilt maken, moet u zowel de functie Containers als de Hyper-V-rol installeren. Ook al creëer je geen virtuele machines voor de containers, de functie Hyper-V installeert de hypervisor die nodig is om de afzonderlijke kopie van de Windows-kernel voor elke Hyper-V-container te maken.

De rol van Hyper-V heeft algemene hardwarevereisten die hoger zijn dan die van Windows Besturingssysteem Server 2016 zelf. Voordat u de Hyper-V-rol op een server kunt installeren met Windows Server 2016 moet u over de volgende hardware beschikken:

  • Een 64-bit processor met hardware-ondersteunde virtualisatie en tweede niveau adresvertaling (SLAT). Dit type virtualisatie is beschikbaar in processors die een virtualisatieoptie bevatten, zoals de Intel Virtualization Technology (Intel VT) of AMD Virtualization (AMD-V) technologie.
  • Hardware afgedwongen preventie van gegevensuitvoering (DEP), die Intel beschrijft als eXecuted Disable (XD) en AMD beschrijft als No eXecute (NS). CPU’s gebruiken deze technologie om geheugengebieden te scheiden voor opslag van processorinstructies of voor opslag van gegevens. In het bijzonder moet u Intel XD bit inschakelen (bit uitschakelen uitvoeren) of AMD NX-bit (geen bit uitvoeren).
  • VM Monitor Mode-uitbreidingen, te vinden op Intel-processors als VT-c.
  • Een systeem-BIOS of UEFI die de virtualisatiehardware ondersteunt en waarop de virtualisatiefunctie is ingeschakeld.

Wanneer u de Hyper-V-rol installeert met Hyper-V Manager, vraagt de Wizard Rollen en Functies Toevoegen om ook Hyper-V Management-tools te installeren. Als u Hyper-V-containers maakt maar geen Hyper-V virtuele machines, heeft u de de management tools niet nodig.

4.1.2.2. Containers virtualizeren

Windows Server 2016 ondersteunt het gebruik van containers binnen virtuele Hyper-V-machines. U kunt de Container-functie en de Docker-bestanden op elke virtuele machine installeren. Om Hyper-V-containers op een virtuele machine te maken, moet het systeem echter voldoen aan de vereisten voor geneste virtualisatie.

Om een geneste Hyper-V-hostserver te maken, moeten de fysieke host en de virtuele machine aan waarmee u de Hyper-V-containers maakt, beide Windows Server 2016 gebruiken. De VM kan de volledige installatie-optie Desktop Experience, Server Core of Nano Server uitvoeren. Bovendien moet de fysieke host een Intel-processor met VT-x en Extended Page Tables (EPT) virtualisatie-ondersteuning hebben.

Voordat u Hyper-V op de virtuele machine installeert, moet u de virtuele processor toegang geven tot de virtualisatietechnologie op de fysieke computer. Om dit te doen, moet u de virtuele machine afsluiten en op de fysieke host volgende opdracht als volgt uitvoeren, in een PowerShell-sessie met beheerdersrechten:

Set-VMProcessor -VMName server1 -ExposeVirtualizationExtensions $true

Bovendien moet u de volgende configuratiewijzigingen aanbrengen op de VM die functioneert als een Hyper-V-host. Elke wordt eerst gegeven als de locatie in het dialoogvenster VM-instellingen in Hyper-V Manager en vervolgens als een PowerShell-opdracht:

  • Geef de VM op de geheugenpagina minimaal 4 gigabyte (GB) RAM en schakel dynamisch geheugen uit.
    Set-VMMemory -VMName server1 -StartupBytes 4gb -DynamicMemoryEnabled $false
  • Stel op de pagina Processor het aantal virtuele processors in op 2.
    Set-VMProcessor -VMName server1 -Count 2
  • Schakel op de pagina Netwerkadapter / Geavanceerde functies MAC-adresspoofing in.
    Set-VMNetworkAdapter -VMName server1 -Name "network adapter" -MacAddressSpoofing on

Nadat u deze wijzigingen hebt aangebracht, kunt u de VM starten, de Hyper-V-rol installeren en Docker gebruiken om Hyper-V-containers te maken.

4.1.3. Installeer en configureer Windows Server containerhost op Windows Server Core of Nano Server in een fysieke of gevirtualiseerde omgeving

Een computer die is geïnstalleerd met de Server Core-optie kan als containerhost fungeren. De vereisten zijn hetzelfde als voor een server geïnstalleerd met de volledige Desktop Experience, behalve dat u de opdrachtregel moet gebruiken om de vereiste functies te installeren of om het systeem op afstand te beheren.

Nadat u bent overgeschakeld naar een PowerShell-sessie, kunt u de functie Containers en de Hyper-V-rol met de volgende opdracht installeren:

Install-WindowsFeature -Name containers, hyper-v

4.1.3.1. Configureer Nano Server als een container host

Nano Server, opgenomen in Windows Server 2016, ondersteunt beide Windows Server containers en Hyper-V-containers. De Nano Server-implementatie omvat pakketten ondersteunt zowel de Containers-functie als de Hyper-V-rol, die u kunt toevoegen wanneer u maak een Nano Server-afbeelding met de cmdlet New-NanoServerImage in Windows PowerShell, zoals in het volgende voorbeeld:

New-NanoServerImage-Deploymenttype guest -Edition datacenter -MediaPath D:\ -TargetPath C:\nano\nano1.vhdx -ComputerName nano1 -DomainName contoso -containers

Met deze opdracht maakt u een Nano Server-image met de volgende kenmerken:

  • DeploymentType guest – Maakt een afbeelding voor gebruik op een virtuele Hyper-V-machine
  • Edition datacenter – Maakt een afbeelding met de Datacenter-editie van Windows Server
  • MediaPath D:\ – Geeft toegang tot de Nano Server-bronbestanden vanaf de D-schijf
  • TargetPath – D:\nano\nano1.vhdx – Maakt een VHDX-afbeeldingsbestand in de map C:\nano met de naam Nano1.vhdx
  • ComputerName nano1 – Wijst de Nano Server de computernaam Nano1 toe
  • DomainName contoso – Voegt de computer toe aan het Contoso-domein
  • Containers – Hiermee wordt de functie Containers geïnstalleerd als onderdeel van de image
  • Compute – Installeert de Hyper-V-rol als onderdeel van de image

Als u van plan bent Hyper-V-containers op de gast Nano Server te maken, moet u deze opgeven met toegang tot de virtualisatiemogelijkheden van de Hyper-V-server, met behulp van de volgende procedure.

  1. Maak een nieuwe virtuele machine met de Nano Server-image die u hebt gemaakt, maar deze start u nog niet.
  2. Geef de virtuele machine op de Hyper-V-hostserver toegang tot de virtualisatiemogelijkheden van de fysieke processor van de Hyper-V-server, met behulp van de volgende opdracht:
    Set-VMProcessor -VMName nano1 -ExposeVirtualizationExtensions $true
  3. Start de virtuele machine van Nano Server.

Zodra de virtuele machine van Nano Server actief is, moet u een remote PowerShell-sessie instellen vanaf een andere computer, zodat u deze kunt beheren. Voer hiervoor volgend commando uit op de computer die u gebruikt om Nano Server te beheren:

Enter-PSSession -ComputerName nano1 -Credential

Opmerking Remote Nano Server Management

In dit gedeelte wordt ervan uitgegaan dat de Nano Server zich op een netwerk bevindt met een DHCP-server die zijn TCP IP-instellingen toewijst en die met succes lid is geworden van een Active Directory Domain Services-domein. Als dat niet het geval is, moet u de TCP/IP-instellingen voor de Nano Server handmatig configureren vanaf de console en vervolgens de Nano Server toevoege aan de lijst met vertrouwde hosts op de computer die u gebruikt om het te beheren.

4.1.4. Installeer Docker op Windows Server en Nano Server

Docker is een open source tool die al jaren containermogelijkheden biedt aan de Linux gemeenschap. Nu het is geporteerd, kunt u diezelfde mogelijkheden implementeren in Windows. Docker bestaat uit twee bestanden:

  • Dockerd.exe – De Docker-engine, ook wel een service of daemon genoemd, die draait op de achtergrond op de Windows-computer
  • Docker.exe – De Docker-client, een opdrachtshell die u gebruikt om container te maken en te beheren

Naast deze twee bestanden, die u moet downloaden en installeren om containers te maken, bevat Docker ook de volgende bronnen:

  • Dockerfiles – Scriptbestanden met instructies voor het maken van containerafbeeldingen
  • Docker Hub – Een cloudgebaseerd register waarmee Docker-gebruikers kunnen linken naar images en code repositories, evenals het bouwen en opslaan van hun eigen images
  • Docker Cloud – Een cloudgebaseerde service die u kunt gebruiken om uw containertoepassingen te implementeren

4.1.4.1. Installeer Docker op Windows Server

Omdat Docker een open source-product is, is het niet inbegrepen bij Windows Server 2016. Op een Windows Server 2016 Desktop Experience of Server Core-computer moet u Docker downloaden en installeren voordat u containers kunt maken. Om Docker te downloaden, gebruikt u OneGet, een cloudgebaseerde pakketbeheerder voor Windows.

Om toegang te krijgen tot OneGet, moet u de DockerMsftProvider-module installeren met behulp van het volgende commando. Als u wordt gevraagd om een NuGet-provider te installeren antwoord u met ja.

Install-Module -Name dockermsftprovider -Repository psgallery -Force

De cmdlet Install-Module downloadt de gevraagde module en installeert deze op in de map C:\Program Files\Windows PowerShell\Modules, waar het toegankelijk is vanaf elke PowerShell-prompt. Voer vervolgens de volgende Install-Package commando uit om Docker te downloaden en te installeren. Als de opdracht u vraagt om te bevestigen dat u een niet vertrouwd pakket wilt installeren, antwoord u Ja.

Install-Package -Name docker -ProviderName dockermsftprovider

Met deze opdracht wordt Dockerd.exe na het downloaden van de Docker-bestanden als een Windows service geregistreerd en voegt het de Docker.exe-client toe aan het pad, zodat deze uitvoerbaar is vanaf elke locatie in het bestandssysteem.

Nadat de installatie is voltooid, start u de computer opnieuw op met de volgende opdracht:

Restart-Computer-Force

4.1.4.2. Installeer Docker op Nano Server

Nadat u een externe PowerShell-sessie met een Nano Server-computer hebt opgezet, kunt u Docker installeren met dezelfde opdrachten als voor een Desktop Experience of Server Core systeem. Microsoft beveelt echter aan dat, zodra de Dockerd-service op de Nano Server is geïnstalleerd, u de Docker-client vanaf het externe systeem uitvoert.

Hiervoor moet u de volgende taken uitvoeren:

  1.  Maak een firewallregel. Om Docker-clientverkeer op het Nano Server toe te staan, moet u een nieuwe firewallregel maken die poort 2375 opent voor TCP-verkeer. Om dit te doen voert u de volgende opdracht uit in de Nano Server-sessie:
    netsh advfirewall firewall add rule name="docker daemon" dir=in action=allow protocol=tcp localport=2375
  2. Configureer de Dockerd-engine om netwerkverkeer te accepteren. Docker vindt zijn oorsprong in Linux, en net als de meeste Linux-applicaties, gebruikt het tekstbestanden voor configuratie. In staat te stellen de Dockerd-engine om clientverkeer via het netwerk te accepteren, moet u een tekstbestand maken met de naam daemon.json in de map C:\ProgramData\Docker op de Nano Server dat de volgende regel bevat: { “hosts”: [“tcp://0.0.0.0:2375”, “npipe://”] } De volgende twee PowerShell-opdrachten maken het nieuwe bestand en voegt de vereiste tekst in:
    New-Item -Type file C:\programdata\docker\config\daemon.json
    Add-Content 'C:\programdata\docker\config\daemon.json' '{ "hosts": ["tcp://0.0.0.0:2375", "npipe://"] }'
  3. Herstart de Dockerd-engine. Nadat u het daemon.json bestand hebt gemaakt, moet u de Dockerd-engine opnieuw opstarten met de volgende opdracht:
    Restart-Service docker
  4. Download de Docker-client. Om de Dockerd-engine op afstand te beheren, moet u de Docker.exe-client op het externe systeem downloaden en installeren (niet binnen de Nano Server sessie). Om dit te doen, kunt u een browser openen en de volgende URL intypen om het Docker-pakket te downloaden: https://download.docker.com/components/engine/windowsserver/cs-1.12/docker.zip
  5. Gebruik hiervoor de volgende opdracht om dit in PowerShell te doen:
    Invoke-webrequest “https://download.docker.com/components/engine/windowsserver/cs-1.12/docker.zip” -outfile “$env:temp\docker.zip” -Usebasicparsing
  6. Installeer Docker.exe. Als u de Docker zipbestand via een browser hebt gedownload, installeert u de applicatie door het Docker.exe-bestand uit het zip-archief te extraheren en als u het naar een map kopieert, moet u de map C:\ProgramData\Docker maken. Om dit te doen voert met PowerShell de volgende opdracht uit:
    Expand-Archive -Path "$env:temp\docker.zip" -DestinationPath $env:programfiles
  7. Stel de PATH omgevingsvariabele in. Om de Docker-client vanaf elke locatie op het beheersysteem te kunnen uitvoeren, moet u de map C:\ProgramData\Docker toevoegen aan de PATH systeem omgevingsvariabele. Om dit grafisch te doen, opent u het Systeem Eigenschappenblad vanuit het Configuratiescherm en op het tabblad Geavanceerd klikt u op Omgevingsvariabelen om het dialoogvenster weer te geven.
  8. Voer de volgende opdracht uit om dit in PowerShell te doen:
    [environment]::setenvironmentvariable("path", $env:path + ";c:\program files\docker", [environmentvariabletarget]::machine)

Nadat u deze stappen hebt voltooid, kunt u de Docker.exe-client buiten de Nano Server-sessie uitvoeren, maar moet u de volgende parameter opnemen in elke opdracht, waarbij de ipaddress variabele vervangen wordt door het adres van de gewenste Nano-server die u wilt beheren:

-h tcp://ipaddress:2375

Als u bijvoorbeeld een nieuwe container met de microsoft/nanoserver image wilt maken, zou een u opdracht zoals het volgende kunnen gebruiken:

docker -h tcp://172.21.96.1:2375 run -it microsoft/nanoserver cmd

Om te voorkomen dat u de parameter -h aan elke opdracht moet toevoegen, kunt u een nieuwe omgevingsvariabele als volgt maken:

docker_host = "tcp://ipaddress:2375"

Om dit in PowerShell te doen, gebruikt u een opdracht zoals de volgende:

$env:docker_host = "tcp: //172.21.96.1: 2375"

4.1.5. Docker Daemon opstartopties configureren

Zoals vermeld in de vorige sectie, is het configuratiebestand voor de Dockerd-engine een tekstbestand met de naam daemon.json, dat u in dezelfde map plaatst als het Dockerd.exe bestand. In aanvulling op datgene wat u eerder gebruikte om clientverkeer via het netwerk toe te staan, zijn er veel andere configuratie-instellingen die u in het bestand kunt opnemen. Alle instellingen die u kunt opnemen in een enkel daemon.json-bestand moeten worden ingesloten in een enkele set accolades, zoals in het volgende voorbeeld:

{"
graph": "d:\\docker"
"bridge" : "none"
"group" : "docker"
{"dns": 192.168.9.2, 192.168.9.6 }
}

Examen Tip

Houd er rekening mee dat de Windows-versie van Docker veel van de Linux Dockerd configuratie-instellingen ondersteunt, ze niet allemaal ondersteunen. Als u de Docker-documentatie aan het bestuderen bent, moet u er op letten dat u naar de Windows-versie van de documenten zoekt.

4.1.5.1. Images en containers omleiden

Om de Dockerd-engine te configureren om imagebestanden en containers op een alternatieve locatie op te slaan, neemt u volgende opdracht op in het bestand daemon.json, waar d:\\docker vervangen is door de locatie die u wilt gebruiken:

{"graph": "d:\\docker"}

4.1.5.2. NAT onderdrukken

Standaard maakt de Dockerd-engine een NAT-omgeving (Network Address Translation) aan voor containers, waardoor ze met elkaar en met het externe netwerk kunnen communiceren. Om dit standaardgedrag te wijzigen en te voorkomen dat de engine NAT gebruikt, neemt u volgende opdracht op in het bestand daemon.json:

{"bridge": "none"}

4.1.5.3. Een administratieve groep aanmaken

Standaard kunnen alleen leden van de lokale groep Administrators de Docker-client gebruiken om de Dockerd-engine te besturen wanneer u op het lokale systeem werkt. In sommige gevallen kunt u gebruikers deze mogelijkheid verlenen zonder hen het lidmaatschap van Administrators te geven. U kunt Dockerd configureren om een andere groep te herkennen – in dit geval wordt de groep “docker” genoemd – door middel van de volgende instelling in het bestand daemon.json.

{"group": "docker"}

4.1.5.4. DNS server adressen instellen

Om alternatieve DNS-serveradressen op te geven voor de besturingssystemen in containers, kunt u de volgende instelling toevoegen aan het bestand daemon.json, waar adres1 en adres2 de IP-adressen van DNS-servers zijn:

{"dns": "address1", "address2"}

4.1.6. Configureer Windows PowerShell voor gebruikt met containers

De Dockerd-engine wordt voorzien met een Docker.exe-clientshell, maar is hier niet afhankelijk van. U kunt ook Windows PowerShell-cmdlets gebruiken om dezelfde functies uit te voeren. De Docker PowerShell-module, net als Docker zelf, is in een constante staat van coöperatieve ontwikkeling, en is daarom niet inbegrepen bij Windows Server 2016.

U kunt de huidige versie van de PowerShell-module downloaden en installeren vanaf een repository genaamd DockerPS-Dev, met behulp van de volgende opdrachten:

Register-PSRepository -Name dockerps-dev -SourceLocation https://ci.appveyor.com/nuget/docker-powershell-dev
Install-Module docker -Repository dockerps-dev -Scope Currentuser

Nadat de download is voltooid, kunt u een lijst met Docker-cmdlets bekijken door de volgende opdracht uit te voeren:

Get-Command -Module docker

Nadat u de repository hebt geregistreerd en de Docker-module hebt geïmporteerd, hoeft deze opdrachten niet meer opnieuw uitvoeren. U kunt altijd de nieuwste versie van de module verkrijgen door de volgende opdracht uit te voeren:

Update-Module docker

4.1.7. Een basis besturingssysteem installeren

Met de Dockerd-engine en de Docker-client geïnstalleerd en operationeel, kunt u de eerste stap zetten in het maken van containers, namelijk het downloaden van een image van het basisbesturingssysteem vanuit de Docker Hub-repository. Microsoft heeft de repository van Windows voorzien Server 2016 Server Core- en Nano Server-images, die u kunt downloaden en gebruiken om containers te maken en vervolgens uw eigen containerafbeeldingen te maken.

Om de Docker-client te gebruiken, voert u het Docker.exe-bestand uit met een opdracht en soms extra opties en parameters. Om een image te downloaden, voert u Docker uit met het Pull-commando en de naam van de image. Bijvoorbeeld de volgende opdracht downloadt de Server Core-afbeelding uit de repository.

docker pull microsoft/windowsservercore

Het PowerShell-equivalent is als volgt:

Request-ContainerImage -Repository microsoft/windowsservercore

De uitvoer van de opdracht (dat enige tijd duren, afhankelijk van de snelheid van uw Internetverbinding) wordt weergegeven.

Standaard download de Docker Pull-opdracht de nieuwste versie van de opgegeven image, die wordt geïdentificeerd door de tag: “latest”. Wanneer er meerdere versies van de dezelfde image beschikbaar zijn, zoals in een applicatieontwikkelingsproject, kunt u bijvoorbeeld een van de vorige afbeeldingen specifiëren om te downloaden, door de tag op te geven. Als je de Docker Pull-opdracht met de parameter -a, u krijgt alle versies van de image. Als de image die je binnenhaalt uit meerdere lagen bestaat, zal de opdracht automatisch alle de lagen downloaden die nodig zijn om de image in een container te plaatsen.

Als u weet dat de repository een Nano Server-image heeft, maar u er niet zeker van de naam bent, kunt u de opdracht Docker Search gebruiken om deze te vinden en vervolgens Docker Pull to gebruiken om het te downloaden.

4.1.8. Tag een image

Tagging in een containerrepository is een mechanisme voor versiebeheer. Wanneer je meerdere versies van dezelfde afbeelding creëert, zoals de opeenvolgende builds van een applicatie, kunt met Docker tags toewijzen die de versies identificeren. Tags zijn meestal cijfers die de relatieve leeftijd van de image iteraties aangeven, zoals 1.1, 1.2, 2.0, enzovoort.

Er zijn twee manieren om een tag aan een image toe te wijzen. Een daarvan is om Docker met de tag opdracht uit te voeren en de andere is om Docker Build met de parameter -t uit te voeren. In beide gevallen is de indeling van de image-ID is hetzelfde.

Als u een image op uw lokale containerhost wilt taggen, gebruikt u de volgende syntaxis: 

docker tag imagename: tag

Als u de afbeelding naar de Docker Hub gaat uploaden, moet u de afbeelding voorafgaan naam met uw Docker Hub-gebruikersnaam en een schuine streep, als volgt:

docker tag username/imagename:tag

Een gebruiker met de naam Holly Holt kan bijvoorbeeld de nieuwste build van haar nieuwe applicatie taggen als volgt:

docker tag hholt/killerapp:1.5

Om hetzelfde in Windows PowerShell te doen, gebruikt u de Add-ContainerImageTag-cmdlet, als volgt:

Add-Containerimagetag -Imageidorname c452b8c6ee1a -Repository hholt / killerapp -Tag 1.5

Als u de tagwaarde uit de opdracht weglaat, wijst Docker automatisch de image tagwaarde ‘new’ toe, wat tot enige verwarring kan leiden. Wanneer u een afbeelding uit een repository binnenhaalt zonder een tag op te geven, geeft de repository u de image met de “latest” tag. Dit betekent echter niet noodzakelijk dat de image die u krijgt de nieuwste zal zijn.

De “latest” tag wordt verondersteld aan te geven dat de image de meest recente is versie. Of dat waar is of niet, hangt af van de mensen die de tags van die repository beheren. Sommige mensen denken dat de “latest” tag automatisch wordt toegewezen aan de meest recente versie van een image, maar dit is niet het geval. U kunt de “latest” tag toewijzen aan elke versie van een image, de oudste of de nieuwste. Het is uitsluitend aan de managers van de repository om de tag-waarden correct te onderhouden. Wanneer iemand u vertelt om de laatste build van een afbeelding te kirjgen, bedoeld de persoon die u verwijst naar de meest recente build of de build met de “latest” tag? Ze zijn niet altijd hetzelfde.

4.1.9. Een besturingssysteem image deïnstalleren

Als Docker wordt uitgevoerd met de opdracht Images, worden alle images op de containerhost weergegeven.

In sommige gevallen kunt u de lijst met iamges bekijken en images vinden die u niet meer nodig hebt. In dit voorbeeld zijn er twee niet-Engelse versies van Nano Server die per ongeluk zijn gedownload.

Om images te verwijderen die u niet nodig hebt  en de opslagruimte vrij te maken die ze gebruiken, voert u Docker uit met de opdracht Rmi en geeft u de repository en de tag van de specifieke image mee om te verwijderen, of de image-ID-waarde, zoals in de volgende voorbeelden:

docker rmi -f microsoft/nanoserver:10.0.14393.206_de-de
docker rmi -f a896e5590871

Het PowerShell-equivalent is de cmdlet Remove-ContainerImage, zoals hieronder:

remove-containerimage microsoft/nanoserver:10.0.14393.206_de-de
remove-containerimage a896e5590871

Het is mogelijk dat dezelfde image met meerdere tags wordt vermeld. Je kunt dit zien aan de overeenkomende image-ID waarden. Als u een van de image met de tag probeert te verwijderen, verschijnt er een fout, omdat de image met andere tags gebruikt wordt. Het toevoegen van de parameter -f forceert de opdracht om alle getagde verwijzingen naar dezelfde afbeelding te verwijderen.

4.1.10. Windows Server containers maken

Met de functie Containers en Docker geïnstalleerd, bent u klaar om een Windows Server-container te maken. Gebruik hiervoor de opdracht Docker Run en geef de image op die u in de container wilt uitvoeren. Met de volgende opdracht maakt u bijvoorbeeld een nieuwe container met de Server Core-image gedownload van Docker Hub:

docker run -it microsoft/windowsservercore powershell

Naast het laden van de image in de container, doen de parameters in deze opdracht ook het volgende:

  • i – Creëert een interactieve sessie met de container
  • t – Opent een terminalvenster in de container
  • powershell – Voert de PowerShell-opdracht uit in de containersessie

Het resultaat is dat nadat de container is geladen, een PowerShell-sessie verschijnt, waarmee u in staat wordt gesteld om in de container te werken. Als u de Get-ComputerInfo-cmdlet in deze sessie uitvoert, ziet u bovenaan de uitvoer, dat Server Core wordt uitgevoerd in de container, wanneer de volledige Desktop Experience-editie op de containerhost wordt uitgevoerd.

U kunt Docker Run-switches combineren, zodat de -I en -t verschijnen als -it. Na de naam van In de image kunt u elke opdracht opgeven die in de container moet worden uitgevoerd. Bijvoorbeeld cmd specificeren zou de standaard Windows-opdrachtshell openen in plaats van PowerShell.

Opmerking Images verkrijgen

Een image uit de Docker Hub binnenhalen is geen vereiste stap voordat u kunt uitvoeren. Als u een Docker Run-opdracht uitvoert en u hebt niet de vereiste image op uw containerhost, Start Docker automatisch een pull en maakt het de container. Voor grote images kan is het echter beter om ze vooraf binnen te halen, dit bespaart tijd bij het maken van nieuwe containers.

De opdracht Docker Run ondersteunt veel opdrachtregelparameters en switches, die u kunt gebruiken om de omgeving van de container die u maakt af te stemmen. Om ze te tonen, kunt u de volgende opdracht uitvoeren:

docker run - help

Opmerking Dockeropdrachten uitvoeren

Merk op dat deze en andere Docker-opdrachten soms dubbele koppeltekens gebruiken om de opdrachtregelparameters te verwerken.

Volgende afbeelding geeft ruwweg de helft van de beschikbare parameters weer. Bijvoorbeeld met de -h parameter kunt u een andere hostnaam voor de container opgeven dan de hexadecimale tekenreeks die de opdracht standaard toewijst.

Het PowerShell-equivalent van de opdracht Docker Run gebruikt de cmdlet New-Container, zoals in het volgende voorbeeld:

New-Container -Imageidorname microsoft/windowsservercore -Input -Terminal -Commando powershell

4.1.11. Hyper-V containers maken

Het proces voor het maken van een Hyper-V-container is bijna identiek aan het proces voor het maken van een Windows Server-container. U gebruikt dezelfde Docker Run-opdracht, behalve dat u de parameter –isolation = hyperv toevoegt, zoals getoond in het volgende voorbeeld:

docker run -it --isolation = hyperv microsoft / windowsservercore powershell

Nadat u een Hyper-V-container hebt gemaakt, is deze vrijwel niet van een Windows Server container te onderscheiden. Een van de weinige manieren om de typen containers uit elkaar te houden, is door te onderzoeken hoe ze met processen omgaan. U kunt bijvoorbeeld twee containers maken en in elk een commando uitvoeren waarmee ze zichzelf continu pingen, zoals getoond in de volgende opdrachten:

docker run -it microsoft/windowsservercore ping -t localhost
docker run -it --isolation=hyperv microsoft/windowsservercore ping -t localhost

De Windows Server-container die met de eerste opdracht is gemaakt, heeft een PING-proces actief in de container, zoals weergegeven door de opdracht Docker Top. Het proces ID (PID)-nummer, in dit geval, 404. Wanneer u vervolgens de cmdlet Get-Process uitvoert, om de processen (beginnend met P) weer te geven die op de containerhost worden uitgevoerd, ziet u hetzelfde PING-proces met de 404 ID. Dit komt omdat de container de kernel van de container host deelt.

Wanneer u de opdracht Docker Top uitvoert op de Hyper-V-container, ziet opnieuw het PING-proces, dit keer met een PID van 1852. De cmdlet Get-Process toont echter geen PING-proces, omdat deze container zijn eigen kernel heeft die voorzien wordt door de hypervisor.

4.2. Beheer Windows containers

4.2.1. Beheer Windows- of Linux-containers met behulp van de Docker-daemon

Wanneer u de opdracht Docker uitvoeren gebruikt om een nieuwe container te maken, kunt u de -it parameter opnemen om er interactief mee te werken, of u kunt het weglaten om de container in de achtergrond te laten werken. Hoe dan ook, u kunt de Docker-client blijven gebruiken om de container te beheren, zowel in Windows of Linux.

4.2.1.1. Containers oplijsten

Als u een PowerShell- of CMD-sessie wilt verlaten die u in een container bent gestart, typt u de volgend:

exit

Dit sluit niet alleen de sessie, het stopt ook de container. Een gestopte container bestaat nog steeds op de host, het is gewoon functioneel uitgeschakeld. Om een sessie te verlaten zonder afsluiten de container te stoppen, drukt u op Ctrl+P en vervolgens op Ctrl+Q.

U kunt een lijst van alle actieve containers op de host weergeven met behulp van de Docker PS commando. Als u de switch -a (voor iedereen) toevoegt, zoals in het volgende voorbeeld, toont de opdracht alle containers op de host, of deze nu draaien of niet.

docker ps -a

4.2.1.2. Containers starten en stoppen

Om een uitgeschakelde container te starten, gebruikt u de Docker Start-opdracht, zoals het voorbeeld hieronder:

docker start dbf9674d13b9

U kunt een container ook met geforceerd stoppen door de opdracht Docker Stop te gebruiken, als volgt:

docker stop dbf9674d13b9

De zes-byte hexadecimale tekenreeks in deze opdrachten is de container-ID Docker toewijst aan de container wanneer deze wordt gemaakt. U deze waarde in Docker-opdrachten gebruiken om de container te indentificeren die u wilt beheren. Deze waarde wordt ook de computernaam van de container, zoals u kunt zien als u Get-ComputerInfo uitvoert vanuit een container sessie.

Als u Docker PS uitvoert met de parameter –no-trunc (voor geen truncatie), ziet u dat de container-ID een hexadecimale tekenreeks van 32 bytes is, hoewel het veel handiger is om alleen de eerste zes bytes op de opdrachtregel te gebruiken.

4.2.1.3. Verbinden met containers

Gebruik de opdracht Docker Attach om verbinding te maken met een sessie op een actieve container, zoals in het volgende voorbeeld:

docker attach dbf9674d13b9

Als u de opdracht in meerdere vensters uitvoert, worden extra sessies geopend, zodat u dit werk in meerdere vensters tegelijk kunt doen.

4.2.1.4. Images maken

Als u een container op enigerlei wijze heeft gewijzigd, kunt u de wijzigingen in een nieuwe image opslaan door de opdracht Docker Commit uit te voeren, zoals in het volgende voorbeeld:

docker commit dbf9674d13b9 hholt/killerapp: 1.5

Met deze opdracht maakt u een nieuwe afbeelding met de naam hholt/killerapp met een tagwaarde van 1.5. De De opdracht Docker Commit maakt geen duplicaat van de basisimage met de wijzigingen jij hebt gemaakt; het slaat alleen de wijzigingen op. Als u bijvoorbeeld de Microsoft/windowsservercore basisimage gebruikt om de container te maken en vervolgens uw applicatie installeert, zal Docker Commit alleen de applicatie opslaan. Als u de nieuwe image aaneen collega geeft, moet deze de basisimage hebben (of verkrijgen) om de container te kunnen uitvoeren.

4.2.1.5 Containers verwijderen

Om een container volledig te verwijderen, gebruikt u de Docker RM opdracht zoals in het volgende voorbeeld:

docker rm dbf9674d13b9

Containers moeten gestopt zijn voordat u ze op deze manier kunt verwijderen. Echter, als u de switch -f (for force) toevoegt, verwijdert het Docker RM-commando iedere container, zelfs een die gestart is.

4.2.2. Beheer Windows- of Linux-containers met Windows PowerShell

Zoals eerder vermeld, vereist de Dockerd-engine geen gebruik van het Docker.exe-client programma. Omdat Docker een open source project is, is het mogelijk om een alternatieve client-implementatie te creëren die u kunt gebruiken met Dockerd, en Microsoft, de samenwerking met de Docker-gemeenschap doet precies dat door een PowerShell-module te maken die u kunt gebruiken om Docker-containers maken en te beheren.

Omdat de Docker-module voor PowerShell in ontwikkeling is, ondersteunen het noodzakelijkerwijs niet alle functies die mogelijk zijn met de Docker.exe-client. Echter, de primaire functies zijn er, zoals getoond in de volgende paragrafen.

4.2.2.1. Containers oplijsten

U kunt een lijst van alle containers op de host weergeven door de cmdlet Get-Container uit te voeren in Windows PowerShell. In tegenstelling tot de Docker PS-opdracht geeft de Get-Container-cmdlet alle containers op de host weer, of ze nu actief zijn of gestopt.

4.2.2.2. Containers starten en stoppen

Wanneer u een container maakt met de cmdlet New-Container, wordt de container niet automatisch gestart. U moet het expliciet starten. Om een uitgeschakelde container te starten, gebruikt u de Start-Container-cmdlet, zoals in het volgende voorbeeld:

Start-Container dbf9674d13b9

U kunt een container ook stoppen door het werkwoord eenvoudig te wijzigen in de cmdlet Stop-Container, als volgt:

Stop-Container dbf9674d13b9

4.2.2.3 Verbinden met containers

Gebruik de cmdlet Enter-ContainerSession om verbinding te maken met een sessie op een actieve container, zoals in het volgende voorbeeld:

Enter-ContainerSessiondbf9674d13b9

Deze cmdlet kan ook gebruikt worden met de alias Attach-Container, waarmee een ander commando opnieuw gebruikt kan worden met een werkwoordverandering.

4.2.2.4. Images maken

Als u een container heeft gewijzigd, kunt u de wijzigingen in een nieuwe image opslaan door de ConvertTo-ContainerImage-cmdlet uit te voeren, zoals in het volgende voorbeeld:

ConvertTo-Containerimage -Containeridorname dbf9674d13b9 -Repository hholt/killerapp -Tag 1.5

Aan deze cmdlet wordt ook alias Commit-Container toegewezen.

4.2.2.5. Containers verwijderen

Gebruik de cmdlet Remove-Container om een container te verwijderen, zoals in het voorbeeld:

Remove-Container dbf9674d13b9

Net als bij het Docker RM-commando, moeten containers in een stopstand staan voordat u kunt ze kunt verwijderen. Als u de Force-switch toevoegt, zal de opdracht elke container verwijderen, zelfs een container in uitvoering.

4.2.3. Beheer containernetwerken

Containers hebben toegang tot het externe netwerk. Dit is eenvoudig te bewijzen door een server op het lokale netwerk of het internet te pingen. Echter, als u de opdracht ipconfig /all uitvoert in een containersessie, zou je verbaasd kunnen zijn over wat je ziet.

In dit voorbeeld is het IP-adres van de netwerkadapter in de container 172.25.117.12/12, dat helemaal niet lijkt op het adres van het netwerk waarop de containerhost is staat. Als u echter de opdracht Ipconfig /all op de containerhost uitvoert, wordt de situatie duidelijker.

Er worden twee Ethernet-adapters op het containerhostsysteem weergegeven. Men heeft een IP-adres op het 192.168.2.0/24 netwerk, dit is het adres dat wordt gebruikt voor het fysieke netwerk waarmee de containerhost is verbonden. De andere adapter heeft het adres 172.25.112.1/12, die zich op hetzelfde netwerk bevindt als het adres van de container. In feite terugkijkend naar de configuratie van de container, wordt het adres van de containerhost vermeld als standaard Gateway en DNS-serveradres voor de container. De containerhost is in wezen functionerend als een router tussen het 172.16.0.0/12 netwerk waarop de container zich bevindt en 192.168.2.0/24, het fysieke netwerk waarmee de host is verbonden. De host functioneert ook als de DNS-server voor de container.

Als u naar een andere container op dezelfde host kijkt, heeft deze een IP-adres op dezelfde host netwerk als de eerste container. De twee containers kunnen ook elkaars adressen pingen als die van systemen buiten het 172.16.0.0/12 netwerk.

Dit is mogelijk omdat de Containers functie en Docker standaard een netwerkadres vertaling (NAT) gebruiken, om een netwerkomgeving te creëren voor de containers op de gastheer. NAT is een routeringsoplossing waarin de netwerkpakketten worden gegenereerd door en bestemd voor een systeem die hun IP-adressen aangepast, zodat het lijkt alsof het systeem op een ander netwerk is.

Wanneer u een computer in het hostnetwerk pingt vanuit een containersessie, wijzigt de container host de ping-pakketten en vervangt het door het eigen 192.169.2.43-adres door het container adres 172.25.117.12 in elk. Wanneer de antwoorden uit het gepingd systeem , gebeurt het proces in omgekeerde volgorde.

De Dockerd-engine maakt standaard een NAT-netwerk wanneer het voor de eerste keer wordt uitgevoerd, en kent elke container een adres toe op dat NAT-netwerk. Het gebruik van de 172.16.0.0/12 netwerkadres is ook standaard gecodeerd in Docker. U kunt deze standaardinstellingen wijzigen, door een ander NAT-adres op te geven of helemaal geen NAT te gebruiken.

De netwerkadapters in de containers zijn natuurlijk virtueel. U kunt eerder getoonde configuratie zien in de dat de adapter voor die container wordt geïdentificeerd als vEthernet (Container NIC 76b9f047). Op de containerhost is er ook een virtuele adapter, genaamd vEthernet (HNS Internal NIC). HNS is de Host Network Service, de NAT implementatie gebruikt door Docker. Als u de Get-VMSwitch-cmdlet op de containerhost uitvoert of in de Virtual Switch Manager in Hyper-V Manager kijkt, kan u zien dat Docker ook een virtuele switch heeft gemaakt met de naam nat. Dit is de switch waarmee de adapters in de containers allemaal zijn verbonden. Daarom kunt u die containers zien als zij die net functioneren als virtuele machines, voor zover het netwerken betreft.

4.2.3.1. NAT-standaardinstellingen wijzigen

Als u een ander netwerk adres voor de Docker NAT configuratie wilt gebruiken, omdat u al een netwerk hebt dat hetzelfde adres gebruikt, is dit mogelijk. Als u een alternatief adres wilt opgeven, moet u het daemon.json-configuratiebestand gebruiken als eerder besproken in de externe Docker-clientconfiguratie.

Daemon.json is een tekstbestand dat u maakt in de map waarin het Dockerd.exe programma staat. Om een alternatief NAT-netwerkadres op te geven, neemt u de volgende tekst op in het bestand:

{ "fixed-cidr":"192.168.10.0/24" }

U kunt elk netwerkadres gebruiken voor de NAT-implementatie, maar om adres conflicten op het internet te voorkomen, moet u een netwerk gebruiken in een van de volgende gereserveerde privé-netwerken netwerkadressen:

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16

Om te voorkomen dat de Dockerd-engine überhaupt een netwerkimplementatie creëert, plaatst u de volgende tekst in het bestand daemon.json:

{"bridge": "none"}

Als u dit doet, moet u handmatig een containernetwerk maken als u wilt dat uw containers netwerkconnectiviteit hebben.

4.2.3.2. Port mapping

Als u van plan bent een servertoepassing in een container uit te voeren die poorten moet openstellen voor inkomend clientverkeer, moet u een techniek gebruiken die poortmapping wordt genoemd. Poortmapping maakt het de containerhost mogeljke, het clientverkeer dat ontvangangen wordt, om de pakketten door te sturen naar de juiste poort in de container die de toepassing uitvoert. Als u poorttoewijzing wilt gebruiken, voegt u de switch -p toe aan het Docker Run-commando, samen met de poortnummers op de containerhost en de container, zoals in het volgende voorbeeld:

docker run -it -p 8080:80 microsoft\windowsservercore uit powershell

In dit voorbeeld is er verkeer dat binnenkomt via poort 8080 van de containerhost doorgestuurd naar poort 80 van de container. Poort 80 is het bekende poortnummer voor internet serververkeer, en met deze opstelling kan de container deze standaardpoort gebruiken zonder het te monopoliseren op de containerhost, die mogelijk poort 80 nodig heeft voor zijn eigen webserver.

4.2.3.3. Een transparant netwerk creëren

In plaats van NAT te gebruiken, kunt u ervoor kiezen om een transparant netwerk te maken, een netwerk waarin de containers zijn verbonden met hetzelfde netwerk als de containerhost. Als de containerhost een fysieke computer is, zijn de containers verbonden met het fysieke netwerk. Als de container host is een virtuele machine, zijn de containers verbonden met elke virtuele switch van de VM dat het gebrukt.

Docker maakt standaard geen transparant netwerk, dus moet u het maken met behulp van de Docker Network Create-opdracht, zoals in het volgende voorbeeld:

docker-network create -d transparant trans

In dit voorbeeld maakt de opdracht een nieuw netwerk met behulp van het transparant stuurprogramma, aangegeven door de switch -d en kent deze de naam trans toe. De volgende opdracht geeft een lijst weer van alle containernetwerken, inclusief het trans-netwerk dat u zojuist hebt gemaakt.

docker network ls

Nadat u het transparante netwerk hebt gemaakt, kunt u containers maken die het gebruiken door de netwerkparameter aan uw Docker Run-opdracht toe te voegen, zoals in het volgende voorbeeld:

docker run -it --network = trans microsoft / windowsservercore powershell

Wanneer u de opdracht Ipconfig/all in deze container uitvoert, kunt u zien dat deze een IP heeft adres op het 10.0.0.0/24-netwerk, hetzelfde als het netwerk dat wordt gebruikt door de virtuele machine die als containerhost functioneert.

Wanneer u een transparant netwerk maakt en de containers die het gebruiken, verkrijgen ze allemaal IP adressen van een DHCP op het hostnetwerk van de container, indien beschikbaar. Als er geen DHCP-server beschikbaar, moet u echter de netwerkadresinstellingen opgeven wanneer u het netwerk maakt en handmatig het IP-adres van elke container configureren door het op te geven op de Docker Run-opdrachtregel.

Om een transparant netwerk met statische IP-adressen te maken, gebruikt u een opdracht zoals het volgende:

docker-network create -d transparant --subnet=10.0.0.0/24 -gateway=10.0.0.1 trans

Om vervolgens een container met een statisch IP-adres op het netwerk wilt maken, gebruikt u de Docker Run-opdracht als volgt:

docker run -it --network=trans --ip=10.0.0.16 --dns=10.0.0.10 microsoft/windowsservercore powershell

4.2.4. Beheer containergegevensvolumes

In sommige gevallen wilt u mogelijk gegevensbestanden in verschillende containers bewaren. Docker laat u dit te doen door datavolumes op een container te maken die overeenkomen met een map op de container host. Eenmaal gemaakt, zijn de gegevens die u in het gegevensvolume op de container plaatst ook beschikbaar in de bijbehorende map op de containerhost. Het tegenovergestelde is ook waar, u kunt bestanden kopiëren naar de map op de host en ze in de container openen.

Datavolumes blijven onafhankelijk van de container. Als u de container verwijdert, blijven de gegevens op het volume van de containerhost bewaard. U kunt vervolgens de map van de containerhost koppelen aan een andere container, waarmee u uw gegevens kunt bewaren via meerdere iteraties van een applicatie die in uw containers draaien.

Als u een gegevensvolume wilt maken, voegt u de switch -v toe aan een Docker Run-opdracht, zoals in het volgend voorbeeld:

docker run -it -v c:\appdata microsoft/windowsservercore powershell

Deze opdracht maakt een map met de naam c:\appdata aan in de nieuwe container en koppelt deze op de containerhost aan een submap in C:\ProgramData\docker\volumes. Om de exacte locatie te weten, kunt u de volgende opdracht uitvoeren en kijken in het gedeelte Mounts.

docker inspect dbf9674d13b9

Het gedeelte Mounts (wat een klein onderdeel is van een lange, uitgebreide lijst met die van de container specificaties) bevat Bron- en Bestemmingseigenschappen. Bestemming geeft de mapnaam aan van de container en Bron is de map op de containerhost. Om het gegevensvolume opnieuw te gebruiken, kunt u zowel de bron- als de doelmap opgeven in de Docker Run opdracht, zoals in het volgende voorbeeld:

docker run -it -v c:\sourcedata: c:\appdata microsoft/windowsservercore powershell

Als u een gegevensvolume maakt, en u een map opgeeft in de container die al bestanden bevat, wordt de bestaande inhoud overlapt door het datavolume, maar niet verwijderd. Die bestanden zijn weer toegankelijk wanneer het datavolume wordt ontkoppeld.

Standaard maakt Docker datavolumes in de lees-/schrijfmodus. Om alleen-lezen gegevensvolume te creëren, kunt u :ro aan de naam van de containermap toevoegen, zoals in het volgende voorbeeld:

docker run -it -v c:\appdata:ro microsoft / windowsservercore powershell

Opmerking Een gegevensvolume toevoegen

Om een datavolume aan een bestaande container toe te voegen, is uw enige optie om de Docker Commit te gebruiken om eventuele wijzigingen die u in de bestaande container heeft aangebracht, op te slaan in een nieuwe image en vervolgens Docker Run gebruiken om een nieuwe container van de nieuwe image te maken, inclusief de -v schakelaar om het datavolume toe te voegen.

4.2.5. Resourcebeheer

Zoals eerder opgemerkt, ondersteunt de Docker Run-opdracht vele parameters en switches, sommige waarvan in dit hoofdstuk al is aangetoond. U hebt bijvoorbeeld gezien hoe met de it-switch een interactieve container wordt gemaakt die een specifieke shell of een andere opdracht uitvoert.

Om een container te maken die op de achtergrond wordt uitgevoerd, in de zogenaamde ontkoppelde modus, gebruikt u de switch -d, zoals in het volgende voorbeeld:

docker run -d -p 80:80 microsoft/iis

Voor interactie met een vrijstaande container kunt u netwerkverbindingen of een gedeeld bestandssysteem gebruiken. U kunt ook verbinding maken met de container met de opdracht Docker Attach.

4.2.5.1. Werken met containernamen

Wanneer u een container maakt met de opdracht Docker Run, kent de Dockerd engine standaard drie identificatiekenmerken toe aan de container:

  • Lange UUID – Een 32-byte hexadecimale reeks, vertegenwoordigd door 64 cijfers, zoals in het volgend voorbeeld: 0e38bdac48ca0120eff6491a7b9d1908e65180213b2c1707b924991ae8d1504f
  • Korte UUID – De eerste zes bytes van de lange UUID, weergegeven als 12 cijfers, zoals in het volgend voorbeeld: 0e38bdac48ca.
  • Naam – Een willekeurig gekozen naam bestaande uit twee woorden gescheiden door een onderstrepingsteken, zoals in het volgende voorbeeld: drunk_jones

U kunt elk van de drie ID’s gebruiken wanneer u op de opdrachtregel naar de container verwijst. U kunt ook uw eigen naam aan de container toewijzen wanneer u deze maakt, door de toe name parameter aan de oprdrachteregel toe te voegen met de Docker Run-opdrachtregel, zoals in het volgende voorbeeld:

docker run -it microsoft/windowsservercore powershell --name core1

4.2.5.2. Geheugen beperken

De opdracht Docker Run ondersteunt parameters waarmee u kunt opgeven hoeveel geheugen dat een container mag gebruiken. Standaard kunnen containerprocessen zoveel host- en wisselgeheugen gebruiken als nodig is. Als u meerdere containers op de dezelfde host uitvoert of een geheugenintensieve toepassing op de host zelf, kunt u beperkingen in het geheugen opleggen  die door bepaalde containers kunnen worden gebruikt.

De geheugenparameters die u kunt gebruiken in een Docker Run-opdracht zijn als volgt:

  • -m (of –memory) – Geeft de hoeveelheid geheugen aan die de container kan gebruiken. Waarden bestaan uit een geheel getal en de eenheid-ID b, k, m of g (voor bytes, kilobytes, megabytes of gigabytes, respectievelijk).
  • -memory-swap – Specificeert de totale hoeveelheid geheugen plus virtueel geheugen dat de container kan gebruiken. Waarden bestaan uit een geheel getal en de eenheididentificatie b, k, m of g.
  • -memory-reservation – Hiermee geeft u een zacht geheugenlimiet op dat de host voor de container behoudt, zelfs wanneer er strijd is voor systeemgeheugen. Bijvoorbeeld, kan u misschien de switch -m gebruiken om een harde limiet van 1 GB en een  geheugenreserveringswaarde van 750 MB in te stellen. Wanneer andere containers of processen extra geheugen vereisen, kan de host tot 250 MB van het geheugen van de container recuperen, maar laat minstens het 750 MB intact. Waarden bestaan uit een geheel getal kleiner dan dat van de waarde m of –memory-swap en de eenheididentificatie b, k, m of g.
  • -kernel-memory – Geeft de hoeveelheid geheugenlimiet aan die is ingesteld, met de switch -m, die gebruikt kan worden voor kernelgeheugen. Waarden bestaan uit een geheel getal en de eenheid-ID b, k, m of g.
  • -oom-kill-disable – Voorkomt dat de kernel containerprocessen doodt wanneer er een geheugentekort fout optreedt. Gebruik deze optie nooit zonder de -m-schakelaar om een geheugenlimiet voor de container. Anders kan de kernel processen op de host beginnen te doden wanneer een OOM-fout optreedt.

4.2.5.3. CPU cycles beperken

U kunt ook parameters opgeven die de CPU-cycli beperken die aan een container zijn toegewezen. Standaard worden alle beschikbare CPU-cycli gelijk verdeeld onder containers op een host. Door deze parameters te gebruiken, kunt u prioriteiten toewijzen aan de containers, die van kracht worden wanneer cpu geschil optreedt.

De Docker Run-parameters die u kunt gebruiken om containertoegang tot CPU’s te beheren, zijn als volgt:

  • -c (of –cpu-shares) – Specificeert een waarde van 0 tot 1024 die het gewicht aangeeft wanneer de container in strijd voor CPU-cycli. Het werkelijke aantal processorcycli dat een container ontvangt, is afhankelijk van het aantal containers dat op de host wordt uitgevoerd en hun respectievelijke gewichten.
  • -cpuset-cpus – Geeft aan welke CPU’s in een multiprocessor-hostsysteem de container kan gebruiken. Waarden bestaan uit gehele getallen die de CPU’s in de host vertegenwoordigen computer, gescheiden door komma’s.
  • -cpuset-mems – Geeft aan welke knooppunten op een NUMA-host de container kan gebruiken. Waarden bestaan uit gehele getallen die de CPU’s in de hostcomputer vertegenwoordigen, gescheiden door komma’s.

4.2.6. Maak nieuwe containerafbeeldingen met Dockerfile

Als u wijzigingen hebt aangebracht in een container sinds u deze voor het eerst hebt gemaakt met Docker Run opdracht, kunt u die wijzigingen opslaan door een nieuwe containerafbeelding te maken met Docker Commit. De aanbevolen methode voor het maken van containerafbeeldingen is echter om ze helemaal opnieuw te bouwen met behulp van een script dat een dockerbestand wordt genoemd.

Een dockerfile is een tekstbestand met de naam dockerfile, dat de opdrachten bevat die nodig zijn om uw nieuwe afbeelding te bouwen. Nadat u het dockerbestand hebt gemaakt, gebruikt u de Docker Build-opdracht om het uit te voeren en het nieuwe bestand te maken. Het dockerbestand is slechts een mechanisme dat het proces automatiseert van het uitvoeren van de stappen die u hebt gebruikt om uw container handmatig te wijzigen. Wanneer u de opdracht Docker Build uitvoert met het dockerbestand, voert de Dockerd engine elke opdracht in het script uit door een container te maken en de wijzigingen aan te brengen die u opgeeft en een Docker Commit-opdracht uitvoert om de wijzigingen op te slaan als een nieuwe afbeelding.

Een dockerbestand bestaat uit instructies, zoals FROM of RUN, en een instructie voor elk instructie. Het geaccepteerde formaat is om de instructie met een hoofdletter te schrijven. U kunt opmerkingen invoegen in het script door ze vooraf te laten gaan door het hekje (#).

Een voorbeeld van een eenvoudig dockerbestand is als volgt:

#install DHCP server
FROM microsoft/windowsservercore
RUN powershell -command install-windowsfeature dhcp -includemanagementtools
RUN powershell -configurationname microsoft.powershell -command add-dhcpserverv4scope -state active -activatepolicies $true -name scopetest -startrange 10.0.0.100 -endrange 10.0.0.200 -subnetmask 255.255.255.0
RUN md boot
COPY ./bootfile.wim c:/boot/
CMD powershell

In dit voorbeeld:

Nadat u het dockerfile-script hebt gemaakt, gebruikt u de opdracht Docker Build om de nieuwe image te maken, zoals in het volgende voorbeeld:

docker build -t dhcp .

Met deze opdracht wordt het dockerbestand uit de huidige map gelezen en wordt een image gemaakt dhcp genoemd. Terwijl de Dockerd-engine de image samenstelt, worden de resultaten van elk commando en de ID’s van de tijdelijke containers weergegeven die het maakt. Eens u de afbeelding hebt gemaakt, kunt u er vervolgens een container van maken met Docker Run commando.

4.2.7. Beheer containerafbeeldingen met DockerHub Repository voor publiek en privé scenario’s

DockerHub is een openbare opslagplaats die u kunt gebruiken om uw containerimages op te slaan en te distribueren. Wanneer u containerimages downloadt met het Docker Pull-commando, komen ze standaard van DockerHub, tenzij u een andere repository in de opdracht opgeeft. U kunt ook afbeeldingen uploaden met de opdracht Docker Push.

Door afbeeldingen te uploaden naar DockerHub kunt u ze delen met uw collega’s, en zelfs met uzelf, zodat u geen bestanden handmatig hoeft over te zetten om een containerimage te implementeren op een andere host.

Voordat u afbeeldingen kunt uploaden naar de Docker Hub, moet u zich registreren op de site op http://hub.docker.com. Nadat u dit hebt gedaan, wordt uw gebruikersnaam de naam van uw repository op de service. Bijvoorbeeld, de microsoft/windowsservercore image die u eerder hebt binnengehaald is een image met de naam windowsservercore in de Microsoft-repository. Als uw gebruikersnaam op DockerHub hholt is, beginnen uw images allemaal met die naam van de repository, gevolgd door de imagenaam, zoals in het volgende voorbeeld:

hholt/nano1

Zodra u een account hebt, moet u zich aanmelden bij de DockerHub-service vanaf de opdrachtregel voordat u images kunt duwen. U doet dit met de volgende opdracht:

docker login

Docker vraagt u om uw gebruikersnaam en wachtwoord en biedt vervolgens uploadtoegang naar uw repository.

4.2.7.1. Images zoeken

U kunt images op de DockerHub zoeken met behulp van de website. Deze interface biedt de meest recente informatie over de image, evenals opmerkingen van andere gebruikers in de Docker-community.

U kunt de DockerHub ook doorzoeken vanaf de opdrachtregel met behulp van de Docker Search opdracht, zoals in het volgende voorbeeld:

docker search microsoft --no-trunc

Door de parameter no-trunc toe te voegen, voorkomt u dat de opdracht de image beschrijvingen afkapt.

4.2.7.2. Images pushen

Om uw eigen afbeeldingen te uploaden naar de repository, gebruikt u de Docker Push-opdracht, zoals in het volgend voorbeeld:

docker push hholt/nano1

Standaard uploadt de Docker Push-opdracht de opgegeven image naar uw publieke repository op de DockerHub. Iedereen heeft op deze manier toegang tot gepushte afbeeldingen.

Omdat Docker open source software is, die images en code deelt met de gemeenschap, is dit een groot deel van de filosofie van het bedrijf. Het is echter ook mogelijk om privé repositories te maken, die u kunt delen met een onbeperkt aantal bijdragers die u selecteert.

Hiermee kunt u DockerHub gebruiken voor veilige applicatieontwikkelingsprojecten of een andere situatie waarin u geen image voor het publiek wilt inzetten. DockerHub biedt een enkele privérepository als onderdeel van de gratis service, maar voor extra repositories moet u een abonnement kopen.

Naast het opslaan en aanbieden van images, biedt DockerHub ook andere services, zoals geautomatiseerde builds. Door een docker-bestand en andere benodigde bestanden naar een repository te uploaden, kunt u DockerHub configureren om automatisch builds voor u uit te voeren met uw exacte specificaties. De codebestanden zijn beschikbaar voor uw bijdragers en nieuwe builds kunnen voorkomen wanneer de code verandert.

4.2.8. Beheer containerafbeeldingen met behulp van Microsoft Azure

U kunt containers niet alleen lokaal maken, maar ook op Microsoft Azure. Door door een virtuele Windows Server 2016-machine op Azure te maken, kunt u deze containers maken en beheren net zoals u zou doen op een lokale server. Azure biedt ook de Azure Container Service (ACS), waarmee u een cluster van virtuele machines die u kunt maken, configureren en beheren, geconfigureerd om container-gebaseerde applicaties uit te voeren met behulp van verschillende open source technologieën.

Microsoft Azure is een cloudservice op basis van een abonnement waarmee u virtuele machines en applicaties kunt implementeren en ze in uw bestaande onderneming kunt integreren. Door een maandelijkse kost te betalen, kunt u een virtuele machine voor Windows Server 2016 maken. Nadat u de virtuele machine hebt gemaakt, kunt u de functie Containers en de Docker-engine installeren. Containers en images die u op een virtuele Azure-machine maakt, zijn volledig compatibel met de Docker-implementaties op uw lokale computers.

4.3. Samenvatting

  • Containers zijn gebaseerd op imags. U maakt een container door een image uit te voeren, en u maakt een image door de inhoud van een container op te slaan.
  • Windows Server 2016 bevat de functie Containers, die ondersteuning biedt voor het Docker-platform omgeving.
  • Zowel de Server Core- als de Nano Server-installatieopties ondersteunen het maken van Windows Server en Hyper-V-containers. In Nano Server kunt u de Docker.exe-client op een extern systeem uitvoeren.
  • Docker is een open source containeroplossing die uit twee bestanden bestaat: Dockerd.exe, dat de engine is die als een service op Windows draait, en Docker.exe, wat de opdrachtregelclient is die de Dockerd-engine bestuurt.
  • Met behulp van een tekstbestand met de naam daemon.json, kunt u opstartopties configureren voor de Dockerd engine.
  • De Docker-client is een manier om de Docker-engine te bedienen, maar het is niet de enige manier. U kunt ook de Docker-module voor Windows PowerShell gebruiken om dezelfde taken uit te voeren.
  • Gebruik de opdracht Docker Pull om images van de Docker Hub te downloaden.
  • Tags zijn versie-indicatoren die ontwikkelaars kunnen gebruiken om de builds of versies van een containerimage te volgen. Gebruik de opdracht Docker Tag om tagwaarden toe te wijzen.
  • Als u een containerimage wilt verwijderen, gebruikt u de Docker RMI-opdracht.
  • Als u een Windows Server-container wilt maken, gebruikt u de opdracht Docker Run en geeft u deze op de naam van een containerafbeelding.
  • De procedure voor het maken van een Hyper-V-container met Docker verschilt van een Windows Server-container alleen met de parameter –isolation.
  • Met de Docker.exe-client kunt u containers beheren door ze te starten, te stoppen, op te slaan en ze te verwijderen.
  • De Docker-module voor Windows PowerShell biedt een alternatief voor de Docker.exe-client die de meeste, zo niet alle, dezelfde functies kan uitvoeren.
  • Docker gebruikt standaard netwerkadresvertaling om containers te voorzien van netwerktoegang. U kunt de standaardinstelling echter overschrijven en containers configureren die deel uitmaken van uw grotere netwerk.
  • Met Docker kunt u gegevensvolumes maken die op de containerhost staan en deze toevoegen aan een container. Datavolumes blijven op hun plaats, zelfs als u de container zelf verwijdert.
  • Met behulp van parameters op de opdrachtregel van Docker Run kunt u de hoeveelheid geheugen en CPU-bronnen beperken die een container mag gebruiken.
  • Een dockerbestand is een script dat instructies bevat voor het bouwen van een nieuwe containerimage.
  • U gebruikt de opdracht Docker Build om het script uit te voeren en de image te maken.
  • Docker Hub is een gratis repository, gebaseerd in de cloud, waarop u uw images kunt uploaden
  • Met Microsoft Azure kunt u virtuele machines maken die u als container gastheren kunt gebruiken.