Dev Container in der WSL ohne Docker Desktop

Vorbereitung

Info: Diese Anleitung gilt nur für Windows 11 und der WSL in Version 0.67.6 oder höher. Ich habe dieses Vorgehen mit Ubuntu als auch Debian als WSL Distribution getestet.

Visual Studio Code, die Remote Erweiterung und die Dev Container Erweiterung muss unter Windows bereits installiert sein.

Wir starten mit einer neuen und blanken Ubuntu WSL:

wsl --install Ubuntu

Der Modus für die Linux Distribution in der WSL muss auf Version 2 gestellt sein, sonst wird Docker nicht funktionieren.
Eine Übersicht der vorhandenen Distributionen und deren Version erhält man mit:

wsl --list --all --verbose

Mit folgendem Befehl kann dieser Modus gesetzt werden:

wsl --set-version Ubuntu 2

In Ubuntu muss noch ein Nutzer mitsamt Kennwort angelegt werden.
Um dann noch sicher zu stellen, dass alles auf dem aktuellen Stand ist:

sudo apt-get -y update && sudo apt-get -y clean && sudo apt-get -y upgrade && sudo apt-get -y autoremove --purge

Jetzt sollte alles soweit vorbereitet sein und wir kommen zum eigentlichen.

Docker installieren

Im Groben folgen wir der Anleitung von Docker selbs:
https://docs.docker.com/engine/install/ubuntu/

Nicht immer nötig, aber es kann sicher nicht schaden alle vorherigen Docker Versionen zu entfernen:

for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

Um die Sache einfach zu halten kann die Installation auch mit den "convenience scripts" durchgeführt werden:

Info: Unter Debian kann es sein, dass curl nicht installiert ist. Dies kann man mit sudo apt install curl beheben.

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh

Info: Um zu prüfen was das Skript machen wird kann man es auch mit sudo sh ./get-docker.sh --dry-run ausführen. Dabei werden keine Änderungen am System vorgenommen.

Docker sollte jetzt installiert sein aber es sind noch ein par Kleinigkeiten zu erledigen.

Nacharbeiten

Es kann vorkommen, dass die Gruppe docker nicht angelegt wurde. Dies gilt es zu beheben:

sudo groupadd docker

Jetzt fehlt nur noch den eigenen Nutzer zu dieser Gruppe hinzuzufügen:

sudo usermod -aG docker $USER

Um Docker lauffähig zu bekommen muss systemd verfügbar sein. Dazu muss in der /etc/wsl.conf folgender Inhalt vorhanden sein:

[boot]
systemd=true

Info: Zum bearbeiten der Datei: sudo vi /etc/wsl.conf ESC i. Den text einfügen. Zum Speichern: ESC :wq Enter.

Um diese Änderungen zur Wirkung zu verhelfen muss die WSL neu gestartet werden. Dazu in einer belibigen Kommandozeile außerhalb der WSL diesen Befehl absetzen:

wsl --shutdown

Obacht: dadurch werden alle aktiven WSL Instanzen neu gestartet!

Ob Docker jetzt richtig funktioniert kann schnell überprüft werden:

docker version

Das Ergebnis sollte in Etwa so aussehen:

Client: Docker Engine - Community
 Version:           24.0.4
 API version:       1.43
 Go version:        go1.20.5
 Git commit:        3713ee1
 Built:             Fri Jul  7 14:51:00 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          24.0.4
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.5
  Git commit:       4ffc614
  Built:            Fri Jul  7 14:51:00 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.21
  GitCommit:        3dce8eb055cbb6872793272b4f20ed16117344f8
 runc:
  Version:          1.1.7
  GitCommit:        v1.1.7-0-g860f061
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

DevContainer in der WSL nutzen

Zum Test legen wir in der WSL einen Ordner an und öffnen diesen in Visual Studio Code:

mkdir test
cd test/
code .

Dadurch wird, beim ersten Mal, der Visual Studio Code Server in der WSL Distro installiert. Daraufhin wird der Ordner in Visual Studio Code unter Windows geöffnet.

Info: Man kann auch den Ordner über Visual Studio Code und dessen Remote WSL Erweiterung öffnen.

Jetzt kann man einen neuen Dev Container anlegen: CTRL + SHIFT + P -> "Add Dev Container Configuration Files".
Ist der Container angelegt fragt Visual Studio Code ob man diesen alsgleich öffnen möchte.

Hat bis hier alles funktioniert läd Docker die Images und der Dev Container wird geöffnet.

DevContainer aus Windows nutzen

Wine Kleinigkeit ist noch nötig um die Dev Container auch aus Windows heraus direkt nutzen zu können.

Folgende Einstellungen sollten in den Visual Studio Code Settings noch gesetzt werden:

Dev Containers: Execute In WSL wird aktiviert.

Sollte man mehrere WSL Distros im Einsatz haben oder sicher gehen wollen, dass immer die richtige verwendet wird trägt man unter Dev Containers: Execute In WSLDistro noch den Name der gewünschten Distro.

Man kann diese Werte auch wie folgt in die Konfiguration als json eintragen:

"dev.containers.executeInWSL": true
"dev.containers.executeInWSLDistro": "Debian"

Hat man das getan funktionieren die Kommandos für Dev Container auch in einem unter Windows gestartetem Visual Studio Code.

Quellen

Install docker using the convenience script
Linux post-installation steps for Docker Engine
Running Docker on WSL2 without Docker Desktop (the right way)