Windows Containers
.Net Core applicaties zijn multi-platform, dus is het mogelijk om ze zowel onder Linux als onder Windows te starten. Het opzetten van een testomgeving met Kubernetes en Linux containers hebben we inmiddels onder de knie. Nu nog windows containers. Hier liepen we tegen een aantal problemen aan.
Hyper-V weigert
Een van de eerste problemen waar ik tegenaan liep was dat Hyper-V niet meer goed werkte waardoor docker problemen had met de windows containers. Alles wat ik met Hyper-V wilde doen zorgde voor een foutmelding:
“Hyper-V encountered an error trying to access an object on computer ‘localhost’ because the object was not found. The object might have been deleted. Verify that the Virtual Machine Management service on the computer is running. If the service is running, try to perform the task again by using Run as Administrator.”
Uiteindelijk via Shaun Cassells een oplossing gevonden.
#Als admin uitvoeren in powershell
MOFCOMP %SYSTEMROOT%\System32\WindowsVirtualization.V2.mof
Geen internet in de container
Toen Hyper-V eindelijk werkte wilde ik met een docker build een container gaan bouwen. 1 van de stappen in het proces was het downloaden van een script/package o.i.d. Hiervoor moest de container verbinding maken met het internet. Dat resulteerde in
Host not found
meldingen e.d. Dit heb ik uiteindelijk opgelost door te zorgen dat er een netwerk interface welke zowel DHCP verzorgde als verbinding had (ConnectionState = Connected) als laagste in de lijst van IP interfaces te hebben staan.
Hiervoor heb ik een tweetal commando's gebruikt.
#Allereerst bepalen welke netwerk interfaces er zijn
Get-NetIPInterface -AddressFamily IPv4 | Sort-Object -Property InterfaceMetric -Descending
# Resultaat voorbeeld
ifIndex InterfaceAlias AddressFamily NlMtu(Bytes) InterfaceMetric Dhcp ConnectionState PolicyStore
------- -------------- ------------- ------------ --------------- ---- --------------- -----------
82 vEthernet (nat) IPv4 1500 5000 Disabled Connected ActiveStore
2 Bluetooth Network Connection IPv4 1500 65 Enabled Disconnected ActiveStore
22 Local Area Connection* 2 IPv4 1500 25 Enabled Disconnected ActiveStore
30 Local Area Connection* 1 IPv4 1500 25 Enabled Disconnected ActiveStore
8 Ethernet IPv4 1500 20 Enabled Disconnected ActiveStore
74 vEthernet (WSL) IPv4 1500 15 Disabled Connected ActiveStore
62 vEthernet (Default Switch) IPv4 1500 15 Disabled Connected ActiveStore
63 vEthernet (DockerNAT) IPv4 1500 10 Enabled Connected ActiveStore
#De interface met de laagste interfacemetric moet DCHP en Connected zijn.
Set-NetIPInterface -InterfaceAlias 'vEthernet (DockerNAT)' -InterfaceMetric 10
Met dank aan ImproveAndRepeat
Windows versies
Linux containers lijken een stuk minder gevoelig voor het host OS dan dat Windows containers dat zijn. Als de build gelukt was en vervolgens gestart op de host volgde er regelmatig een melding dat de host niet compatible was. Hierom was het van belang om de juiste versie van een windows container te kiezen die past bij het Host OS.
Microsoft beschrijft hier hoe een server voorbereid moet worden op containers.
Er is een uitgebreide pagina waar dit staat beschreven. De korte veilige samenvatting is kijk welke versie er staat bij winver
en kies een windowscore of nanoserver met dezelfde versie.
Kleine kanttekening Windows server 2019 (Winver 1809) ondersteund niet het zetten van de path variable wat nodig was voor een node applicatie waardoor weer een alternatieve oplossing gevonden moest worden.
Bonus voor langzame docker builds
Op een gegeven moment tijdens het testen werd de boel een beetje traag met die docker build acties. Dit kan versneld worden door bepaalde folders niet te kopieren naar het docker image. Dit wordt geregeld met een .dockerignore
bestand. Hierin kunnen dan folders zoals .VSCODE
en .git
en NodeModules
/.vscode/*
/__mocks__/*
/node_modules/*
/.git/*