Entwicklungumgebung: Windows 11 + WSL 2 + Docker

Nachdem ich die letzten Jahre mit macOS unterwegs war, bei dem das Zusammenspiel mit Docker schon immer eine große Hürde dargestellt hat – eine Hürde, die mit dem Wechsel von x64 zu arm64 eher noch größer geworden ist – war ich nun wieder auf der Suche nach einer Plattform, auf der ich große Projekte ohne Probleme mit Docker betreiben kann, ohne den Code umständlich mit Mutagen zu synchronisieren.

Was die gesamten Tools betrifft, wäre Linux hier klar die Präferenz, aber ich habe auf dem Desktop noch keine Distribution gefunden, deren grafische Oberfläche mir zusagt. Zudem wird zwingend ein E-Mail-Programm benötigt, das gut mit Exchange umgehen kann. Thunderbird mit Plugins bzw. Evolution sind an dieser Stelle einfach zu hässlich – und noch dazu langsam. Die Alternative, die ganze Zeit einen Browsertab mit der Weboberfläche offen zu haben, kommt für mich auch nicht infrage.

Die erste Version von WSL hatte ihre Tücken und war nicht gerade schnell – es sei denn, man half mit den gleichen Tricks wie bei macOS nach, um die Performanceprobleme mit der Dateisynchronisation in den Griff zu bekommen.

WSL 2 ist an dieser Stelle um einiges schneller, vor allem was die Integration von Docker betrifft. Solange sich der Code innerhalb der WSL-Umgebung befindet und nicht vom Hostsystem gemountet wird, ist die Geschwindigkeit nahezu mit einer nativen Linux-Installation vergleichbar. Im Gegensatz zu nativem Linux sind HiDPI-Displays jedoch kein Problem, und mit Outlook steht auch ein ansehnlicher E-Mail-Client zur Verfügung.

Ich kann dieses Setup nur weiterempfehlen. Bisher habe ich nichts vermisst, was nur unter macOS oder nativem Linux möglich gewesen wäre – abgesehen von einem SSH-Agenten, der mir das ständige Eingeben der Passphrase für meine Keys abnimmt.

Caddy/Nginx + PHP XDebug Cookie Switch

Wenn man PHP mit XDebug Extension startet bringt dies trotz der Verbesserungen von Version 3 immer noch einen gewissen Overhead mit sich, welcher sich auf jeden Request auswirkt, der an PHP-FPM gesendet wird.

Zum aktivieren von XDebug über den Browser wird üblicherweise das Cookie XDEBUG_SESSION verwendet, auf welches man in der Konfiguration prüfen und die Requests an die jeweiligen PHP-FPM Ports, Sockets oder Docker-Container umleiten kann.

Im Beispiel verwende ich zwei unterschiedliche Docker-Container. Dies ist ein mal der Container php ohne XDebug und der Container php_debug mit geladener XDebug Erweiterung.

Beispiel Caddy

Im Caddyfile werden bei einem normalen Setup alle Anfragen direkt an PHP-FPM weiterleitet:

route {
    # ... your config
    php_fastcgi php:9000
}

Dies wird nun ergänzt durch einen so genannten Matcher welcher prüft, ob das Cookie XDEBUG_SESSION vorhanden ist.
Somit wird daraus:

route {
    # ... your config
    @xdebug {
        header_regexp xdebug_cookie Cookie XDEBUG_SESSION
    }

    php_fastcgi @xdebug php_debug:9000
    php_fastcgi php:9000
}

Beispiel Nginx

Bei Nginx funktioniert das Wechsel über map und die Prüfung auf genaue Übereinstimmung auf den Wert des Cookies. Überlicherweise steht in dem Cookie der Wert PHPSTORM.

server {
    # ... your config
    fastcgi_pass  php:9000;
}

Das Mapping kann nach belieben irgendwo in der Nginx Config eingebunden werden z.B. in /etc/nginx/conf.d/xdebug.conf und sieht folgendermaßen aus:

map $cookie_XDEBUG_SESSION $php_fastcgi_pass {
    default php:9000;
    PHPSTORM php_debug:9000;
}

Die Konfiguration vom vHost wird dann entsprechend angepasst:

server {
    # ... your config
    fastcgi_pass  $php_fastcgi_pass;
}

Docker + Windows Subsystem for Linux (WSL)

Bisher musste man, um von der WSL Umgebung auf Docker zuzugreifen, dieses immer doppelt installieren und danach die Environment Variable DOCKER_HOST=tcp://127.0.0.1:2375 setzen.

Was dies betrifft gibt es gute Neuigkeiten.
Mit dem Update auf 1803 kann das WSL unter Windows 10 auch Windows Binaries ausführen.

D.h. Docker muss nicht mehr doppelt installiert werden. Man kann jetzt die Dateien der Windows installation verwenden. Damit dies ohne den Anhang .exe funktioniert, erstellt man am besten Symlinks.

sudo ln -s "/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe" /usr/local/bin/docker
sudo ln -s "/mnt/c/Program Files/Docker/Docker/resources/bin/docker-compose.exe" /usr/local/bin/docker-compose

Wer Docker an einem anderen Ort installiert hat benutzt einfach which docker.exe und bekommt den richtigen Ordner für den symbolischen Link.