Portweiterleitungsdienst -> Container

Portweiterleitungsdienst -> Container

Ich habe einen Dienst, der einen Container enthält.

Im Container befindet sich ein Django-Server mit geöffnetem Port 8000.

Und meine Service- und Containerumgebung ist hier unten

docker container ls

CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS                   PORTS                   NAMES
500e9b49dd35        registry:5000/myapp/djangosrc:latest   "python manage.py ru…"   2 minutes ago       Up 2 minutes             80/tcp, 8000-8001/tcp   django_python.ti4iq9vbe6b6tskrnfni1r194.prc5s92pxrrfeerjj0oqnjykl

docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE                                    PORTS
l1z94x8t69li        django_python       global              1/1                 registry:5000/myapp/djangosrc:latest   *:8001->8001/tcp, *:8082->8000/tcp

Wenn ich also in den Container gehe, funktioniert es gut.

/ #docker container exec -it 500e9b49dd35 wget localhost:8000

index.html        100%[===================>]  77.36K  --.-KB/s    in 0s

Ich kann jedoch keine Verbindung herstellen mitwget localhost:8082

Connecting to localhost:8082 (127.0.0.1:8082)
wget: can't connect to remote host (127.0.0.1): Connection refused

Habe ich da etwas falsch verstanden???

Bitte helft mir. Ich bin für jede Hilfe und jeden Hinweis dankbar.


Dies sind von @BMitch vorgeschlagene Tests (danke!!)

docker run --rm --net container:500e9b49dd35 nicolaka/netshoot ss -lnt

Status: Downloaded newer image for nicolaka/netshoot:latest
State   Recv-Q   Send-Q     Local Address:Port      Peer Address:Port  Process  
LISTEN  0        128           127.0.0.11:40105          0.0.0.0:*              
LISTEN  0        10             127.0.0.1:8000           0.0.0.0:*            

Ich habe das Problem gelöst.

Dies liegt am Server und nicht an der Portweiterleitung.

mein Server ist

python manage.py runserver

es bindet127.0.0.1

also wechselte ich zu

python manage.py runserver 0.0.0.0:8000

Ich kann von außen zugreifen.

Ich danke Ihnen für Ihre Hilfe.

Antwort1

Anhand dieser Ausgabe können Sie erkennen, dass Ihre Anwendung im Container auf 127.0.0.1 lauscht oder einen Loopback durchführt:

docker run --rm --net container:500e9b49dd35 nicolaka/netshoot ss -lnt

Status: Downloaded newer image for nicolaka/netshoot:latest
State   Recv-Q   Send-Q     Local Address:Port      Peer Address:Port  Process  
LISTEN  0        128           127.0.0.11:40105          0.0.0.0:*              
LISTEN  0        10             127.0.0.1:8000           0.0.0.0:*            

Vernetzung im Namespace in Docker, einschließlich der Loopback-Schnittstelle. Jeder Container hat also seine eigene Loopback-Schnittstelle, die standardmäßig vom Host und anderen Containern getrennt ist. Sie müssen die Anwendung so konfigurieren, dass sie auf allen Schnittstellen lauscht, damit die Anwendung von außerhalb des Containers erreichbar ist, auch damit veröffentlichte Ports funktionieren. In IPv4 bedeutet das, dass auf 0.0.0.0 statt auf 127.0.0.1 lauscht wird. Dies muss in Ihrer Anwendung selbst konfiguriert werden, Docker steuert nicht die von der Anwendung verwendeten Ports, sondern leitet nur an diese Ports weiter.

verwandte Informationen