4.1 Deploy Windows containers


4.1.1 Determine installation requirements and appropriate scenarios for Windows Containers

4.1.2 Install and configure Windows Server container host in physical or virtualized environments

4.1.3 Install and configure Windows Server container host to Windows Server Core or Nano Server in a physical or virtualized environment

4.1.4 Install Docker on Windows Server and Nano Server

4.1.5 Configure Docker start-up options

4.1.6 Install PowerShell for Docker

4.1.7 Install a base container image

4.1.8 Tag an image

4.1.9 Remove a container

4.1.10 Create Windows Server containers


4.1.1 Determine installation requirements and appropriate scenarios for Windows Containers

Containere er en type virtuelle maskiner hvor man i stedet for å ha et eget OS, deler OS med hosten. Det betyr at man ikke må installere hverken operativsystem, og containere må ikke utføre boot sequence, laste biblioteker eller sette av minne til OS. Containere starter på bare sekunder og man kan ha flere av de enn man kan ha virtuelle maskiner. Dette gjør de til ideelle for applikasjonsutvikling og programvaretesting. For å få til disse tingene i containere bruker Windows to teknikker:

  • Namespace isolation: Hver container har kun tilgang til de ressursene som er gjort tilgjengelig til den. Den deler ressurser med hosten, den kopierer de ikke. Bare når man gjør en endring på en fil blir den kopiert til containerens filsystem.
  • Resource goverance: Containeren har kun tilgang til en gitt mengde prosessorkraft, minne, båndbredde mm. En container kjører i en sandkasse uten tilgang til ressurser som er allokert til andre containere.

Container images

Containere er basert på images som man kan laste ned fra repositories og kjøres. Imaget innholder kun det som er nødvendig for at en applikasjon skal kunne kjøre, ikke hele operativsystemet. Dette gjør at imagene tar veldig liten plass og gjør de ideel for applikasjonsutvikling og testing, uten at man trenger å bekymre seg for hardware kompatibilitet.

4.1.2 Install and configure Windows Server container host in physical or virtualized environments

Windows Server 2016 støtter to typer containere; Windows Server Container og Hyper-V containers.

  • Windows Server Container: Kjører i User-Mode og deler alt med hosten, inkl. OS kernel og minne. Det gjør det teoretisk mulig at en applikasjon kan klare å komme seg ut av containeren og inn på hosten. Derfor bør man kun bruke dette om man stoler på innholdet i containeren.
  • Hyper-V Container: Hyper-V oppretter en egen kopi av OS kernel for hver container. Hyper-V containere eksisterer på innsiden av en egen VM. Det betyr at de får tilegnet sitt eget minne, lagring og nettverk I/O. Passer for det Microsoft kaller hostile multi-tenant applikasjoner, hvor man ikke nødvendigvis stoler på det som kjøres i containeren.

Installing a container host

Container hosten kan være en virtuell maskin hvis den fysiske hosten støtter nestet virtualisering. Både fysisk og virtuell host må kjøre Windows Server 2016. VMen bør ha minst 4 GB RAM og 2 prosessorkjerner. Fysisk host må ha en Intel prosessor med VT-X og Extended Page Tables (EPT). Så må man konfigurere VMen til å kunne aksessere virtualiseringsteknologien på den fysiske hosten.

Set-VMProcessor -VMName ContainerHost -ExposeVirtualizationExtensions $true
Set-VMNetworkAdapter -VMName ContainerHost -MacAddressSpoofing On

4.1.3 Install and configure Windows Server container host to Windows Server Core or Nano Server in a physical or virtualized environment

I Windows Server 2016 er støtte for containere en feature. For å bruke Hyper-V containers må også Hyper-V rollen installeres:

Install-WindowsFeature -Name Containers, Hyper-V

NB. For å opprette Windows containers må OS på host være installert på C:. Installasjon av Hyper-V rollen har egne hardware krav, se kapittel 3.1.1.

Konfigurere Nano Server som container host

Opprette et Nano Server Container host image:

New-NanoServerImage -DeploymentType Guest -Edition Datacenter -Containers -Compute -MediaPath F: -TargetPath D:\Hyper-V\VHD\NanoHost.vhdx -ComputerName NanoHost -DomainName ad.norrz.com

Oppretter og starter VM:

New-VM -Name NanoHost -MemoryStartupBytes 8GB -SwitchName "Ekstern" -VHDPath D:\Hyper-V\VHD\NanoHost.vhdx -Generation 2

Set-VMProcessor -VMName NanoHost -Count 2 -ExposeVirtualizationExtensions $true

Start-VM -Name NanoHost

Verifiser at du får koblet til Nano Server (forutsetter DHCP på nettverket og at den er meldt inn i domenet):

Enter-PSSession -ComputerName NanoHost

# Hvis noe mangler for å kunne koble til kan man koble til med PowerShell Direct for å fikse
Enter-PSSession -VMName NanoHost -Credential NanoHost\Administrator

4.1.4 Install Docker on Windows Server and Nano Server

For å opprette og administrere containere må man laste ned og installere Docker: https://store.docker.com/editions/community/docker-ce-desktop-windows

Docker er et open-source verktøy som har tilbydd containere til Linux i mange år, og har nå blitt portert til Windows. Docker består av to filer:

  • Dockerd.exe: Docker engine/service/daemon, kjører i bakgrunnen
  • Docker.exe: En kommandolinje for å opprette og administrere containere

Docker inkluderer også følgende ressurser:

  • Dockerfiles: Skript som detaljerer opprettelsen av containere
  • Docker Hub: Skybasert register hvor brukere kan linke til image og kode repositories, samt bygge og lagre egne images
  • Docker Cloud: Skybasert tjeneste for å deploye containerbaserte applikasjoner

Installer Docker på en Windows Server

Siden Docker er open-source er det ikke inkludert i Windows Server 2016, og må lastes ned og installeres. Dette gjør man med OneGet, en skybasert package manager i Windows.

Install-Module -Name DockerMSFTProvider -Force
Install-Package -Name Docker -ProviderName DockerMSFTProvider -Force

Restart maskinen etter installasjonen er ferdig.

Installer Docker på Nano Server

Installeres på Nano Server på samme måte som for Windows Server, men inkluderer noen ekstra steg etter installasjonen.

# Nano Server kan bare administreres via PowerShell fra en annen maskin
Enter-PSSession -ComputerName NanoHost

# Åpne for Docker Daemon i brannmur
New-NetFirewallRule -DisplayName "Docker Daemon" -Direction Inbound -Protocol TCP -LocalPort 2375 -Action Allow

# Konfigurer Docker Daemon til å akseptere nettverkstrafikk. Må opprette en JSON fil med konfigurasjon
New-Item -ItemType File -Path 'C:\Programdata\docker\config\daemon.json'
Add-Content -Path 'C:\Programdata\docker\config\daemon.json' -Value '{ "hosts": [ "tcp://0.0.0.0:2375", "npipe://" ]}'

# Restart Docker tjenesten for å laste inn filen
Restart-Serivce -Name Docker

NB. For å installere Docker manuelt: https://docs.docker.com/install/windows/docker-ee/#optional-make-sure-you-have-all-required-updates (Install-Package feilet hver gang på Nano Server, trolig pga. eldre Nano Server versjon).

For å fjernadministrere Dockerd engine kan man installere en Docker.exe klient på en annen maskin. Den kan lastes ned fra: http://download.docker.com/components/engine/windows-server/cs-1.12/docker.zip

Det kan også gjøres med PowerShell:

Invoke-WebRequest -Uri "http://download.docker.com/components/engine/windows-server/cs-1.12/docker.zip" -OutFile "$env:TEMP\docker.zip" -UseBasicParsing
Expand-Archive -Path "$env:TEMP\docker.zip" -DestinationPath $env:ProgramFiles

# Gjør Docker.exe tilgjengelig fra hvor som helst på systemet
# [System.Environment]::SetEnvironmentVariable("Path", $env:Path + ";$env:ProgramFiles\docker", [System.EnvironmentVariableTarget]::Machine)
# Nano Server krever en annen måte å gjøre det på:
Set-ItemProperty -Path ‘HKLM:\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH –Value $($env:Path + ";C:\Program Files\Docker")

# For å koble til Docker på Nano Server og opprette en container
Docker.exe -H tcp://hostIPorName:2375 run -it microsoft/nanoserver cmd

4.1.5 Configure Docker start-up options

For å konfigurere Docker endrer man på JSON filen C:\Programdata\docker\config\daemon.json.

Følgende er noen innstillinger man kan sette (JSON kode):

{
    "hosts": [ "tcp://0.0.0.0:2375", "npipe://" ],
    "graph": "D:\\docker",
    "bridge": "none",
    "group": "docker",
    "dns": 10.0.0.5
}
  • graph: Lagre image filer til en annen lokasjon
  • bridge: Docker engine oppretter NAT for at containere skal kunne snakke med hverandre og utsiden. Dette kan slås av ved å sette "none".
  • group: Deleger docker administrativ tilgang til en egen gruppe kalt "docker"
  • dns: Spesifiser alternativ DNS for docker containere

NB. Merk at Windows versjonen av docker ikke støtter alt som støttes i Linux. Vær obs på at det er forskjellig dokumentasjon for WIndows og Linux.

4.1.6 Install PowerShell for Docker

Man kan bruke PowerShell til å administrere Docker ved å installere en egen PowerShell modul for Docker.

# Installer modulen
Register-PSRepository -Name DockerPS-Dev -SourceLocation https://ci.appveyor.com/nuget/docker-powershell-dev
Install-Module Docker -Repository DockerPS-Dev -Scope CurrentUser

# Sjekk kommandoer i modulen
Get-Command -Module Docker

# Oppdater modulen
Update-Module Docker

NB! Modulen er vist ikke lengre tilgjengelig grunnet at den var lite brukt... Får ikke installert modulen lengre. Prøvde å laste ned fra https://github.com/Microsoft/Docker-PowerShell og installere manuelt, men fungerte ikke. https://help.appveyor.com/discussions/problems/15152-trying-to-accesss-httpsciappveyorcomnugetdocker-powershell-dev

4.1.7 Install a base container image

Man kan laste ned et basis OS image som man kan bruke til å lage cotnainer images.

# Kan ta en stund å laste ned image avhengig av nettverk. Laster ned Windows Serve Core:
Docker.exe pull microsoft/windowsservercore

# Eller med PowerShell modulen
Request-ContainerImage -Repository microsoft/windowsservercore

# Sjekke hvilke images som er tilgjengelig i et repository
Docker.exe search microsoft

NB. Imaget microsoft/windowsservercore tar nærmere 20GB diskplass.

4.1.8 Tag an image

Kommandoen over vil alltid laste ned det nyeste imaget, men man kan spesifisere en versjon med tag attributtet. Tag er en form for versjonskontroll og er vanligvis på formen 1.1, 1.2, 2.0 osv. Default tag er "latest" hvis man ikke tagger et image, men det betyr altså ikke nødvendigvis at det er nyeste imaget man laster ned når det står "latest". Det er opp til eier av repository å vedlikeholde taggene. Man kan tagge et lokalt container image med:

Docker.exe tag imagename:tag

Hvis man skal laste opp imaget til Docker Hub så må man legge på Docker Hub brukernavn:

Docker.exe tag username/imagename:tag

# Med PowerShell modulen
Add-ContainerImageTag -ImageIdOrName imagename -Repository username/imagename -tag imagetag

4.1.9 Remove a container

Man kan fjerne images:

# Vis installerte images
Docker.exe images

# Fjern image
Docker.exe rmi -f microsoft/nanoserver:latest

Og man kan fjerne containere:

Docker.exe rm ContainerIdOrName

4.1.10 Create Windows Server containers

Når imaget er på plass kan man lage containere fra det:

# Lager en Nano Server container og åpner en interaktivt PowerShell sesjon inn til containeren (fra en annen server)
Docker.exe -H tcp://ipadresse:2375 run -it microsoft/nanoserver powershell

# Med PowerShell modulen
New-Container -ImageIdOrName microsoft/nanoserver -input -terminal -command powershell

# Man kan liste ut containere
Docker.exe ps

NB. Man trenger ikke laste ned image på forhånd, men det kan spare tid når man oppretter containere

4.1.11 Create Hyper-V containers

Å opprette Hyper-V containere er ganske likt som å opprette Windows Server Containere. Eneste forskjellen er at man legger til --isolation=hyperv som parameter.

Docker.exe run -it --isolation=hyperv microsoft/nanoserver powershell

results matching ""

    No results matching ""