Entwicklung auf einem Remote-Docker-Host
Manchmal möchten Sie vielleicht die Dev Containers-Erweiterung verwenden, um in einem Container zu entwickeln, der sich auf einem entfernten Server befindet. Docker unterstützt das Mounten (Binden) Ihres lokalen Dateisystems in einen entfernten Dev-Container nicht. Daher funktioniert das Standardverhalten von Visual Studio Code mit devcontainer.json, das Ihren lokalen Quellcode verwendet, nicht. Obwohl dies das Standardverhalten ist, behandeln wir in diesem Abschnitt die Verbindung zu einem entfernten Host, damit Sie entweder die Remote - SSH-Erweiterung verwenden können, um einen Ordner auf einem entfernten Host in einem Container zu öffnen, an einen beliebigen laufenden Container anhängen oder eine lokale devcontainer.json-Datei verwenden können, um einen entfernten Dev-Container über einen Socket zu konfigurieren, zu erstellen und eine Verbindung herzustellen.
Verbindung über die Remote - SSH-Erweiterung
Wenn Sie einen Linux- oder macOS-SSH-Host verwenden, können Sie die Erweiterungen Remote - SSH und Dev Containers zusammen verwenden. Sie benötigen nicht einmal einen Docker-Client lokal installiert. Um dies zu tun:
- Befolgen Sie die Installations- und SSH-Host-Setup-Schritte für die Remote - SSH-Erweiterung.
- Optional: Richten Sie eine SSH- schlüsselbasierte Authentifizierung zum Server ein, damit Sie Ihr Passwort nicht mehrmals eingeben müssen.
- Installieren Sie Docker auf Ihrem SSH-Host. Sie müssen Docker nicht lokal installieren.
- Befolgen Sie die Schnellstartanleitung für die Remote - SSH-Erweiterung, um eine Verbindung zu einem Host herzustellen und dort einen Ordner zu öffnen.
- Verwenden Sie den Befehl Dev Containers: In Container neu öffnen aus der Befehlspalette (F1, ⇧⌘P (Windows, Linux Ctrl+Shift+P)).
Der Rest des Dev Containers-Schnellstarts gilt unverändert. Weitere Informationen zur Remote - SSH-Erweiterung finden Sie in ihrer Dokumentation.
Verbindung über die Remote - Tunnels-Erweiterung
Sie können die Erweiterungen Remote - Tunnels und Dev Containers zusammen verwenden, um einen Ordner auf Ihrem entfernten Host in einem Container zu öffnen. Sie benötigen nicht einmal einen Docker-Client lokal installiert. Dies ist ähnlich wie im obigen SSH-Host-Szenario, verwendet jedoch stattdessen Remote - Tunnels. Um dies zu tun:
- Befolgen Sie die Getting Started-Anweisungen für die Remote - Tunnels-Erweiterung.
- Installieren Sie Docker auf Ihrem Tunnel-Host. Sie müssen Docker nicht lokal installieren.
- Befolgen Sie die Schritte für die Remote - Tunnels-Erweiterung, um eine Verbindung zu einem Tunnel-Host herzustellen und dort einen Ordner zu öffnen.
- Verwenden Sie den Befehl Dev Containers: In Container neu öffnen aus der Befehlspalette (F1, ⇧⌘P (Windows, Linux Ctrl+Shift+P)).
Der Rest des Dev Containers-Schnellstarts gilt unverändert. Weitere Informationen zur Remote - Tunnels-Erweiterung finden Sie in ihrer Dokumentation.
Verbindung über die Docker CLI
Dieses Modell erfordert lediglich, dass eine Docker Engine auf einem entfernten Host ausgeführt wird, mit dem Ihre lokale Docker CLI eine Verbindung herstellen kann. Während die Verwendung der Remote - SSH- und Remote - Tunnels-Erweiterungen einfacher ist und die Installation der Docker CLI nicht einmal lokal erfordert, kann dieses Modell für Situationen nützlich sein, in denen Sie bereits einen Host haben, mit dem Sie von der Kommandozeile aus eine Verbindung herstellen. Dieser Ansatz ist auch nützlich, wenn Sie bereits laufende Container auf diesem entfernten Server anhängen möchten.
Ein einfaches Remote-Beispiel
Die Einrichtung von VS Code zum Anhängen an einen Container auf einem entfernten Docker-Host kann so einfach sein wie das Einstellen der containers.environment-Eigenschaft der Container Tools-Erweiterung in settings.json und das Neustarten von VS Code (oder das Neuladen des Fensters).
Zum Beispiel
"containers.environment": {
"DOCKER_HOST": "ssh://your-remote-user@your-remote-machine-fqdn-or-ip-here"
}
Die Verwendung von SSH erfordert einen unterstützten SSH-Client, dass Sie schlüsselbasierte Authentifizierung für den entfernten Host konfiguriert haben und dass der Schlüssel in Ihren lokalen SSH-Agenten importiert ist. Informationen zur Konfiguration des Agenten und zum Hinzufügen Ihres Schlüssels finden Sie im Artikel über das Verwenden von SSH-Schlüsseln mit Git.
Zu diesem Zeitpunkt können Sie Container auf dem entfernten Host anhängen. Weitere Informationen darüber, wie Sie Verbindungen über Einstellungen und Umgebungsvariablen oder Docker-Kontexte herstellen können, werden wir später in diesem Abschnitt behandeln.
Für devcontainer.json gibt es einen zusätzlichen Schritt: Sie müssen alle konfigurierten (oder automatisch konfigurierten) Bind-Mounts aktualisieren, damit sie nicht mehr auf das lokale Dateisystem zeigen.
Es gibt zwei Varianten dieser Einrichtung. Die erste besteht darin, zuerst Ihren entfernten Dev-Container zu erstellen und dann Ihren Quellcode in ein benanntes Volume zu klonen, da dies keinen direkten Zugriff auf das Dateisystem auf dem entfernten Host erfordert.
Hier ist ein grundlegendes devcontainer.json-Beispiel für diese Einrichtung
{
"image": "node", // Or "dockerFile"
"workspaceFolder": "/workspace",
"workspaceMount": "source=remote-workspace,target=/workspace,type=volume"
}
Tatsächlich verwendet der Befehl Dev Containers: Clone Repository in Container Volume... in der Befehlspalette (F1) dieselbe Technik. Wenn Sie bereits eine devcontainer.json-Datei in einem GitHub-Repository haben, die auf ein Image oder eine Dockerfile verweist, verwendet der Befehl automatisch ein benanntes Volume anstelle eines Bind-Mounts – was auch mit entfernten Hosts funktioniert.
Der zweite Ansatz besteht darin, einen Ordner auf dem entfernten Rechner in Ihren Container zu mounten. Dies erfordert, dass Sie Zugriff auf das entfernte Dateisystem haben, ermöglicht Ihnen aber auch die Arbeit mit vorhandenem Quellcode auf dem entfernten Rechner.
Aktualisieren Sie die Eigenschaft workspaceMount im obigen Beispiel, um stattdessen dieses Modell zu verwenden
"workspaceMount": "source=/absolute/path/on/remote/machine,target=/workspace,type=bind,consistency=cached"
In beiden Fällen führen Sie zum Ausprobieren den Befehl Dev Containers: Open Folder in Container... aus und wählen den lokalen Ordner mit der .devcontainer.json-Datei darin aus.
Informationen zu anderen Szenarien wie Docker Compose finden Sie unter Konvertieren einer vorhandenen oder vordefinierten devcontainer.json.
Verbindung über VS Code-Einstellungen oder lokale Umgebungsvariablen
Wenn Sie bereits einen entfernten Docker-Host eingerichtet und laufen haben, können Sie die folgenden Eigenschaften in Ihrer Arbeitsbereichs- oder Benutzer-settings.json verwenden, um den Host anzugeben.
SSH-Protokoll
Neuere Versionen von Docker (18.06+) unterstützen das SSH-Protokoll zur Verbindung mit entfernten Docker-Hosts. Dies ist einfach zu konfigurieren, da Sie nur eine Eigenschaft in settings.json festlegen müssen, um es zu verwenden.
Installieren Sie zuerst einen unterstützten SSH-Client, konfigurieren Sie die schlüsselbasierte Authentifizierung und importieren Sie dann Ihren Schlüssel in Ihren lokalen SSH-Agenten (der unter Windows und Linux oft nicht standardmäßig läuft). Informationen zur Konfiguration des Agenten und zum Hinzufügen des Schlüssels finden Sie im Artikel über das Verwenden von SSH-Schlüsseln mit Git.
Fügen Sie dann die folgende containers.environment-Eigenschaft der Container Tools-Erweiterung zu settings.json hinzu (ersetzen Sie die Werte nach Bedarf)
"containers.environment": {
"DOCKER_HOST": "ssh://your-remote-user@your-remote-machine-fqdn-or-ip-here"
}
Nachdem Sie VS Code neu gestartet (oder das Fenster neu geladen) haben, können Sie nun an jeden laufenden Container auf dem entfernten Host anhängen. Sie können auch spezialisierte, lokale devcontainer.json-Dateien verwenden, um einen entfernten Dev-Container zu erstellen / sich damit zu verbinden.
Tipp: Wenn dies nicht funktioniert, Sie sich aber per SSH von der Kommandozeile aus mit dem Host verbinden können, stellen Sie sicher, dass Ihr SSH-Agent mit Ihrem Authentifizierungsschlüssel läuft. Wenn alles andere fehlschlägt, können Sie stattdessen einen SSH-Tunnel als Fallback verwenden.
Verwendung des TCP-Protokolls
Während das SSH-Protokoll seinen eigenen integrierten Autorisierungsmechanismus hat, erfordert die Verwendung des TCP-Protokolls oft die Einstellung anderer Container Tools-Erweiterung-Eigenschaften in Ihrer settings.json. Diese sind:
"containers.environment": {
"DOCKER_HOST": "tcp://your-remote-machine-fqdn-or-ip-here:port",
"DOCKER_CERT_PATH": "/optional/path/to/folder/with/certificate/files",
"DOCKER_TLS_VERIFY": "1" // or "0"
}
Wie bei SSH starten Sie VS Code neu (oder laden das Fenster neu), damit die Einstellungen wirksam werden.
Verwendung von Umgebungsvariablen anstelle von settings.json
Wenn Sie settings.json lieber nicht verwenden möchten, können Sie stattdessen Umgebungsvariablen in einem Terminal festlegen. Die Schritte hierfür sind:
- Beenden Sie alle Instanzen von VS Code.
- Stellen Sie sicher, dass VS Code in Ihrem Betriebssystem-
PATHenthalten ist. - Legen Sie die Umgebungsvariablen (z. B.
DOCKER_HOST) in einem Terminal / einer Eingabeaufforderung fest. - Geben Sie
codein diesem selben Terminal / dieser selben Eingabeaufforderung ein, um VS Code mit den festgelegten Variablen zu starten.
Verbindung über Docker-Kontexte
Docker-Kontexte ermöglichen Ihnen die Interaktion mit verschiedenen Hosts – Sie können Kontexte für jeden Host einrichten und zwischen ihnen wechseln.
Sie erstellen neue Kontexte mit docker context create. Der aktuelle Kontext kann mit docker context use <context> geändert werden.
Die Container Tools-Erweiterung wird mit der Einstellung containers.environment geliefert, bei der Umgebungsvariablen wie DOCKER_HOST oder DOCKER_CONTEXT festgelegt werden können, die auch von der Dev Containers-Erweiterung berücksichtigt werden.
Hinweis: Die oben genannten Einstellungen sind nur sichtbar, wenn die Container Tools-Erweiterung installiert ist. Ohne die Container Tools-Erweiterung verwendet Dev Containers den aktuellen Kontext.
Konvertieren einer vorhandenen oder vordefinierten devcontainer.json
Um eine vorhandene oder vordefinierte lokale devcontainer.json in eine entfernte umzuwandeln, befolgen Sie diese Schritte:
-
Öffnen Sie einen lokalen Ordner in VS Code (nicht einen entfernten), in dem Sie die Datei konvertieren möchten.
-
Wenn Sie keinen Ordner mit einer
devcontainer.jsondarin ausgewählt haben, können Sie eine vordefinierte auswählen, indem Sie Dev Containers: Add Container Configuration File... aus der Befehlspalette (F1) ausführen. -
Befolgen Sie diese Schritte basierend darauf, worauf Ihre
.devcontainer/devcontainer.jsonoder.devcontainer.jsonverweist, um den Quellcode-Mount zu ändern:Dockerfile oder Image:
Wenn Sie keinen Anmeldezugriff auf den entfernten Host haben, verwenden Sie ein Docker-„Volume“ für Ihren Quellcode. Aktualisieren Sie
.devcontainer/devcontainer.jsonwie folgt (ersetzen Sieremote-workspacebei Bedarf durch einen eindeutigen Volumennamen):"workspaceMount": "source=remote-workspace,target=/workspace,type=volume" "workspaceFolder": "/workspace",Wenn Sie Anmeldezugriff haben, können Sie stattdessen einen Bind-Mount des entfernten Dateisystems verwenden
"workspaceMount": "source=/absolute/path/on/remote/machine,target=/workspace,type=bind,consistency=cached" "workspaceFolder": "/workspace",Die Eigenschaft
workspaceMountunterstützt dieselben Werte wie das Docker CLI-Flag--mount, wenn Sie ein anderes Szenario im Sinn haben.Docker Compose:
Wenn Sie keinen Anmeldezugriff auf den entfernten Host haben, aktualisieren Sie (oder erweitern Sie) Ihre
docker-compose.yml. Ersetzen Sieyour-service-name-heredurch den für die"service"-Eigenschaft indevcontainer.jsonangegebenen Wert undremote-workspacedurch einen eindeutigen Volumennamen.version: '3' services: your-service-name-here: volumes: - remote-workspace:/workspace # ... volumes: remote-workspace:Wenn Sie Anmeldezugriff haben, können Sie stattdessen einen Bind-Mount des entfernten Dateisystems verwenden
version: '3' services: your-service-name-here: volumes: - /absolute/path/on/remote/machine:/workspace:cached # ...Informationen zur Unterstützung eines anderen Szenarios finden Sie in der Docker Compose-Dokumentation zu
volumes. -
Führen Sie den Befehl Dev Containers: Reopen in Container aus der Befehlspalette (F1) oder Dev Containers: Rebuild Container aus.
-
Wenn Sie ein Volume anstelle eines Bind-Mounts verwendet haben, öffnen Sie mit ⌃⇧` (Windows, Linux Ctrl+Shift+`) ein Terminal im Container. Sie können von hier aus
git cloneausführen, um Ihren Quellcode herunterzuladen, und Datei > Öffnen... / Ordner öffnen... verwenden, um das geklonte Repository zu öffnen.
Wenn Sie das nächste Mal dieselbe Verbindung zu diesem Container herstellen möchten, führen Sie Dev Containers: Open Folder in Container... aus und wählen Sie denselben lokalen Ordner in einem VS Code-Fenster aus.
Optional: Quellcode auf dem entfernten Rechner lokal verfügbar machen
Wenn Sie Ihren Quellcode auf dem Dateisystem des entfernten Rechners statt in einem Docker-Volume speichern, gibt es mehrere Möglichkeiten, lokal auf die Dateien zuzugreifen:
- Mounten des entfernten Dateisystems mit SSHFS.
- Synchronisieren von Dateien vom entfernten Host zu Ihrem lokalen Rechner mit
rsync. - Verwenden Sie den Befehl
mount, wenn Sie Docker Machine verwenden.
Die Verwendung von SSHFS oder des Mount-Befehls von Docker Machine sind die bequemeren Optionen und erfordern keine Dateisynchronisierung. Die Leistung ist jedoch deutlich langsamer als bei der Arbeit über VS Code, daher eignen sie sich am besten für Einzeldateibearbeitungen und das Hoch-/Herunterladen von Inhalten. Wenn Sie eine Anwendung verwenden müssen, die viele Dateien auf einmal liest/schreibt (wie ein lokales Quellcodeverwaltungstool), ist rsync die bessere Wahl.