So verwenden Sie einen Docker-Container für den Zugriff auf das Host-Netzwerk

So verwenden Sie einen Docker-Container für den Zugriff auf das Host-Netzwerk

Vor Kurzem wurde ein System bereitgestellt, das nginx als Reverse-Proxy verwendet, wobei nginx in Docker ausgeführt wird:

$ docker run -d --name nginx $PWD:/etc/nginx -p 80:80 -p 443:443 nginx:1.15

Der API-Dienst, der geproxied werden muss, läuft auf Port 1234 des Host-Rechners. Die entsprechende Konfiguration von nginx.conf lautet wie folgt:

Server {
 ...

 Standort /API {
  Proxy-Passwort http://localhost:1234
 }
 ...
}

Als ich darauf zugegriffen habe, stellte ich fest, dass immer ein 502 Bad Gateway-Fehler gemeldet wurde und das Fehlerprotokoll zeigte, dass keine Verbindung zum Upstream hergestellt werden konnte.

Wenn ich es mir recht überlege, scheint mit localhost in nginx.conf etwas nicht zu stimmen. Da nginx in einem Docker-Container ausgeführt wird, ist dieser Localhost der Localhost des Containers und nicht der Localhost des Hosts.

An diesem Punkt stellt sich das Problem, das dieser Artikel lösen soll: Wie greife ich vom Container aus auf das Host-Netzwerk zu? Es gibt mehrere Möglichkeiten, im Internet zu suchen:

Host-IP verwenden

Bei der Installation von Docker wird auf dem Host ein virtuelles Gateway docker0 installiert. Wir können die IP-Adresse des Hosts auf docker0 anstelle von localhost verwenden.

Verwenden Sie zunächst den folgenden Befehl, um die IP-Adresse des Hosts abzufragen:

$ IP-Adresse anzeigen docker0
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue status UP-Gruppenstandard
  Link/Ether 02:42:d5:4c:f2:1e brd ff:ff:ff:ff:ff:ff:ff
  inet 172.17.0.1/16 Bereich global docker0
    valid_lft für immer preferred_lft für immer
  inet6 fe80::42:d5ff:fe4c:f21e/64 Bereichslink
    valid_lft für immer preferred_lft für immer

Es kann festgestellt werden, dass die IP des Hostcomputers 172.17.0.1 ist. Daher kann das Ändern des Proxy-Passworts http://localhost:1234 in das Proxy-Passwort http://172.17.0.1:1234 den Fehler 502 Bad Gateway beheben.

Die IP-Adresse des Hostcomputers ist jedoch in verschiedenen Systemen unterschiedlich. Beispielsweise lautet sie unter Linux normalerweise 172.17.0.1 und unter macOS 192.168.65.1. Diese IP-Adresse kann auch geändert werden. Daher kann die Verwendung von IP zum Konfigurieren von nginx.conf nicht umgebungsübergreifend verwendet werden.

Hostnetzwerk verwenden

Wenn der Docker-Container ausgeführt wird, stehen drei Netzwerktypen zur Konfiguration zur Verfügung: Host, Bridge und Keine. Die Standardeinstellung ist „Bridge“, was „Bridge-Netzwerk“ bedeutet und im Bridge-Modus mit dem Host verbunden ist; „Host“ bedeutet das Host-Netzwerk, was bedeutet, dass das Netzwerk mit dem Host geteilt wird; „None“ bedeutet, dass kein Netzwerk vorhanden ist und der Container keine Verbindung zum Internet herstellen kann.

Wenn der Container das Hostnetzwerk verwendet, teilen sich der Container und der Host das Netzwerk, sodass im Container auf das Hostnetzwerk zugegriffen werden kann und der lokale Host des Containers der lokale Host des Hosts ist.

Verwenden Sie --network host in Docker, um das Host-Netzwerk für den Container zu konfigurieren:

$ docker run -d --name nginx --network host nginx

Im obigen Befehl muss zum Zuordnen von Ports nicht wie zuvor -p 80:80 -p 443:443 verwendet werden, da der Container das Netzwerk mit dem Host teilt und die freigegebenen Ports im Container den freigegebenen Ports auf dem Host entsprechen.

Die Verwendung des Hostnetzwerks erfordert keine Änderung von nginx.conf und localhost kann weiterhin verwendet werden. Es ist also vielseitiger als die vorherige Methode. Da das Host-Netzwerk jedoch nicht so isoliert ist wie das Bridge-Netzwerk, ist die Sicherheit bei der Verwendung des Host-Netzwerks nicht so hoch wie bei der Bridge.

Zusammenfassen

In diesem Artikel werden zwei Methoden vorgeschlagen: die Verwendung der Host-IP und die Verwendung des Host-Netzwerks, um vom Container aus auf das Host-Netzwerk zuzugreifen. Beide Methoden haben ihre eigenen Vor- und Nachteile. Die Verwendung der Host-IP bietet eine bessere Isolierung, aber eine geringe Vielseitigkeit; die Verwendung des Host-Netzwerks bietet eine gute Vielseitigkeit, birgt jedoch das Risiko, das Host-Netzwerk offenzulegen.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Docker ermöglicht den nahtlosen Aufruf von Shell-Befehlen zwischen Container und Host
  • Lösung für den Docker-Container, der keine Schreibberechtigung für das Host-Verzeichnis hat
  • Lösung, wenn der Docker-Container nicht auf den Host-Port zugreifen kann
  • Führen Sie die Shell oder das Programm im Docker-Container auf dem Host aus.
  • Aufrufen und Ausführen von Host-Docker-Operationen im Docker-Container
  • Detaillierte Erläuterung zur Lösung des Problems, dass der Docker-Container nicht über IP auf den Hostcomputer zugreifen kann
  • Lösen Sie das Problem des 8-Stunden-Unterschieds zwischen Docker-Container und Host-Computer

<<:  Mehrere Methoden zum Ändern des MySQL-Root-Passworts (empfohlen)

>>:  JavaScript ermittelt, ob der Browser IE ist

Artikel empfehlen

Super einfache QPS-Statistikmethode (empfohlen)

Statistik der QPS-Werte der letzten N Sekunden (i...

Tutorial zu HTML-Tabellen-Tags (34): Zeilenspannen-Attribut ROWSPAN

In einer komplexen Tabellenstruktur erstrecken si...

CentOS7.5-Installationstutorial für MySQL

1. Überprüfen Sie zunächst, ob auf dem System MyS...

MySQL-Sharding-Details

1. Einführung in das Geschäftsszenario Angenommen...

So installieren Sie MySQL 8.0.17 und konfigurieren den Fernzugriff

1. Vorbereitung vor der Installation Überprüfen S...

Detaillierte Erläuterung der Verwendung von Object.create-Instanzen in js

1. Erstellen Sie mit der Methode Object.create() ...

So fügen Sie Nginx zu den Systemdiensten in CentOS7 hinzu

Einführung Nach dem Kompilieren, Installieren und...

HTML-Hyperlink ein Tag_Powernode Java Academy

Jeder, der HTML studiert oder verwendet hat, soll...

Reiner CSS-Code zum Erzielen von Fluss und dynamischen Linieneffekten

Ideen: Eine äußere Box legt den Hintergrund fest;...

So begrenzen Sie die Anzahl der Datensätze in einer Tabelle in MySQL

Inhaltsverzeichnis 1. Lösung auslösen 2. Partitio...