So verbinden Sie sich mit Localhost in einem Docker-Container

0
19

Wenn Sie mit Docker arbeiten, containerisieren Sie normalerweise die Dienste, die Ihren Stack bilden, und Verwenden Sie 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 von einem Docker-Container aus auf localhost oder 127.0.0.1 zu.

Die einfache Option

Docker Desktop 18.03+ für Windows und Mac unterstützen host.docker.internal als funktionierenden Alias ​​für localhost. Verwenden Sie diese Zeichenfolge in Ihren Containern, um auf Ihren Hostcomputer zuzugreifen.

  • localhost und 127.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önnen 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 auch über das Flag –add-host für die Docker-Ausführung aktivieren . Starten Sie Ihre Container mit diesem Flag, um den Host-String verfügbar zu machen:

docker run -d –add-host host.docker.internal:host-gateway my-container:latest

Das Flag –add-host fügt der Datei /etc/hosts des Containers einen Eintrag hinzu. Der oben gezeigte Wert ordnet host.docker.internal dem Host-Gateway des Containers zu, das dem echten localhost-Wert entspricht. Sie können host.docker.internal durch Ihre eigene Zeichenfolge ersetzen, wenn Sie möchten.

Verbindung zum Hostnetzwerk herstellen

Docker bietet ein Host-Netzwerk, das es Containern ermöglicht, den Netzwerk-Stack Ihres Hosts gemeinsam zu nutzen. Dieser Ansatz bedeutet, dass localhost innerhalb eines Containers in den physischen Host aufgelöst wird, anstatt in den Container selbst.

Werbung

Container werden mit dem Hostnetzwerk gestartet, indem das Flag –network=host hinzugefügt wird:

docker run -d –network=host my-container:latest

Jetzt kann Ihr Container referenzieren localhost oder direkt 127.0.0.1.

Wenn Sie Docker Compose verwenden, ändern Sie die Servicedefinition Ihres Containers, um das Feld network_mode einzuschließen:

services: my-service: network_mode : Gastgeber

Es gibt einige Vorbehalte gegenüber 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, übernimmt der Container standardmäßig freigegebene Netzwerkeinstellungen von Ihrem Host.

Alle vom Container bereitgestellten Ports werden auf dem Host verfügbar gemacht, auch wenn sie nicht explizit angegeben sind mit dem Flag -p deklariert. Der Standard-Hostname des Containers stimmt mit dem des Hosts überein, obwohl dies mit dem Flag –hostname geändert werden kann.

Das Hostnetzwerk kann ein Sicherheitsproblem darstellen, das das Isolationsmodell von Docker-Containern durchbricht. Es kann dennoch 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 keine Virtualisierungsebene für den Datenverkehr vorhanden ist.

Zugriff auf den Host mit dem Standard-Bridge-Modus

Auf Ihren Host kann weiterhin von Containern im Standard-Bridge-Netzwerkmodus zugegriffen werden. Sie müssen nur über seine Docker-Netzwerk-IP darauf verweisen, statt localhost oder 127.0.0.1.

Werbung

Die meisten Docker-Engine-Installationen stellen den Host als 172.17.0.1 im standardmäßigen docker0-Bridge-Netzwerk dar. 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 in der inet-Zeile angezeigt. Stellen Sie innerhalb Ihrer Container eine Verbindung zu dieser IP-Adresse her, um erfolgreich auf die Dienste zuzugreifen, die auf Ihrem Host ausgeführt werden.

Ein Fallstrick dieses Ansatzes besteht darin, dass Sie möglicherweise keine Verbindung zu Diensten herstellen können, die direkt an localhost binden. Sie müssen sicherstellen, dass Ihre Dienste auf Verbindungen auf Ihrer Docker-Bridge-IP sowie auf localhost und 127.0.0.1 warten. Andernfalls werden in Ihrem Container Verbindungsabbrüche oder ähnliche Fehler angezeigt.

Zusammenfassung

Sie haben mehrere Möglichkeiten, wenn Sie nach draußen gehen müssen einen Docker-Container zum localhost Ihres Computers. Wenn Sie Windows oder Mac verwenden, verwenden Sie am besten den integrierten Alias ​​host.docker.internal. Linux-Benutzer können beim Starten eines Containers etwas Ähnliches mit dem Flag –add-host einrichten.

Der Host-Netzwerkmodus ist eine universelle Alternative, mit der Container den Netzwerk-Stack Ihres Hosts gemeinsam nutzen können. Sie können localhost direkt referenzieren, müssen sich jedoch der Risiken und Einschränkungen bewusst sein. Dies ist keine geeignete Option, wenn eine starke Netzwerkisolierung erforderlich ist.

Werbung

Das Beibehalten des 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 innerhalb Ihres Containers herzustellen. Auf diese Weise können Sie das virtualisierte Netzwerk von Docker pro Container verwenden und gleichzeitig eine Route zu Ihrem Host bereitstellen, wenn dies erforderlich ist.