#1: Docker development mit WSL 2 in Windows und VSCode

Ich befasse mich schon länger mit der Entwicklung von Docker images, ein wenig davon habe ich hier mal beschrieben. Früher habe ich das in einer VirtualBox VM gemacht, später mit Docker Desktop und der git bash die ich in Visual Studio Code (VSCode) eingebunden habe. Das hat schon ganz gut funktioniert, nun folgt aber der nächste Evolutionsschritt: Mit Windows 10 in der Version 2004 ist das Windows Subsystem für Linux (WSL) in der Version 2 released. Dies ermöglicht mir das hochfahren einer echten Linux Umgebung in Windows. Besonders ist hier aber, das “Docker Desktop” die WSL2 nativ verwenden kann, um Linux Images zu bauen und davon instanziierte Container zu betreiben.

Installation von Docker Desktop

Als erstes lädst du Dir Docker-Desktop von hier herunter und startest den “Installer” der dich während der Installation fragt, ob du das WSL 2 Feature installieren willst. Das sollte jetzt bestätigt werden.

Docker Desktop Installer

Nach einem Neustart ist die Installation von Docker Desktop schon abgeschlossen.

Konfiguration WSL2 und Docker

Leider bleibt es (wie immer) nicht bei einer einfachen Installation, ein bisschen was ist schon noch zu tun.

Bei der Installation vom WSL fordert MS euch auf, den Linux Kernel erstmal auf Stand zu bringen. Das bestätigt Ihr auf jeden Fall. Anschliessend gehts in den Windows Store, über den Ihr Linux WSL Image eurer Wahl installiert. Ich habe hier Alpine Linux verwendet. Neben der Tatsache das das echt klein ist mag ichs persönlich auch sehr gerne.

HINWEIS: In späteren Teilen dieser Artikelreihe installieren wir die Java Extension für Visual Studio Code. Diese funktionieren nur sehr schlecht auf Alpine. Ich vermute es liegt an dem verwendeten musl-C Bibliotheken in Alpine. glibc mit allen Abhängigkeiten zu installieren und ggf. noch weitere Anpassungen zu machen, wäre aber unverhältnismäßig viel Aufwand und würde den Footprint ohnehin massiv erhöhen. Aus diesem Grund bin ich in späteren Artikeln auf Debian Linux gewechselt. Nichtsdestotrotz ist dieser Artikel auch bei Einsatz von Debian voll anwendbar.

Wollt Ihr Java Entwicklung betreiben, nutzt also unbedingt Debian (oder gerne auch andere Distributionen, von Debian kann ich aber sagen dass es funktioniert). Natürlich ist auch der Einsatz von 2 Distributionen parallel möglich.

Alpine Linux WSL Installation

Nach der Installation und Beantwortung aller Fragen, ist das WSL in der Version 1 installiert. Docker Desktop mag aber gerne mit einer Version 2 reden. Das ist aber soweit kein Problem. Ihr startet irgendeine Konsole eurer Wahl und listet mal die verfügbaren Pinguine mit “wsl -l -v" auf.

Nun könnt Ihr euer Linux mit “wsl --set-version <Name der Distribution> 2” auf die Version 2 umstellen.

Die laufenden WSLs

Nutzt Ihr Alpine muss auch für Docker Desktop glibc nachinstalliert werden. Folgende Konfiguration behebt dieses kleine Problem. Vielen Dank an sgerrand dafür.

su
wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.32-r0/glibc-2.32-r0.apk
apk add glibc-2.32-r0.apk
exit

Ist das erledigt, wird die Docker Desktop UI gestartet.

Unter Configuration -> Resources -> WSL integration könnt Ihr nun eure Distribution aktivieren. Nicht vergessen auf “Apply and Restart” zu klicken. Nach Neustart der WSL sollte nun der Zugriff auf Docker funktionieren. Selbstverständlich muss der Zusatz “sollte” hier ernst genommen werden. Eine Kleinigkeit kann noch passieren, nämlich die, dass Docker Desktop irgendwie nicht den socket gemountet bekommt. Diese Verhalten habe ich ebenfalls nur unter Linux Alpine beobachten können. Unter Debian ist der socket vorhanden, sobald Docker Desktop gestartet wird.

Dies lässt sich aber zum Glück ebenfalls recht leicht nachholen:

su
ln -sf /mnt/wsl/docker-desktop/shared-sockets/guest-services/docker.sock /var/run/docker.sock
chown admin:admin /var/run/docker.sock
exit

Den Usernamen und die Gruppe “admin” beim “chown” müsst Ihr natürlich durch den von euch konfigurierten tauschen. Ist euch nun der Tech-Gott wohl gesonnen, sollte der Aufruf von “docker run -d -p 80:80 docker/getting-started” in der WSL ein docker image herunterladen und instanziieren. Weiterhin sollte dies in der Docker-Desktop Oberfläche sichtbar werden.

Konfiguration von VSCode

Als erstes braucht Ihr VSCode in Windows. Also installiert Ihr das und schiebt anschließend die Extension “Remote – WSL” nach. Dann könnt Ihr VSCode erstmal wieder schließen.

Nun braucht die “Remote – WSL” extension leider wieder ein bisschen was an Software im Alpine Linux Image (Nicht notwendig in Debian). Betretet also euer Alpine WSL und installiert libstdc++ wie folgt nach:

su
apk update && apk add libstdc++
exit

Nun könnt Ihr auch schon VSCode direkt aus der WSL starten. Nutzt dafür den Befehle “code” und hängt euerer Arbeitsverzeichnis hinten an.

code /mnt/c/Users/MyUserName/Documents/Development/MyProject

wenn euch das Kommandozeilen getippel nervt, dann legt einen Link auf eurem Desktop mit folgenden Kommando an:

wsl –distribution <Name der Distribution> –user admin code /mnt/c/Users/MyUserName/Documents/Development/MyProject

Dieses Link könnt Ihr nun auch via Rechtsklick wunderbar in eurer Startmenü oder die Superbar aufnehmen (und den Desktop Link danach auch wieder löschen).

Last but not least, könnt Ihr VSCode auch einfach starten und euch über den grünen Button unten links verbinden.

Extensions installieren

Nachdem VSCode gestartet ist, könnt Ihr die extensions die Ihr lokal installiert habt auch mit einem simplen Klick im WSL installieren. VSCode zeigt hier schön übersichtlich an, welche Extension Lokal oder im WSL installiert ist.

Übertragen von WSL Images

Grade im Projekt mit mehreren Personen spielt WSL seine Stärke aus. Ihr konfiguriert nun ein Image (natürlich auch mit der gesamten VSCode Konfiguration), exportiert dieses und könnt die exportierte Datei euren Projektkollegen/Innen wieder zur Verfügung stellen.

Export

wsl --export Debian C:\Users\<Username>\Documents\Development\debian.tar

Import

wsl --import Debian_Smarthome C:\Users\<Username>\.wsl\Debian_Smarthome C:\Users\<Username>\Documents\Development\debian.tar --version 2

Natürlich lässt sich WSL somit auch super in jedes beliebige Configuration Management System einbinden. Weitere Infos zur WSL findest in der Commandline mit “wsl –help”. Willst du die gleiche Distribution noch mal frisch installieren, ohne die bisherige zu löschen, kannst du wie folgt vorgehen:

  • Exportiere Dir ein Image.
  • Lösche dieses dann mit “–unregister”.
  • Importiere das Image unter einem neuen Name .
  • Starte nun die gleiche Distribution aus dem Windows Store um ein frisches Image zu erhalten.

Natürlich kannst du auch jedes Images mehrfach mit verschiedenen Namen importieren.

Fazit

Ich hoffe der Artikel gefällt euch und spart ein wenig Lebenszeit. Mit dieser Lösung könnt Ihr nun ganz schick und mit wenig Aufwand aus Windows heraus direkt in eurem Lieblingspinguin in einer WSL Umgebung mit VSCode Docker Images bauen. Lasst mir ein Comment da und erzählt ob Ihr es brauchen konntet.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.