GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

So stellen Sie eine Verbindung zu Localhost in einem Docker-Container her

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 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ö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.


Docker
  1. So installieren Sie WordPress mit Docker

  2. So verbinden Sie Docker-Container

  3. So führen Sie MySQL in einem Docker-Container aus

  4. Wie man ein Host-Verzeichnis in einen Docker-Container einbindet

  5. So weisen Sie einem Docker-Container eine statische IP zu

So verwenden Sie Docker Cp zum Kopieren von Dateien zwischen Host und Containern

So führen Sie PHPMyAdmin in einem Docker-Container aus

So führen Sie Grafana in einem Docker-Container aus

So richten Sie einen Apache Docker-Container ein

So kopieren Sie Dateien zwischen Host und Docker-Container

So führen Sie Docker-Container aus