У меня есть один сервис, содержащий один контейнер.
в контейнере находится сервер django с открытым портом 8000.
А моя среда обслуживания и контейнера находится ниже.
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
Итак, когда я захожу внутрь контейнера, все работает хорошо.
/ #docker container exec -it 500e9b49dd35 wget localhost:8000
index.html 100%[===================>] 77.36K --.-KB/s in 0s
Однако я не могу подключиться кwget localhost:8082
Connecting to localhost:8082 (127.0.0.1:8082)
wget: can't connect to remote host (127.0.0.1): Connection refused
Я что-то не так понял???
Пожалуйста, помогите мне. Я действительно приветствую любую помощь или подсказку.
Это тесты, предложенные @BMitch (спасибо!!)
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:*
Я решил проблему.
Это связано с сервером, а не с переадресацией портов.
мой сервер
python manage.py runserver
это связывает127.0.0.1
поэтому я изменился на
python manage.py runserver 0.0.0.0:8000
Я могу получить доступ снаружи.
Спасибо за помощь.
решение1
Из этого вывода видно, что ваше приложение внутри контейнера прослушивает 127.0.0.1 или выполняет петлю:
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:*
Сетевое взаимодействие в пространстве имен в docker, включая интерфейс loopback. Таким образом, каждый контейнер имеет свой собственный интерфейс loopback, отдельный от хоста и других контейнеров по умолчанию. Вам необходимо настроить приложение для прослушивания всех интерфейсов, чтобы приложение было доступно извне контейнера, включая работу опубликованных портов. В IPv4 это означает прослушивание 0.0.0.0 вместо 127.0.0.1. Это необходимо настроить в самом приложении, docker не контролирует порты, используемые приложением, он только перенаправляет на эти порты.