So verbinden Sie sich mit Localhost in einem Docker-Container
Wenn Sie mit Docker arbeiten, containerisieren Sie in der Regel die Dienste, aus denen Ihr Stack besteht, und verwenden containerübergreifende Netzwerke, um miteinander 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 zu localhost
ou 127.0.0.1
aus einem Docker-Container.
Zusammenfassung
Die einfache Möglichkeit
Unterstützung für Docker Desktop 18.03+ für Windows und Mac host.docker.internal
als funktionaler Alias für localhost
. Verwenden Sie diese Zeichenfolge in Ihren Containern, um auf Ihren Hostcomputer zuzugreifen.
localhost
et127.0.0.1
- Diese werden gelöst bei Container.host.docker.internal
- Dies wird zum externen Host aufgelöst.
Wenn Sie einen MySQL-Server auf Ihrem Host ausführen, können Docker-Container darauf zugreifen, indem sie eine Verbindung zu . herstellen host.docker.internal:3306
. Dies ist die einfachste Technik, wenn Sie auf einem Windows- oder Mac-Computer arbeiten.
Docker Engine-Benutzer unter Linux können aktivieren host.docker.internal
auch über die --add-host
Flagge für docker run
. Starten Sie Ihre Container mit diesem Flag, um die Hostkette verfügbar zu machen:
docker run -d --add-host host.docker.internal: host-gateway my-container: aktuell
Die --add-host
Flag fügt dem Container einen Eintrag hinzu /etc/hosts
einordnen. Der oben gezeigte Wert der Karten host.docker.internal
zum Container-Host-Gateway, das mit dem realen übereinstimmt localhost
Wert. Du könntest ersetzen host.docker.internal
mit Ihrem eigenen Kanal, wenn Sie es vorziehen.
Verbindung zum Host-Netzwerk
Docker bietet eine host
Netzwerk, das es Containern ermöglicht, den Netzwerkstapel Ihres Hosts gemeinsam zu nutzen. Dieser Ansatz bedeutet localhost
innerhalb eines Containers wird in den physischen Host aufgelöst, anstatt in den Container selbst.
Container werden mit dem Hostnetzwerk gestartet, indem die --network=host
Flagge:
docker run -d --network = host my-container: aktuell
Ihr Container kann jetzt referenzieren localhost
ou 127.0.0.1
direkt.
Wenn Sie Docker Compose verwenden, ändern Sie die Service-Definition Ihres Containers, um die network_mode
Feld:
DIENSTLEISTUNGEN: mein-service: Netzwerkmodus: Gastgeber
Bei diesem Ansatz gibt es einige Vorbehalte. Es ist wichtig, alle Auswirkungen zu berücksichtigen, bevor Sie es verwenden. Container haben normalerweise ihr eigenes privates Netzwerk, das vom Host-Stack getrennt ist. Wenn Sie angeben --network=host
, erbt der Container standardmäßig die freigegebenen Netzwerkeinstellungen von Ihrem Host.
Alle vom Container freigegebenen Ports werden freigegeben auf dem Wirt, auch wenn sie nicht explizit mit dem deklariert sind -p
Flagge. Der Standard-Hostname des Containers stimmt mit dem des Hosts überein, kann jedoch mit dem geändert werden --hostname
Flagge.
Das Hostnetzwerk kann ein Sicherheitsproblem sein, das das Docker-Container-Isolationsmodell durchbricht. Dies kann immer noch in Szenarien nützlich sein, in denen Sie sicher sind, dass die ausgeführten 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
Ihr Host ist standardmäßig immer von Containern aus zugänglich bridge
Netzwerkmodus. Sie müssen es nur anhand seiner Docker-Netzwerk-IP referenzieren, anstatt localhost
ou 127.0.0.1
.
Die meisten Docker Engine-Installationen repräsentieren den Host als 172.17.0.1
standardmäßig docker0
Netzwerk von Brücken. Sie können Ihre eigene IP überprüfen, indem Sie diesen Befehl auf Ihrem Host ausführen:
IP-Adresse anzeigen docker0
Die Docker-IP Ihres Hosts wird auf dem . angezeigt inet
Leitung. Stellen Sie von Ihren Containern aus eine Verbindung zu dieser IP-Adresse her, um erfolgreich auf die Dienste zuzugreifen, die auf Ihrem Host ausgeführt werden.
Eine der Fallstricke bei diesem Ansatz besteht darin, dass Sie möglicherweise keine Verbindung zu Diensten herstellen können, die direkt auf localhost
. Sie müssen sicherstellen, dass Ihre Dienste auf Ihrer Docker-Bridge-IP auf Verbindungen warten, sowie localhost
et 127.0.0.1
. sonst wirst du sehen connection refused
oder ähnliche Fehler in Ihrem Container.
Zusammenfassung
Sie haben mehrere Möglichkeiten, wenn Sie die Außenseite eines Docker-Containers zu Ihrem Computer erreichen müssen localhost
. Wenn Sie Windows oder Mac verwenden, verwenden Sie am besten die host.docker.internal
auch bekannt Linux-Benutzer können etwas Ähnliches mit dem --add-host
Flag beim Starten eines Containers.
Der Hostnetzwerkmodus ist eine universelle Alternative, die es Containern ermöglicht, den Netzwerkstapel Ihres Hosts gemeinsam zu nutzen. Sie können verweisen localhost
direkt, muss sich aber der Risiken und Grenzen bewusst sein. Dies ist keine geeignete Option, wenn eine starke Netzwerkisolierung erforderlich ist.
Das Festhalten am Bridge-Modus ist möglicherweise die beste Option für Workloads, 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 containerbasierte virtualisierte Netzwerk von Docker verwenden und gleichzeitig bei Bedarf eine Route zu Ihrem Host bereitstellen.