ADMIN

2021

07

2021-07-01T12:00:00

Container- und Applikationsmanagement

SCHWERPUNKT

077

Virtualisierung

Containermanagement

Applikationsmanagement

Linux-Container mit WSL2 unter Windows nutzen

Verschachtelt

von Thomas Joos

Veröffentlicht in Ausgabe 07/2021 - SCHWERPUNKT

Das Windows-Subsystem für Linux ermöglicht es, Linux-Befehle direkt in Windows Server zu integrieren. Das gilt auch für Linux-Container, die sich auf diese Weise sogar in Windows 10 Pro oder Enterprise nutzen lassen. Welche Voraussetzungen dafür nötig sind, wie Sie Docker mit WSL2 verwenden und dabei sogar Kubernetes zum Einsatz bringen, verrät unser Workshop.

Linux-Programme und -Befehle sind mithilfe des Windows-Subsystem für Linux (WSL) nahezu lückenlos in Windows nutzbar – auch Container. Die Installation von WSL ist einfach, die meisten Distributionen stehen kostenlos zur Verfügung und lassen sich genauso schnell einbinden wie entfernen. Sogar Docker lässt sich zusammen mit WSL einsetzen.
Linux-Container mit WSL sind auf Windows-Servern nur dann sinnvoll, wenn WSL2 zum Einsatz kommt. Das ist aktuell mit Windows Server 2019 nicht möglich. Um auch hier auf WSL zu setzen, sollte Windows 10 Update 2004 zum Einsatz kommen. Ebenso verfügt der LTSC-Nachfolger von Windows Server 2019 mit der Bezeichnung Windows Server 2022 über WSL2.
Linux und Windows gemeinsam betreiben
Nach der Installation von WSL ist es möglich, neben Windows Server auch lokale Windows-Arbeitsstationen mit Linux-Befehlen zu verwalten – gerade für Test- und Entwicklungsumgebungen ein maßgeblicher Punkt, denn Container aus Windows 10 lassen sich dann jederzeit auf produktive Container-Hosts übertragen. Auch das Verwalten von Linux-Servern im Netzwerk stellt kein Problem dar. Und selbst wenn auf allen Systemen Windows Server installiert ist, lassen sich Windows- und Linux-Container parallel einsetzen.
Linux-Programme und -Befehle sind mithilfe des Windows-Subsystem für Linux (WSL) nahezu lückenlos in Windows nutzbar – auch Container. Die Installation von WSL ist einfach, die meisten Distributionen stehen kostenlos zur Verfügung und lassen sich genauso schnell einbinden wie entfernen. Sogar Docker lässt sich zusammen mit WSL einsetzen.
Linux-Container mit WSL sind auf Windows-Servern nur dann sinnvoll, wenn WSL2 zum Einsatz kommt. Das ist aktuell mit Windows Server 2019 nicht möglich. Um auch hier auf WSL zu setzen, sollte Windows 10 Update 2004 zum Einsatz kommen. Ebenso verfügt der LTSC-Nachfolger von Windows Server 2019 mit der Bezeichnung Windows Server 2022 über WSL2.
Linux und Windows gemeinsam betreiben
Nach der Installation von WSL ist es möglich, neben Windows Server auch lokale Windows-Arbeitsstationen mit Linux-Befehlen zu verwalten – gerade für Test- und Entwicklungsumgebungen ein maßgeblicher Punkt, denn Container aus Windows 10 lassen sich dann jederzeit auf produktive Container-Hosts übertragen. Auch das Verwalten von Linux-Servern im Netzwerk stellt kein Problem dar. Und selbst wenn auf allen Systemen Windows Server installiert ist, lassen sich Windows- und Linux-Container parallel einsetzen.
Mit der Linux-Bash lassen sich über die Eingabeaufforderung oder PowerShell auch Linux-Shells öffnen. Alternativ nutzen Sie das Windows Terminal, das über verschiedene Registerkarten gleichzeitige Sitzungen in der PowerShell, Eingabeaufforderung, Azure Cloud Shell und Linux-Bash ermöglicht. Wer mit Containern im Netzwerk arbeitet und Windows parallel mit WSL nutzt, sollte sich die Möglichkeiten des Terminals näher ansehen. Unternehmen, die parallel ihre Container in Microsoft Azure betreiben, profitieren von weiteren Funktionen. In einer Oberfläche lassen sich über verschiedene Registerkarten unterschiedliche Server und Container in der Umgebung administrieren.
Die Windows-Defender-Firewall in Windows 10 und Server 2019 kann Firewallregeln für jeden Prozess im Windows Subsystem for Linux erstellen. Das ist für den Betrieb von Containern oder ausgehende Verbindungen von Linux-Prozessen in Containern auch nötig. Die ausgehenden Prozesse können sich dabei mit Linux-Servern genauso verbinden wie mit dem lokalen Windows-System. Vor allem in hybriden Netzwerken, in denen Linux und Windows parallel zum Einsatz kommen, ergibt WSL also Sinn.
WSL für Containerbetrieb vorbereiten
Um Linux-Container in Windows optimal zu betreiben, sollten Sie WSL2 installieren. Die neue Version nutzt Virtualisierungstechnologien aus Hyper-V, einen eigenen Kernel, ein natives EXT4-Dateisystem und kann Container dadurch optimal virtualisieren. Ebenso wurde die Integration von Docker verbessert. Wenn es darum geht, Linux-Container auf Windows zu virtualisieren, sollten Sie also möglichst immer auf WSL2 setzen. Die Installation erfolgt mit diesen Befehlen:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
Wenn es sich beim Container-Host um einen virtuellen Server handelt, der zum Beispiel mit Hyper-V zur Verfügung gestellt ist, müssen Sie die eingebettete Virtualisierung für den Host aktivieren. Ansonsten läuft WSL2 nicht, was den Betrieb als Container-Host sehr beeinträchtigt und die Container verlangsamt. Die Container verbrauchen ohne Verwendung von WSL2 mehr Arbeitsspeicher und verursachen eine höhere CPU-Last. Trotz des erhöhten Ressourcenkonsums sind die Container dennoch eher langsam.
Bevor Sie auf einem virtuellen Windows-Host Container über WSL betreiben können, sind einige Vorbereitungen zu treffen. Zunächst müssen Sie den dynamischen Arbeitsspeicher für die VM in den Einstellungen deaktivieren – falls Sie ihn eingeschaltet haben. Außerdem müssen Sie die Virtualisierungserweiterungen für die vCPU aktivieren, genauso wie MAC-Address-Spoofing. Auch dabei können Sie wieder auf die PowerShell setzen, die Sie mit erhöhten Administrationsrechten gestartet haben:
Set-VMProcessor -VMName "<VM-Name>" -ExposeVirtualizationExtensions $true
Get-VMNetworkAdapter -VMName "<VM-Name>" | Set-VMNetworkAdapter -MacAddressSpoofing On
Bild 1: In den Einstellungen von Docker lässt sich die Integration in WSL2 auswählen und aktivieren.
WSL als Container-Umgebung konfigurieren
Nach der Installation von WSL für den Container-Betrieb sollten Sie generell sicherheitshalber immer nach Windows-Updates suchen und diese aufspielen. Für die Verwendung der neuen Version WSL2 muss auf dem Computer das "WSL2 Linux kernel update package for x64 machines" [1] installiert sein. Die Aktualisierung können Sie auch mit wsl -update in der Befehlszeile durchführen.
WSL2 wird identisch gesteuert und konfiguriert wie der Vorgänger. Teilweise unterstützen die Linux-Distributionen WSL1 und WSL2 aber unterschiedlich. Jede Distribution lässt sich jederzeit up- oder downgraden. Es ist außerdem möglich, WSL1- und WSL2-Distributionen nebeneinander auszuführen. Um Docker-Container in Windows über WSL auszuführen, sollten Sie allerdings WSL2 aktivieren.
Um die Installation von WSL zu prüfen und zu verwalten, steht das Tool "wsl" in der Befehlszeile zur Verfügung. Um sicherzustellen, dass die Version 2 des WSL Verwendung findet, geben Sie den Befehl wsl --set-default-version 2 ein.
Ebenfalls hilfreich ist das Tool "wslconfig". Auch das findet beim Einsatz von Containern Verwendung. Das Werkzeug bietet verschiedene Parameter, mit denen Sie grundlegende Verwaltungsaufgaben in WSL durchführen:
- "/l" listet registrierte Distributionen auf.
- "/l /all" führt optional registrierte Distributionen auf, einschließlich der Distributionen, die gerade installiert oder deinstalliert werden.
- "/l /running" zählt nur die Distributionen auf, die momentan laufen.
- "/s" legt die Distribution als Standard fest.
- "/t" beendet die Distribution.
- "/u" hebt die Registrierung der Distribution auf.
Eine Liste der aktuellen Distributionen und deren Status zeigen Sie mit dem Befehl wsl --list -verbose an. Dadurch überprüfen Sie, ob die Distribution, die sie für den Container-Betrieb nutzen, auch als Version 2 konfiguriert ist. Um eine Linux-Distribution, zum Beispiel Ubuntu, im Nachhinein auf WSL2 umzustellen, können Sie ebenfalls das Tool "wsl" verwenden:
wsl --set-version Ubuntu 2
Wenn beim ersten Aufrufen der Distribution eine Fehlermeldung in der Art "Error: 0x80370102 The virtual machine could not be started because a required feature is not installed" erscheint, liegt das daran, dass Hyper-V auf dem Computer nicht zur Verfügung steht oder sie die eingebettete Virtualisierung nicht aktiviert haben.
Docker mit WSL nutzen
Um Docker-Container auf einem Computer mit Windows 10 und WSL zu verwenden, laden Sie sich zunächst die kostenlose Container-Lösung "Docker Desktop for Windows" [2] herunter. Im Rahmen der Installation öffnet sich die Konfiguration von Docker. Hier aktivieren Sie die Option "Install required Windows components for WSL 2". Die Einstellungen lassen sich auch nachträglich über das Tray-Icon von Docker vornehmen.
Nach der Installation öffnen Sie das Docker-Icon im Tray-Bereich. Hier stehen verschiedene Menüpunkte zur Verfügung, darunter "Settings". Bei "General" sollte die Option "Use the WSL 2 based engine" aktiviert sein. Die Verwaltung von Docker unterliegt auch in Windows 10 einer Berechtigungsstruktur. Die Benutzer, die Docker verwalten sollen, müssen sich in der lokalen Benutzergruppe "docker-users" befinden. Die lokale Benutzerverwaltung rufen Sie mit lusrmgr.msc auf. Standardmäßig ist hier der Benutzer integriert, der Docker auf dem Rechner installiert hat. Zusätzlich sollten Sie überprüfen, ob der Systemdienst "Docker Desktop Service" gestartet ist.
Über den Menüpunkt "Ressources" wählen Sie bei "WSL Integration" aus, welche der installierten Distributionen für den Betrieb von Containern zum Einsatz kommen soll. Standardmäßig ist dies die erste installierte Distribution. Bei "Network" legen Sie fest, welches Subnetz Docker für seine Container nutzt und welche DNS-Server zum Einsatz kommen sollen.
Container mit WSL und Docker starten
Um Docker-Container zu starten, rufen Sie das Windows-Terminal oder die Eingabeaufforderung auf und lassen sich mit wsl -l -v die Distributionen anzeigen. Hier erscheint jetzt Docker, aber auch die installierten Distributionen. Um zum Beispiel Ubuntu zu verwenden, führen Sie Ubuntu mit dem Befehl wsl -d ubuntu aus und öffnen die Linux-Bash für die Distribution. Um Docker mit WSL zu testen, laden Sie sich einen Beispiel-Container herunter, etwa mit:
docker run -dp 80:80 docker/getting-started
Beim ersten Start findet Docker das Image lokal nicht und lädt es von Docker-Hub herunter. Einen weiteren Beispiel-Container, der Informationen über seinen Betrieb einblendet, starten Sie mit docker run hello-world. Auch hier werden die notwendigen Dateien und das Image für den Container automatisch heruntergeladen. Beim Download und Start von Containern erscheint teilweise eine Meldung der Windows-Defender-Firewall. Hier müssen Sie den Zugriff zulassen.
Wenn der Container ordentlich gestartet ist, geben Sie über einen Webbrowser auf dem Computer die Adresse "localhost" ein. Port 80 des Hosts wird Port 80 im Container zugeordnet. Der Beispiel-Container nutzt den Webserver nginx im Container. Er zeigt nach dem Aufrufen der Webseite auch gleich eine Anleitung für Docker an.
Den Container und Docker steuern Sie anschließend im Windows-Terminal, über die Eingabeaufforderung oder in der PowerShell über die Linux-Bash der Ubuntu-Distribution. Hier stehen die verschiedenen Befehle zur Verfügung, mit denen sich Container verwalten lassen.
Bild 2: Auch wenn die Windows-Firewall Alarm schlägt, lassen sich Container mit WSL und Docker in Ubuntu auf einem Windows-Server erstellen.
Docker und Container verwalten
In WSL können Sie nach der Installation weitere Container unter Ubuntu in Betrieb nehmen. Die installierte Docker-Version zeigen Sie mit docker -version an. Die Version sollte ohne Fehlermeldung gemeldet werden – falls doch, ist Docker nicht einsatzbereit.
Mit docker search <Bezeichnung> durchsuchen Sie den Docker Hub nach Images. Dazu sollte der Container-Host natürlich über eine Verbindung zum Internet verfügen. Um sich eine Liste aller Container auf einem Container-Host geben zu lassen, verwenden Sie den Befehl docker ps -a.
Die vorhandenen Images auf dem Container-Host listen Sie mit docker images auf. Die Anmeldung am Docker Hub nehmen Sie im Terminal über docker login vor. Mit docker inspect <ID> rufen Sie erweiterte Informationen für Container ab, nicht zuletzt die IP-Adresse des Containers.
Sie können natürlich auch eigene Images erstellen und bearbeiten, zum Beispiel auf Basis bestehender Container, die Sie wiederum mit docker ps -a anzeigen:
docker commit <ID> <Ordner>/<Container-Image>
Ein Beispiel wäre etwa:
docker commit 662f25d6d835 joos/joosimageweb
Neben dem Terminal können Sie Container in WSL auch über die grafische Oberfläche von Docker-Desktop verwalten. Hier sind bei "Container/Apps" die gestarteten Container und deren Status zu sehen. Fahren Sie mit der Maus über den Container-Namen, zeigt Docker auf der rechten Seite Icons für die Steuerung des Containers an.
Über die Icons wechseln Sie in die CLI des Containers, starten ihn neu oder beenden oder löschen diesen. Klicken Sie auf einen Container, können Sie sich auch die Logs anschauen. Über den Menüpunkt "Inspect" erhalten Sie die Informationen, die sich ebenso mit docker inspect <ID> auf den Screen bringen lassen. Bei "Stats" sind Ressourcenverbräuche des Containers zu sehen.
Bild 3: Container lassen sich mit Docker auch in der grafischen Oberfläche verwalten.
Kubernetes mit WSL nutzen
Arbeiten Sie mit Docker Desktop für Windows, können Sie in den Einstellungen auch einen Kubernetes-Cluster aktivieren. Das ermöglicht die Entwicklung von Linux-Containern und die Verwaltung mit Kubernetes. Bei der Aktivierung werden die Kubernetes-Tools installiert. Mit diesen verwalten Sie den lokalen Kubernetes-Cluster, aber auch externe Cluster im Netzwerk.
In den Einstellungen, die Sie über das gleichlautende Icon in Docker Desktop erreichen, klicken Sie dazu auf "Kubernetes". Zur Aktivierung verwenden Sie "Enable Kubernetes" und auf Anforderung auch gleich "Deploy Docker Stacks to Kubernetes by default". Danach erstellen Sie mit "Apply & Restart" den Kubernetes-Cluster. Sollte dieser nicht mehr funktionieren, können Sie ihn mit der Schaltfläche "Reset Kubernetes Cluster" zurücksetzen.
Nach dem Erzeugen des Clusters ist Kubernetes über den Menüpunkt "Kubernetes" im Kontextmenü verfügbar.
Zur Installation des Kubernetes-Clusters gehört das Tool "kubectl". Damit administrieren Sie Kubernetes lokal und über das Netzwerk. Hier stehen die verschiedenen Befehle zur Verfügung, mit denen Sie Container über Kubernetes verwalten. Auch die Administration des Kubernetes-Clusters ist über diesen Weg möglich.
Mit kubectl lassen sich mit kurzen Befehlen die notwendigen Informationen zu einem Cluster anzeigen. Mit kubectl cluster-info prüfen Sie etwa, ob der Endpunkt des Clusters funktioniert und zeigen die IP-Adresse des Clusters an. Weitere Befehle, mit denen sich ein schneller Überblick gewinnen lässt, sind:
- Kubectl get services: Dienste im Namensraum
- Kubetcl get pods --all-namespaces: Alle Pods in allen Namensräumen
- Kubectl get pods -o wide: Erweiterte Informationen zu den Pods im allgemeinen Namensraum
- Kubectl get deployment <Deployment>: Informationen zu einem bestimmten Deployment
- Kubectl get pods: Pods im aktuellen Namensraum
- Kubectl get nodes: Knoten im Cluster
Neben einfachen Informationen, die sich so anzeigen lassen, bringen Sie mit kubectl describe für verschiedene Objekte weitere Informationen auf den Bildschirm. Der Befehl kubectl describe nodes zeigt ausführlichere Daten zu den Knoten an. Wer im Cluster sehr viele Pods im Einsatz hat und nur die Pods sehen will, die aktuell den Status "Running" haben, verwendet folgende Eingabe:
kubectl get pods --field-selector=status.phase=Running
Wollen Sie alle Pods in allen Namensräumen mit dem Status "Running" auflisten, erweitern Sie den Befehl noch mit der Option "--all-namespaces".
Entwickeln mit Docker und WSL
Um Anwendungen für Docker zu entwickeln, die sich dann mit WSL betreiben lassen, sind Visual Studio Code und Visual Studio mögliche Werkzeuge. Für die Entwicklung bietet Microsoft auch die Erweiterung "Remote – WSL" [3]. Mit ihr konzipieren Sie Anwendungen für Container, die Sie wiederum mit WSL über Windows bereitstellen können. Die Erweiterung ist über VSCode nutzbar. Zu­sätzlich bietet Microsoft die Erweiterung "Remote – Containers" [4] an. Auch diese ist zusammen mit WSL einsetzbar.
Cluster mit Docker Swarm
Alternativ oder parallel zu Kubernetes können Sie Container-Hosts auf Basis von Windows mit Docker Swarm zu einem Cluster zusammenfassen. In einer solchen Konfiguration ist es möglich, Container zwischen Container-Hosts mit Windows Server 2019 und Windows 10 zu verschieben. Zur Erstellung verwenden Sie das Tool "docker" in Windows.
Für die Kommunikation im Netzwerk benötigen Sie einige Firewallregeln, die Sie in der Windows-Firewall anlegen müssen: Die Kommunikation für die Ports 2377, 7946, 4789 muss für UDP und TCP zwischen den Container-Hosts freigeschaltet sein. Um in Windows Docker Swarm zu erstellen, verwenden Sie folgende Befehle:
docker swarm join --token <Join-Token> <IP-Adresse des Hosts>
docker swarm init --advertise-addr=<IP-Adresse des Hosts> --listen-addr <IP-Adresse des Hosts>:2377
Das könnte dann etwa so aussehen:
docker swarm join --token SWMTKN-1-35yiqpp8hm5bypthomo0u6ip7h5mlxprneuvzeqy5c6mm5rke5-8dsgejlbdnte9iiqd4kiehkx8 192.168.178.244:2377
docker swarm init --advertise-addr=192.168.178.244 --listen-addr 192.168.178.244:2377
Bild 4: Für Entwickler lässt sich Kubernetes auch auf Windows-10-Rechnern installieren.
Fazit
Linux-Container lassen sich in Windows-Netzwerken auch mit Windows Server 2019 und Windows 10 bereitstellen. Damit Container produktiv zum Einsatz kommen können, muss natürlich die Leistung passen. Hier ist es sinnvoll, auf Version 2 des Windows-Subsystem for Linux zu setzen. Dieses steht aktuell für Windows 10 und für Windows Server 2004 und neuer zur Verfügung.
Entwickler und Administratoren können in Windows 10 Pro und Windows 10 Enterprise eine vollwertige Umgebung mit Linux-Containern, inklusive eines Kubernetes-Clusters, bereitstellen. Die Kubernetes-Tools stehen vollumfänglich in Windows 10 zur Verfügung und ermöglichen die Verwaltung von weiteren Clustern im Netzwerk.
Container in dieser Umgebung lassen sich natürlich auch auf andere Container-Hosts verschieben. Für die Entwicklung von Anwendungen, die in Linux-Containern arbeiten, ist WSL ideal, da keine zusätzliche VMs erstellt werden müssen. Die Container lauen unter Windows über WSL direkt in der Linux-Distribution und sind über deren Werkzeuge verwaltbar.
(ln)
Link-Codes
[1] Direkt-Download des "WSL2 Linux kernel update package for x64 machines": https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi/