it-swarm.com.de

Zugriff auf den Webserver des Docker-Containers vom Host aus

Ich arbeite unter boot2docker 1.3.1.

Ich habe einen Docker-Container, auf dem ein Webserver über uwsgi --http :8080 ausgeführt wird.

Wenn ich an den Container gehe, kann ich die Website mit lynx http://127.0.0.1:8080 durchsuchen, damit ich weiß, dass der Server funktioniert.

Ich habe meinen Container mit:

$ docker run -itP --expose 8080 uwsgi_app:0.2

Es hat die folgenden Details:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
5248ad86596d        uwsgi_app:0.2     "bash"              11 minutes ago      Up 11 minutes       0.0.0.0:49159->8080/tcp   cocky_hypatia
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' 5248ad86596d
172.17.0.107

Ich dachte, ich könnte von meinem Host aus auf diese Website zugreifen, indem ich zu http://172.17.0.107:49159 gehe.

Das funktioniert nicht. Ich sehe nur "Verbinden ..." in Chrome und geht nirgendwohin.

Was mache ich falsch?

48
Anentropic

Ok, Dummkopf, ich fand die Antwort in den Dokumenten für boot2docker https://docs.docker.com/installation/mac/#container-port-redirection

Ich musste die IP-Adresse von boot2docker vm verwenden, nicht die IP des Containers, d. H.

$ boot2docker ip
192.168.59.103

und ich kann meine Website vom Host aus unter http://192.168.59.103:49159/ durchsuchen.

Ich musste keine route auf dem Host hinzufügen

34
Anentropic

Erweitern von Anentropicsanswer : boot2docker ist die alte App für Mac und Windows, docker-machine ist die neue.

Listen Sie zunächst Ihre Maschinen auf:

$ docker-machine ls

NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
default   *        virtualbox   Running   tcp://192.168.99.100:2376

Wählen Sie dann eine der Maschinen aus (die Standardmaschine heißt default) und:

$ docker-machine ip default

192.168.99.100
90
HankCa

Um die IP-Adresse Ihres Containers zu ermitteln, benötigen Sie KEINE zusätzlichen Installationen :

docker inspect <container>

Dies bietet eine Fülle von Informationen. grep es für die IP-Adresse.

9
JellicleCat

Sie können die Boot2docker-Portzuordnungsoption -L verwenden, wie hier beschrieben.

In Ihrem Fall wäre es also so

boot2docker ssh -L 0.0.0.0:8080:localhost:8080

und dann

docker run -it -p 8080:8080 uwsgi_app:0.2

Auf diese Weise müssen Sie nicht die IP-Adresse von boot2docker verwenden: Sie können localhost oder Ihre eigene IP-Adresse verwenden (und Ihr Docker-Container kann von außen aufgerufen werden).

4
Magic Wand

Hatte das gleiche Problem und in meinem Fall verwendete ich die AWS EC2-Instanz. Ich habe mit dem Container IP versucht, der nicht funktioniert hat. Dann habe ich die tatsächliche öffentliche IP des AWS Host als IP verwendet, die funktionierte.

1
Siva Dorai

Boot2docker ist veraltet, aber dieses Problem kann unter Docker für Windows oder Mac immer noch auftreten, obwohl derselbe Container unter Linux funktioniert. Ein Symptom ist, dass der Versuch, auf eine Seite auf dem Server innerhalb des Containers zuzugreifen, den Fehler "Es wurden keine Daten gesendet" im Gegensatz zu "Verbindung konnte nicht hergestellt werden" angezeigt. 

Wenn ja, kann dies daran liegen, dass der Container Host unter Win/Mac eine eigene IP hat. Dies ist kein localhost, da er unter Linux ist. Versuchen Sie, Django auf IP 0.0.0.0 auszuführen, was bedeutet, dass Sie Verbindungen von allen IPs akzeptieren, wie folgt:

python manage.py runserver 0.0.0.0:8000

Wenn Sie sicherstellen möchten, dass der Server nur auf lokale Anforderungen reagiert (z. B. von Ihrem lokalen Proxy wie Nginx, Apache oder Gunicorn), können Sie alternativ die von hostname -i zurückgegebene Host-IP verwenden.

Stellen Sie sicher, dass Sie die -pPortweiterleitungsoption korrekt im docker run-Befehl verwenden.

Vorausgesetzt, es ist alles in Ordnung, sollten Sie in der Lage sein, auf Ihren Server unter http: // localhost in einem Browser zuzugreifen, der auf dem Host-Computer ausgeführt wird.

1
Jonathan Stray

[EDIT: Originalversion ignorierte das fragliche -P]

Wenn Sie zu den Containern gelangen möchten, ohne den Port "veröffentlichen" zu müssen (wodurch seine Nummer geändert wird) Gibt es einen guten Durchlauf hier .

Der Schlüssel ist diese Zeile:

Sudo route -n add 172.17.0.0/16 172.16.0.11

damit wird dem Mac mitgeteilt, wie er an das private Netzwerk innerhalb der VirtualBox VM leitet, auf dem sich die Docker-Container befinden. 

1
Bryan

Problembehandlung bei der Hostanwendung im lokalen Hostbrowser

Für diesen Start des Containers mit dem folgenden Befehl war es in meinem Fall: 

[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
1b81d8a0e3e1        centos:baseweb      "/bin/bash"         8 minutes ago       Exited (0) 24 seconds ago                       webtest
[[email protected] ~]# docker run --name=atul -v /root/dockertest:/var/www/html -i -t -p 5000:8000 centos:baseweb /bin/bash

In der httpd-Konfiguration: 

[[email protected] /]# cd /etc/httpd/conf
[[email protected]28b08c9ed conf]# ll
total 52
-rw-r--r--. 1 root root 34419 Sep 19 15:16 httpd.conf

bearbeiten Sie die Datei mit dem Port 8000 in Listner und aktualisieren Sie die Container-IP und den Port unter Servername.

Starten Sie den httpd-Dienst neu und Sie sind fertig.

Hoffe das hilft

0
Atul