post-image

Docker Desktop / WSL2 Integration


Docker Desktop für Windows ist schon eine vergleichsweise lange Zeit verfügbar. Der Standardweg war lange Zeit die Realisierung über eine Hyper-V-VM, was vor allem zu performancetechnischen Einbußen geführt hat. Aber auch Funktional gab es häufige Probleme, etwa mit Volume Mounts.

Mit dem Release des Windows Subsystem for Linux 2 (WSL2) eröffnet Docker Desktop eine neue Option: Die Integration mit einem in eben diesem WSL laufenden Docker Daemon. Das sorgt nicht nur für deutlich verbesserte Performance, sondern ermöglicht auch die Nutzung parallel auf dem Host sowie innerhalb des WSL.

Installation

Die Docker-WSL-Integration setzt ein WSL2 und damit mindestens Windows Version 2004 (oder eine entsprechende Insider Preview auf dem Fast oder Slow Ring) voraus.

Docker for Desktop kann entweder manuell heruntergeladen, oder über Chocolatey installiert werden:

choco install docker-desktop

Nun muss in den Docker Einstellungen die WSL2-Integration aktiviert werden:

Aktivierung der WSL2-Integration

Diese kann neben der Standard Linux Distribution auch einzeln für weitere, eventuell vorhandene Installationen vorgenommen werden.

Dedizierte Aktivierung für installierte Distributionen

Sollte kein Distribution zu Auswahl stehen so kann man die WSL Version der Distributionen überprüfen:

wsl -l -v
  NAME                   STATE           VERSION
  docker-desktop         Running         2
  docker-desktop-data    Running         2
* Debian                 Running         2
  Ubuntu                 Stopped         1

Und diese bei Bedarf auf eine höhere Version updaten:

 wsl --set-version Ubuntu 2

Interoperabilität

Nun kann die Docker Engine auf Basis des WSL2 genutzt werden. Sowohl der Host als auch die entsprechenden integrierten Linux Gastsysteme nutzen dabei dasselbe Docker Backend.

Im folgenden Beispiel wird erst ein Docker Container gestarted (oben). Dann werden die laufenden Container sowohl unter Windows (mitte) als auch unter Linux WSL2 (unten) aufgelistet:

Docker Container Start (oben), Container unter Windows (mitte), Container unter Linux WSL2 (unten)

Linux und Windows Container

Das geteilte Backend funktioniert natürlich nur, wenn mit Containern auf Linux-Basis gearbeitet wird. Kommen Windows-Container zum Einsatz, sind diese wie gehabt nur unter Windows verfügbar. Das Starten eines Windows-Containers schlägt also zunächst fehl:

Windows Container innerhalb des WSL2-basierten Daemons

Um Windows-Container zu nutzen muss Docker umgestellt werden - das allerdings funktioniert vollkommend transparent im Kontextmenü von Docker.

Aktivierung von Windows Containern

Nun liefert ein Aufruf von docker ps alle Windows-Container - Docker innerhalb des WSL ist von dieser Umstellung nicht betroffen.

Aktive Windows Container

Reservierte Port Ranges

Achtung - Windows hat gewisse Port-Ranges reserviert, diese können daher nicht für das Portforwarding von Containern genutzt werden. Grundsätzlich ist das kein Problem, da man vom Docker Daemon wie unter Linux auf das Problem aufmerksam gemacht wird:

C:\Program Files\Docker\Docker\resources\bin\docker.exe: Error response from daemon: Ports are not available: listen tcp 0.0.0.0:3000: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

Problematisch ist, dass dieses Problem verschluckt wird, sobald man die Container innerhalb des WSL startet. Der Container startet hier wie gewohnt und läuft auch problemlos an, ist dann allerdings unter dem angegeben Port nicht erreichbar! Die reservierten Ports können folgendermaßen eingesehen werden:

netsh interface ipv4 show excludedportrange protocol=tcp

* Quelle Titelbild: https://www.docker.com/company/newsroom/media-resources, https://news.microsoft.com/imagegallery/?filter_cats%5B%5D=2333&filter_cats%5B%5D=

Zurück