Wenn Sie mit Docker arbeiten, containerisieren Sie normalerweise die Dienste, die Ihren Stack bilden, und verwenden Inter-Container-Netzwerke, um zwischen ihnen zu kommunizieren. Manchmal benötigen Sie möglicherweise einen Container, um mit einem Dienst auf Ihrem Host zu kommunizieren, der nicht containerisiert wurde. So greifen Sie auf localhost
zu oder 127.0.0.1
aus einem Docker-Container.
Die einfache Option
Docker Desktop 18.03+ für Windows und Mac unterstützt host.docker.internal
als funktionierender Alias für localhost
. Verwenden Sie diese Zeichenfolge in Ihren Containern, um auf Ihren Hostcomputer zuzugreifen.
localhost
und127.0.0.1
– Diese werden in den Container aufgelöst .host.docker.internal
– Dies wird zum externen Host aufgelöst.
Wenn Sie einen MySQL-Server auf Ihrem Host ausführen, könnten Docker-Container darauf zugreifen, indem Sie eine Verbindung zu host.docker.internal:3306
herstellen . Dies ist die einfachste Technik, wenn Sie auf einem Windows- oder Mac-Computer arbeiten.
Docker Engine-Benutzer unter Linux können host.docker.internal
aktivieren auch über --add-host
Flag für docker run
. Starten Sie Ihre Container mit diesem Flag, um die Hostzeichenfolge verfügbar zu machen:
docker run -d --add-host host.docker.internal:host-gateway my-container:latest
Der --add-host
flag fügt einen Eintrag zu /etc/hosts
des Containers hinzu Datei. Der oben gezeigte Wert bildet host.docker.internal
ab an das Host-Gateway des Containers, das mit dem echten localhost
übereinstimmt Wert. Sie könnten host.docker.internal
ersetzen mit Ihrer eigenen Zeichenfolge, wenn Sie es vorziehen.
Herstellen einer Verbindung zum Hostnetzwerk
Docker stellt einen host
bereit Netzwerk, mit dem Container den Netzwerkstapel Ihres Hosts gemeinsam nutzen können. Dieser Ansatz bedeutet localhost
innerhalb eines Containers wird in den physischen Host aufgelöst, anstatt in den Container selbst.
Container werden mit dem Host-Netzwerk gestartet, indem --network=host
hinzugefügt wird Flagge:
docker run -d --network=host my-container:latest
Jetzt kann Ihr Container localhost
referenzieren oder 127.0.0.1
direkt.
Wenn Sie Docker Compose verwenden, ändern Sie die Dienstdefinition Ihres Containers so, dass sie den network_mode
enthält Feld:
services: my-service: network_mode: host
Es gibt einige Vorbehalte bei diesem Ansatz. Es ist wichtig, alle Auswirkungen zu berücksichtigen, bevor Sie es verwenden. Container erhalten normalerweise ihr eigenes privates Netzwerk, das vom Stack des Hosts getrennt ist. Wenn Sie --network=host
angeben , erbt der Container standardmäßig freigegebene Netzwerkeinstellungen von Ihrem Host.
Alle vom Container bereitgestellten Ports werden auf dem Host bereitgestellt , auch wenn sie nicht explizit mit dem -p
deklariert sind Flagge. Der Standard-Hostname des Containers stimmt mit dem des Hosts überein, obwohl dies mit --hostname
geändert werden kann Flagge.
Das Hostnetzwerk kann ein Sicherheitsproblem darstellen, das das Isolationsmodell von Docker-Containern durchbricht. Es kann immer noch in Szenarien nützlich sein, in denen Sie sicher sind, dass laufende Container nicht miteinander in Konflikt geraten oder Probleme in Ihrer Hostumgebung verursachen. Der Host-Netzwerkmodus ist auch schneller als der Standard-Bridge-Modus, da es keine Virtualisierungsebene für den Datenverkehr gibt.
Zugriff auf den Host mit dem Standard-Bridge-Modus
Auf Ihren Host kann weiterhin von Containern in der Standard-bridge
zugegriffen werden Netzwerkmodus. Sie müssen es nur über seine Docker-Netzwerk-IP anstelle von localhost
referenzieren oder 127.0.0.1
.
Die meisten Docker-Engine-Installationen stellen den Host als 172.17.0.1
dar auf dem Standard docker0
Brückennetzwerk. Sie können Ihre eigene IP überprüfen, indem Sie diesen Befehl auf Ihrem Host ausführen:
ip addr show docker0
Die Docker-IP Ihres Hosts wird im inet
angezeigt Linie. Stellen Sie von Ihren Containern aus eine Verbindung zu dieser IP-Adresse her, um erfolgreich auf die auf Ihrem Host ausgeführten Dienste zuzugreifen.
Ein Fallstrick dieses Ansatzes besteht darin, dass Sie möglicherweise keine Verbindung zu Diensten herstellen können, die direkt an localhost
gebunden sind . Sie müssen sicherstellen, dass Ihre Dienste auf Verbindungen auf Ihrer Docker-Bridge-IP sowie auf localhost
lauschen und 127.0.0.1
. Andernfalls sehen Sie connection refused
oder ähnliche Fehler in Ihrem Container.
Zusammenfassung
Sie haben mehrere Möglichkeiten, wenn Sie außerhalb eines Docker-Containers auf den localhost
Ihrer Maschine zugreifen müssen . Wenn Sie Windows oder Mac verwenden, verwenden Sie am besten die integrierte host.docker.internal
alias. Linux-Benutzer können etwas Ähnliches mit --add-host
einrichten Flag beim Starten eines Containers.
Der Host-Netzwerkmodus ist eine universelle Alternative, mit der Container den Netzwerkstapel Ihres Hosts gemeinsam nutzen können. Sie können auf localhost
verweisen direkt, müssen sich aber der Risiken und Einschränkungen bewusst sein. Es ist keine geeignete Option, wenn eine starke Netzwerkisolation erforderlich ist.
Das Festhalten am Bridge-Modus kann die beste Option für Workloads sein, die ihn unterstützen. Binden Sie die Dienste Ihres Hosts an seine Docker-IP und verwenden Sie dann diese Adresse, um eine Verbindung von Ihrem Container aus herzustellen. Auf diese Weise können Sie das virtualisierte Netzwerk von Docker pro Container nutzen und gleichzeitig eine Route zu Ihrem Host bereitstellen, wenn dies erforderlich ist.