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.