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.
Tip für alle Mac und Linux User: Hier beschreibt Microsoft, wie du mit der neuen “DevContainer” Erweiterung statt der wsl auch einen Container verwenden kannst.
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.
Nach einem Neustart ist die Installation von Docker Desktop schon abgeschlossen.
Hinweis: Die Installation von Docker-Desktop ist nicht zwingend notwendig. Du kannst auch docker und docker-compose einfach manuell in deiner WSL installieren und konfigurieren. Mit Docker-Desktop werden dir die manuelle Konfigurationsschritte abgenommen und deine lokale (Power-)Shell mit den Docker-Tools ausgestattet. Zudem ist eine grafische Oberfläche ja auch nicht schlecht zu haben ;-).
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. Willst du die weiteren Artikel dieser Reihe nachvollziehen, ersetze also im folgenden Alpine bitte durch Debian.
Natürlich ist auch der Einsatz von 2 Distributionen parallel möglich.
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.
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. 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.
Selbstverständlich muss der hier bewusst häufig verwendete Zusatz “sollte” ernst genommen werden.
Mögliche Fehlerursachen
Ein paar Kleinigkeiten könenn noch passieren können. Mögliche Fehler die mir im Laufe der Zeit untergekommen sind, will ich diesen Kapitel beschreiben.
Docker Socket
Es kann vorkommen, dass Docker Desktop irgendwie nicht den docker.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.
Docker-credential-desktop.exe not installed
Diese Fehlermeldung kann in jeder Distribution aufschlagen und ist hier dokumentiert. Ein Workaround ist es, in der Datei “~/.docker/config.json” den Eintrag {“credsStore”:”desktop.exe”} mit einem Underline ungültig zu machen.
{"_credsStore":"desktop.exe"}
Firmenfirewall
Arbeitest du hinter einer Firmenfirewall und das “getting-started” funktioniert nicht? In dem Fall kann der Zugriff auf https://hub.docker.com/ geblockt sein. Probiers mal von zu Hause ohne VPN.
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.
Globe Telecom