Erste Schritte mit Docker-Remotecontainern unter WSL 2

Diese schrittweise Anleitung hilft Ihnen bei den ersten Schritten bei der Entwicklung mit Remotecontainern, indem Sie Docker Desktop für Windows mit Windows-Subsystem für Linux Version 2 (WSL 2) einrichten.

Docker Desktop für Windows bietet eine Entwicklungsumgebung zum Erstellen, Liefern und Ausführen von dockerisierten Apps. Durch Aktivieren des WSL 2-basierten Moduls können Sie sowohl Linux- als auch Windows-Container in Docker Desktop auf demselben Computer ausführen. (Docker Desktop ist für den privaten Gebrauch und kleine Unternehmen kostenlos. Informationen zu den Preisen für Pro, Team oder Business finden Sie in den häufig gestellten Fragen auf der Docker-Website).

Hinweis

Wir empfehlen die Verwendung von Docker Desktop aufgrund der Integration in Windows und das Windows-Subsystem für Linux. Docker Desktop unterstützt zwar die Ausführung von Linux- und Windows-Containern, Sie können jedoch nicht beide gleichzeitig ausführen. Um Linux- und Windows-Container gleichzeitig auszuführen, müssen Sie eine separate Docker-Instanz in WSL installieren und ausführen. Wenn Sie Container gleichzeitig ausführen müssen oder einfach nur ein Containermodul direkt in Ihrer Linux-Distribution installieren möchten, befolgen Sie die Linux-Installationsanweisungen für diesen Containerdienst, z. B Installieren des Docker-Moduls unter Ubuntu oder Installieren von Podman zum Ausführen von Linux-Containern.

Übersicht über Docker-Container

Docker ist ein Tool zum Erstellen, Bereitstellen und Ausführen von Anwendungen mithilfe von Containern. Mithilfe von Containern können Entwickler eine App mit allen benötigten Komponenten (Bibliotheken, Frameworks, Abhängigkeiten usw.) packen und alles als ein Paket bereitstellen. Durch die Verwendung eines Containers wird sichergestellt, dass die App unabhängig von angepasstem Einstellungen oder zuvor installierten Bibliotheken auf dem Computer unverändert ausgeführt wird, auch wenn es sich um einen anderen Computer handelt als der zum Schreiben und Testen des App-Codes verwendete. Dadurch können sich Entwickler auf das Schreiben von Code konzentrieren, ohne sich Gedanken über das System machen zu müssen, auf dem der Code ausgeführt wird.

Docker-Container ähneln virtuellen Computern, erstellen aber kein vollständiges virtuelles Betriebssystem. Stattdessen ermöglicht Docker der App die Verwendung desselben Linux-Kernels wie das System, auf dem sie ausgeführt wird. Dadurch benötigt das App-Paket nur noch die nicht auf dem Hostcomputer verfügbaren Komponenten. Dies verringert die Paketgröße und verbessert die Leistung.

Kontinuierliche Verfügbarkeit durch die Verwendung von Docker-Containern mit Tools wie Kubernetes ist ein weiterer Grund für die Beliebtheit von Containern. Dadurch können mehrere Versionen des App-Containers zu unterschiedlichen Zeitpunkten erstellt werden. Anstatt ein gesamtes System für Updates oder Wartungsmaßnahmen offline schalten zu müssen, können alle Container (und die jeweiligen Microservices) ohne Unterbrechung ersetzt werden. Du kannst einen neuen Container mit all deinen Updates vorbereiten, den Container für die Produktion einrichten und erst dann auf den neuen Container verweisen, wenn er bereit ist. Du kannst auch verschiedene Versionen deiner App mithilfe von Containern archivieren und bei Bedarf als Sicherheitsfallback ausführen.

Weitere Informationen finden Sie unter Einführung in Docker-Container.

Voraussetzungen

Weitere Informationen finden Sie in der Docker-Dokumentation: Systemanforderungen zum Installieren von Docker Desktop unter Windows.

Informationen zum Installieren von Docker auf Windows Server finden Sie unter Erste Schritte: Vorbereiten von Windows für Container.

Hinweis

WSL kann Distributionen sowohl im WSL 1-Modus als auch im WSL 2-Modus ausführen. Du kannst dies überprüfen, indem du PowerShell öffnest und Folgendes eingibst: wsl -l -v. Stellen Sie sicher, dass Ihre Distribution auf die Verwendung von WSL 2 festgelegt ist, indem Sie Folgendes eingeben: wsl --set-version <distro> 2. Ersetzen Sie <distro> durch den Namen der Distribution (z. B. Ubuntu 18.04).

In WSL-Version 1 konnte das Docker-Modul aufgrund grundlegender Unterschiede zwischen Windows und Linux nicht direkt in WSL ausgeführt werden, sodass das Docker-Team eine alternative Lösung mit Hyper-V-VMs und LinuxKit entwickelte. Da WSL 2 jetzt jedoch auf einem Linux-Kernel mit voller Systemaufrufkapazität ausgeführt wird, kann Docker vollständig in WSL 2 ausgeführt werden. Dies bedeutet, dass Linux-Container nativ ohne Emulation ausgeführt werden können, was zu einer höheren Leistung und besseren Interoperabilität zwischen Ihren Windows- und Linux-Tools führt.

Installation von Docker Desktop

Da das WSL 2-Back-End in Docker Desktop für Windows unterstützt wird, können Sie in einer Linux-basierten Entwicklungsumgebung arbeiten und Linux-basierte Container erstellen, während Sie Visual Studio Code zum Bearbeiten und Debuggen des Codes verwenden und Ihren Container im Microsoft Edge-Browser unter Windows ausführen.

So installieren Sie Docker (nach dem Installieren von WSL):

  1. Laden Sie Docker Desktop herunter, und befolgen Sie die Installationsanweisungen.

  2. Starten Sie nach der Installation Docker Desktop über das Windows-Startmenü, und wählen Sie dann im Menü mit den ausgeblendeten Symbolen auf der Taskleiste das Docker-Symbol aus. Klicken Sie mit der rechten Maustaste auf das Symbol, um das Menü mit den Docker-Befehlen anzuzeigen, und wählen Sie „Einstellungen“ aus. Docker Desktop: Dashboardsymbol

  3. Stellen Sie sicher, dass unter Einstellungen>Allgemein die Option „WSL 2-basiertes Modul verwenden“ aktiviert ist. Docker Desktop: Allgemeine Einstellungen

  4. Wählen Sie die installierte WSL 2-Distribution aus, für die Sie die Docker-Integration aktivieren möchten, indem Sie zu Einstellungen>Ressourcen>WSL-Integration wechseln. Docker Desktop: Ressourceneinstellungen

  5. Um zu bestätigen, dass Docker installiert wurde, öffnen Sie eine WSL-Distribution (z. B. Ubuntu), und zeigen Sie die Versions- und Buildnummer an, indem Sie Folgendes eingeben: docker --version

  6. Testen Sie die ordnungsgemäße Funktion der Installation, indem Sie ein einfaches integriertes Docker-Image ausführen: docker run hello-world

Tipp

Die folgende Liste enthält einige nützliche Docker-Befehle, die Sie kennen sollten:

  • Auflisten der in der Docker-Befehlszeilenschnittstelle verfügbaren Befehle: docker
  • Auflisten von Informationen zu einem bestimmten Befehl: docker <COMMAND> --help
  • Auflisten der Docker-Images auf deinem Computer (zu diesem Zeitpunkt nur das Hello-World-Image): docker image ls --all
  • Auflisten der Container auf Ihrem Computer mit docker container ls --all oder docker ps -a (ohne das Flag „-a“ – alle anzeigen – werden nur ausgeführte Container angezeigt)
  • Auflisten systemweiter Informationen zur Docker-Installation, einschließlich Statistiken und Ressourcen (CPU & Arbeitsspeicher), die im WSL 2-Kontext für Sie verfügbar sind, mit docker info

Entwickeln in Remotecontainern mit VS Code

Für die ersten Schritte beim Entwickeln von Apps mithilfe von Docker mit WSL 2 empfehlen wir die Verwendung von VS Code zusammen mit den WSL-, Dev Containers- und Docker-Erweiterungen.

  • Installieren Sie die VS Code-WSL-Erweiterung. Mit dieser Erweiterung können Sie Ihr in WSL ausgeführtes Linux-Projekt in VS Code öffnen (ohne sich Gedanken über Pfadprobleme, die Binärkompatibilität oder andere betriebssystemübergreifende Herausforderungen machen zu müssen).

  • Installieren Sie die VS Code-Dev Containers-Erweiterung. Mit dieser Erweiterung können Sie Ihren Projektordner oder Ihr Projektrepository in einem Container öffnen und sämtliche Features von Visual Studio Code nutzen, um Ihre Entwicklungsarbeiten innerhalb des Containers durchzuführen.

  • Installieren Sie die VS Code-Docker-Erweiterung. Diese Erweiterung fügt die Funktionalität zum Erstellen, Verwalten und Bereitstellen von containerisierten Anwendungen in VS Code hinzu. (Sie benötigen die Dev Containers-Erweiterung, um den Container als Entwicklungsumgebung zu verwenden.)

Im Folgenden verwenden wir Docker, um einen Entwicklungscontainer für ein vorhandenes App-Projekt zu erstellen.

  1. In diesem Beispiel verwende ich den Quellcode aus meinem „Hallo Welt“-Tutorial für Django in der Dokumentation zum Einrichten der Python-Entwicklungsumgebung. Sie können diesen Schritt überspringen, wenn Sie lieber Ihren eigenen Projektquellcode verwenden möchten. Um die HelloWorld-Django-Web-App von GitHub herunterzuladen, öffnen Sie ein WSL-Terminal (z. B. Ubuntu), und geben Sie Folgendes ein: git clone https://github.com/mattwojo/helloworld-django.git

    Hinweis

    Speichern Sie Ihren Code immer im selben Dateisystem, in dem Sie Tools verwenden. Dadurch erhalten Sie eine bessere Leistung beim Dateizugriff. In diesem Beispiel verwenden wir eine Linux-Distribution (Ubuntu) und möchten unsere Projektdateien im WSL-Dateisystem unter \\wsl\ speichern. Das Speichern von Projektdateien im Windows-Dateisystem würde den Zugriff erheblich verlangsamen, wenn Sie Linux-Tools in WSL verwenden, um auf diese Dateien zuzugreifen.

  2. Wechseln Sie in Ihrem WSL-Terminal in den Quellcodeordner für dieses Projekt:

    cd helloworld-django
    
  3. Geben Sie Folgendes ein, um das Projekt in der VS Code-Instanz zu öffnen, die auf dem lokalen Server mit der WSL-Erweiterung ausgeführt wird:

    code .
    

    Vergewissern Sie sich, dass Sie mit Ihrer WSL Linux-Distribution verbunden sind, indem Sie die grüne Remoteanzeige in der linken unteren Ecke Ihrer VS Code-Instanz überprüfen.

    VS Code: WSL-Remoteanzeige

  4. Geben Sie in der Befehlspalette von VS Code (STRG+UMSCHALT+P) Folgendes ein: Dev Containers: Öffnen Sie erneut in Container, während wir einen Ordner verwenden, der bereits mit der WSL-Erweiterung geöffnet wurde. Alternativ können Sie Dev Containers verwenden: Ordner in Container öffnen..., um einen WSL-Ordner mithilfe der lokalen \\wsl$ -Freigabe (von Windows-Seite) auszuwählen. Weitere Informationen finden Sie im Visual Studio Code-Schnellstart: Öffnen eines vorhandenen Ordners in einem Container. Wenn diese Befehle nicht angezeigt werden, während Sie mit der Eingabe beginnen, überprüfen Sie, ob Sie die oben verknüpfte Dev Containers-Erweiterung installiert haben.

    VS Code: Dev Containers-Befehl

  5. Wählen Sie den Projektordner aus, den Sie containerisieren möchten. In meinem Fall ist dies \\wsl\Ubuntu-20.04\home\mattwojo\repos\helloworld-django\.

    VS Code: Dev Containers-Ordner

  6. Es wird eine Liste von Containerdefinitionen angezeigt, da noch keine Entwicklungscontainerkonfiguration im Projektordner (Repository) vorhanden ist. Die angezeigte Liste mit Containerkonfigurationsdefinitionen ist basierend auf Ihrem Projekttyp gefiltert. Für mein Django-Projekt wähle ich Python 3 aus.

    VS Code: Dev Containers-Konfigurationsdefinitionen

  7. Eine neue Instanz von VS Code wird geöffnet, beginnt mit der Erstellung des neuen Images und startet nach Abschluss der Erstellung den Container. Wie Sie sehen, wird jetzt ein neuer Ordner .devcontainer mit Containerkonfigurationsinformationen in einer Dockerfile und einer Datei devcontainer.json angezeigt.

    VS Code: Ordner „.devcontainer“

  8. Um sicherzustellen, dass Ihr Projekt weiterhin mit WSL und innerhalb eines Containers verbunden ist, öffnen Sie das integrierte VS Code-Terminal (STRG+UMSCHALT+~). Überprüfen Sie das Betriebssystem, indem Sie uname eingeben, und die Python-Version, indem Sie python3 --version eingeben. Wie Sie sehen, wurde für „uname“ die Antwort „Linux“ zurückgegeben, d. h. Sie sind weiterhin mit dem WSL 2-Modul verbunden. Die Python-Versionsnummer basiert auf der Containerkonfiguration und unterscheidet sich möglicherweise von der Python-Version, die in Ihrer WSL-Distribution installiert ist.

  9. Um Ihre App mit Visual Studio Code im Container auszuführen und zu debuggen, öffnen Sie zuerst das Menü Ausführen (drücken Sie dazu STRG+UMSCHALT+D, oder wählen Sie die Registerkarte in der Menüleiste ganz links aus). Wählen Sie dann Ausführen und debuggen aus, um eine Debugkonfiguration auszuwählen, und wählen Sie die Konfiguration aus, die am besten für Ihr Projekt geeignet ist (in meinem Beispiel ist dies „Django“). Dadurch wird eine Datei launch.json im Ordner .vscode Ihres Projekts mit Anweisungen zum Ausführen Ihrer App erstellt.

    VS Code: Ausführen der Debugkonfiguration

  10. Wählen Sie in VS Code Ausführen>Debuggen starten aus (oder drücken Sie einfach die Taste F5). Dadurch wird ein Terminal in VS Code geöffnet, und ss sollte ein Ergebnis wie folgt angezeigt werden: "Starten des Entwicklungsservers bei http://127.0.0.1:8000/ Beenden des Servers mit CONTROL-C" Halten Sie die CTRL-Taste gedrückt, und wählen Sie die Adresse aus, die angezeigt wird, um Ihre App in Ihrem Standardwebbrowser zu öffnen, und sehen Sie, dass Ihr Projekt innerhalb des Containers ausgeführt wird.

    VS Code: Ausführen eines Docker-Containers

Sie haben nun erfolgreich einen Remoteentwicklungscontainer mit Docker Desktop konfiguriert, der vom WSL 2-Back-End unterstützt wird und in dem Sie mithilfe von VS Code programmieren, erstellen, ausführen, bereitstellen oder debuggen können.

Problembehandlung

WSL-Docker-Kontext veraltet

Wenn Sie eine frühe Technical Preview von Docker für WSL verwendet haben, verfügen Sie möglicherweise über einen Docker-Kontext namens „wsl“, der jetzt veraltet ist und nicht mehr verwendet wird. Sie können dies mit folgendem Befehl überprüfen: docker context ls. Sie können diesen wsl-Kontext zur Vermeidung von Fehlern mit dem Befehl docker context rm wsl entfernen, da Sie den Standardkontext sowohl für Windows als auch für WSL2 verwenden möchten.

Bei der Verwendung dieses veralteten wsl-Kontexts können z. B. folgende Fehler auftreten: docker wsl open //./pipe/docker_wsl: The system cannot find the file specified. oder error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_wsl/v1.40/images/json?all=1: open //./pipe/docker_wsl: The system cannot find the file specified.

Weitere Informationen zu diesem Problem finden Sie unter Einrichten von Docker im Windows-Subsystem für Linux (WSL2) unter Windows 10.

Probleme beim Ermitteln des Speicherordners für das Docker-Image

Docker erstellt zwei Distributionsordner zum Speichern von Daten:

  • \wsl$\docker-desktop
  • \wsl$\docker-desktop-data

Sie können diese Ordner finden, indem Sie Ihre WSL Linux-Distribution öffnen und explorer.exe . eingeben, um den Ordner in Windows-Datei-Explorer anzuzeigen. Geben Sie \\wsl\<distro name>\mnt\wsl ein, und ersetzen Sie <distro name> durch den Namen Ihrer Distribution (z. B. Ubuntu-20.04), um diese Ordner anzuzeigen.

Weitere Informationen zum Auffinden von Docker-Speicherorten in WSL finden Sie in diesem Problem aus dem WSL-Repository oder diesem StackOverflow-Beitrag.

Weitere Hilfe zur allgemeinen Problembehandlung in WSL finden Sie in der Dokumentation zur Problembehandlung.

Zusätzliche Ressourcen