it-swarm.com.de

Herstellen einer Verbindung zu einem Docker-Container von außerhalb des Hosts (dasselbe Netzwerk) [Windows]

Ich habe meinen ersten Docker-Container erstellt, auf dem ein Server mit Go ausgeführt wird, aber ich kann nicht von außerhalb des Host-Computers darauf zugreifen. Ich habe gerade mit Docker angefangen, also bin ich hier etwas verloren.

Ich habe also einen sehr einfachen Go-Code, mit dem ein Server gestartet wird. Ich habe das Docker-Image erstellt, mit dem Go installiert und der Code in einem Linux-Basis-Image erstellt wird. Ich betreibe den Server auf Port 8080, sodass ich diesen Port dem Host zur Verfügung stelle, auf dem der Container wie folgt ausgeführt wird:

docker run -p 8080:8080 dockertest

Das funktioniert und ich kann über die IP-Adresse des Dockers auf den Server zugreifen (die auf dem Docker-Schnellstart-Terminal angezeigt wird). Das Problem ist, dass ich nicht auf die Website zugreifen kann hoste von außerhalb des Hosts. Wenn ich also versuche, dieselbe IP-Adresse auf meinem Telefon zu öffnen, erhalte ich nur eine Fehlermeldung: Diese Webseite ist nicht verfügbar (ERR_CONNECTION_TIMED_OUT).

Ich habe auch versucht, die IP wie folgt anzugeben:

docker run -p 192.168.0.157:8080:8080 dockertest

Aber wenn ich das tue, kann ich weder über die IP des Dockers noch über die angegebene IP in der obigen Befehlszeile auf die Website zugreifen. Ich bin mir auch nicht sicher, welche IP ich in diesem Befehl schreiben soll. Ich habe die IP meines Computers verwendet. Ich habe auch 127.0.0.1 (localhost) ausprobiert, aber das gab mir das gleiche Ergebnis: Ich konnte über keine auf die Website zugreifen IP wie auch immer.

Ich habe dieses Problem gegoogelt und viele StackOverflow-Fragen gefunden, aber keine davon hat mir geholfen, mein Problem zu lösen. Die meisten davon waren auf Linux oder Mac ausgerichtet, sodass die Lösung nicht auf meine Situation zutraf.

Außerdem kann ich den Go-Code auf meinem Computer ausführen und von einem anderen Gerät im selben Netzwerk über die IP-Adresse meines Computers auf die Website zugreifen. Ich verstehe nicht, warum ich nicht darauf zugreifen kann, wenn ich es auf dem Docker-Computer ausführe. Mir ist der Gedanke gekommen, dass es etwas mit IP-Weiterleitung oder etwas anderem zu tun hat, aber ich bin ein absoluter Neuling im Networking bin meist ein webentwickler und habe fast keine erfahrung in native.

58
raulsntos

TL; DR Überprüfen Sie den Netzwerkmodus Ihres VirtualBox-Hosts - es sollte bridged sein, wenn die virtuelle Maschine (und der Docker-Container, den sie hostet) in Ihrem lokalen Netzwerk verfügbar sein soll.


Es scheint, dass Ihre Verwirrung darin liegt, mit welchem ​​Host Sie sich verbinden möchten, um über HTTP auf Ihre Anwendung zuzugreifen. Sie haben nicht wirklich genau beschrieben, was Ihre Konfiguration ist - ich werde einige Vermutungen anstellen, basierend auf der Tatsache, dass Sie "Windows" und "VirtualBox" in Ihren Tags haben.

Ich vermute, dass Sie Docker unter einer Linux-Variante in VirtualBox auf einem Windows-Host ausführen. Ich beschreibe die IP-Adressen wie folgt:

D = die IP-Adresse des Docker-Containers

L = die IP-Adresse des in VirtualBox ausgeführten Linux-Hosts

W = die IP-Adresse des Windows-Hosts

Wenn Sie Ihre Go-Anwendung auf Ihrem Windows-Host ausführen, können Sie von überall in Ihrem lokalen Netzwerk mit http://W:8080/ eine Verbindung dazu herstellen. Dies funktioniert, weil die Go-Anwendung den Port 8080 auf dem Windows-Computer bindet und jeder, der versucht, unter der IP-Adresse W auf Port 8080 zuzugreifen, wird verbunden.

Und hier wird es komplizierter:

Wenn VirtualBox eine virtuelle Maschine (VM) einrichtet, kann das Netzwerk in verschiedenen Modi konfiguriert werden. Ich kann mich nicht an die verschiedenen Optionen erinnern, aber die gewünschte Option ist bridged. In diesem Modus verbindet VirtualBox die virtuelle Maschine mit Ihrem lokalen Netzwerk, als wäre es eine eigenständige Maschine im Netzwerk, genau wie jede andere Maschine, die in Ihr Netzwerk eingesteckt wurde. Im bridged-Modus wird die virtuelle Maschine in Ihrem Netzwerk wie jede andere Maschine angezeigt. Andere Modi richten die Dinge anders ein und der Rechner ist in Ihrem Netzwerk nicht sichtbar.

Vorausgesetzt, Sie haben das Netzwerk für den Linux-Host (bridged) richtig eingerichtet, hat der Linux-Host eine IP-Adresse in Ihrem lokalen Netzwerk (z. B. 192.168.0.x) und Sie können unter http://L:8080/ auf Ihren Docker-Container zugreifen.

Wenn der Linux-Host auf einen anderen Modus als bridged eingestellt ist, können Sie vom Windows-Host aus möglicherweise darauf zugreifen. Dies hängt jedoch davon ab, in welchem ​​Modus er sich gerade befindet.

EDIT- basierend auf den Kommentaren unten klingt es sehr nach der Situation, die ich oben beschrieben habe, ist korrekt.

Lassen Sie uns noch ein wenig unterstützen: So funktioniert Docker auf meinem Computer (Ubuntu Linux).

Stellen Sie sich vor, ich führe den gleichen Befehl aus, den Sie haben: docker run -p 8080:8080 dockertest. Dazu wird ein neuer Container basierend auf dem dockertest-Image und der Weiterleitungsport 8080 auf dem Linux-Host (mein PC) an Port 8080 des Containers gestartet. Docker richtet ein eigenes internes Netzwerk (mit eigenen IP-Adressen) ein, damit der Docker-Dämon kommunizieren kann und Container miteinander kommunizieren können. Im Grunde ist das, was Sie mit diesem -p 8080:8080 machen, die Anbindung des internen Netzwerks von Docker an das "externe" Netzwerk - dh. der Netzwerkadapter des Hosts - an einem bestimmten Port.

Bei mir soweit? OK, jetzt machen wir einen Schritt zurück und schauen uns Ihr System an. Auf Ihrem Computer wird Windows ausgeführt - Docker wird (derzeit) nicht unter Windows ausgeführt. Daher hat das von Ihnen verwendete Tool einen Linux-Host in einer virtuellen VirtualBox-Maschine eingerichtet. Wenn Sie den docker run in Ihrer Umgebung ausführen, geschieht genau dasselbe - der Port 8080 des Linux-Hosts ist mit dem Port 8080 des Containers verbunden. Der große Unterschied besteht darin, dass Ihr Windows-Host nicht der Linux-Host ist, auf dem der Container ausgeführt wird. Es gibt also eine weitere Ebene hier und die Kommunikation über diese Ebene hinweg, wo Sie Probleme haben.

Was Sie brauchen, ist eines von zwei Dingen:

  1. so verbinden Sie Port 8080 an der VirtualBox VM mit Port 8080 am Windows-Host, so wie Sie den Docker-Container an den Host-Port anschließen.

  2. um die VirtualBox VM direkt mit Ihrem lokalen Netzwerk zu verbinden, verwenden Sie den oben beschriebenen bridged-Netzwerkmodus.

Wenn Sie sich für die erste Option entscheiden, können Sie auf den Container unter http://W:8080 zugreifen, wobei W die IP-Adresse oder der Hostname des Windows-Hosts ist. Wenn Sie sich für die zweite Option entscheiden, können Sie auf den Container unter http://L:8080 zugreifen, wobei L die IP-Adresse oder der Hostname der Linux-VM ist.

Das ist alles die übergeordnete Erklärung - jetzt müssen Sie herausfinden, wie Sie die Konfiguration der VirtualBox-VM ändern können. Und hier kann ich Ihnen nicht wirklich helfen - ich weiß nicht, mit welchem ​​Tool Sie das alles auf Ihrem Windows-Rechner machen, und ich bin überhaupt nicht mit Docker unter Windows vertraut.

Wenn Sie zum VirtualBox-Konfigurationsfenster gelangen, können Sie die unten beschriebenen Änderungen vornehmen. Es gibt auch einen Befehlszeilen-Client, der VMs modifiziert, aber ich bin damit nicht vertraut.

Im bridged-Modus (und dies ist wirklich die einfachste Wahl), fahren Sie die VM herunter, klicken Sie oben auf die Schaltfläche "Einstellungen" und ändern Sie den Netzwerkmodus in bridged. Starten Sie dann VM neu, und Sie können das tun gehen. Die VM sollte eine IP-Adresse in Ihrem lokalen Netzwerk über DHCP beziehen und für andere Computer im Netzwerk unter dieser IP-Adresse sichtbar sein.

66
Kryten
  1. Öffnen Sie Oracle VM VirtualBox Manager
  2. Wählen Sie das von Docker verwendete VM aus
  3. Klicken Sie auf Einstellungen -> Netzwerk
  4. Adapter 1 sollte (Standardeinstellung?) "Attached to: NAT" sein
  5. Klicken Sie auf Erweitert -> Portweiterleitung
  6. Regel hinzufügen: Protokoll TCP, Host Port 8080, Guest Port 8080 (Host-IP und Guest-IP leer lassen)
  7. Gast ist Ihr Docker-Container und Host ist Ihr Computer

Sie sollten jetzt über localhost: 8080 und Ihre interne IP-Adresse: 8080 zu Ihrem Container navigieren können.

95
Davey Chu

Nachdem ich einige Dinge ausprobiert hatte, funktionierte dies für mich:

  • verwenden Sie das Docker-Flag --publish = 0.0.0.0: 8080: 8080
  • stellen Sie den Virtualbox-Netzwerkmodus auf NAT ein und verwenden Sie keine Portweiterleitung

Mit anderen Adressen als 0.0.0.0 hatte ich keinen Erfolg.

3
mnieber

TLDR: Wenn Sie die Windows-Firewall aktiviert haben, stellen Sie sicher, dass in privaten Netzwerken eine Ausnahme für "vpnkit" vorliegt.

In meinem speziellen Fall stellte ich fest, dass die Windows-Firewall meine Verbindung blockierte, als ich versuchte, den veröffentlichten Port meines Containers von einem anderen Computer in meinem lokalen Netzwerk aus zu besuchen, da das Deaktivieren alles ermöglichte.

Ich wollte die Firewall jedoch nicht vollständig deaktivieren, nur um auf den Dienst meines Containers zugreifen zu können. Dies stellte die Frage, welche "App" für den Dienst meines Containers zuhörte. Nachdem ich einen anderen SO -Thread gefunden hatte, in dem ich gelernt habe, netstat -a -b zu verwenden, um die Apps hinter den Listening-Steckplätzen auf meinem Computer zu entdecken, erfuhr ich, dass es vpnkit.exe war, das bereits einen Eintrag in meinen Windows-Firewall-Einstellungen hatte: aber "Private Networks" wurde deaktiviert, und nachdem ich sie aktiviert hatte, konnte ich den Containerdienst von einem anderen Computer aus besuchen, ohne die Firewall vollständig deaktivieren zu müssen.

1
Atul Varma

Dies ist das häufigste Problem, das Windows-Benutzer beim Ausführen von Docker Containers haben. IMO das ist die "Millionen-Dollar-Frage zu Docker"; @ "Rocco Smit" hat zu Recht darauf hingewiesen, dass der eingehende Datenverkehr für die Firewall meines Host-Computers standardmäßig deaktiviert war. "; in meinem Fall meine McAfee Anti Virus-Software. Ich habe in den Firewall-Einstellungen von McAfee zusätzliche Ports hinzugefügt, die für eingehenden Datenverkehr von anderen Computern in demselben WLAN-LAN zugelassen sind. dann war es magisch. Ich hatte mehr als eine Woche lang Probleme, im Internet zu surfen, SO, Docker-Dokumentationen, Tutorials nach dem Networking von Docker und die vielen Illustrationen von "nicht unterstützt unter Windows" für "macvlan", "ipvlan", "user" definierte Brücke "und sogar diesen gleichen SO - Thread ein paar Mal. Ich habe sogar angefangen, Google mit "jemandem, der Docker in Production verwendet?" Zu durchsuchen (ja, ich weiß, dass Linux für Prod-Workloads im Vergleich zu Windows-Servern beliebter ist), da ich (von meinem Handy im selben Heim-WLAN) nicht auf einen Nginx zugreifen konnte App in Docker Container unter Windows bereitgestellt. Was nützt es schließlich, wenn Sie nicht von anderen Computern/Geräten im selben LAN auf die Anwendung (in einem Docker-Container bereitgestellt) zugreifen können. In meinem Fall ging es letztlich nur darum, dass eine Firewall den eingehenden Datenverkehr blockierte.

0
banarasi

Ich kann nicht glauben, dass Sie von außerhalb des Host-Computers keine Verbindung zum Docker-Container herstellen können. Ich benutze Docker seit über einem Jahr und habe Systeme unter Linux eingerichtet. Diese Woche habe ich zum ersten Mal Docker für Windows verwendet und bin schockiert, dass es so schwierig ist, einen Socket auf dem Host zu erstellen.

Gibt es eine Lösung für dieses Problem oder muss ich Docker wirklich in einem VM ausführen, das über einen Bridged-Adapter verfügt?

0
muman

Ich habe festgestellt, dass Docker für Windows neben dem Festlegen der -p-Port-Werte vpnkit verwendet und der eingehende Datenverkehr für die Firewall meines Host-Computers standardmäßig deaktiviert ist. Nachdem ich die Regeln für eingehende TCP für vpnkit aktiviert hatte, konnte ich von anderen Computern im lokalen Netzwerk auf meine Container zugreifen.

0
Rocco Smit