하나의 컨테이너를 포함하는 하나의 서비스가 있습니다.
컨테이너에는 포트 8000이 열려 있는 django 서버가 있습니다.
내 서비스와 컨테이너 환경은 여기 아래에 있습니다.
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의 네임스페이스에 있는 네트워킹. 따라서 각 컨테이너에는 기본적으로 호스트 및 다른 컨테이너와 별도로 자체 루프백 인터페이스가 있습니다. 게시된 포트가 작동하는 것을 포함하여 컨테이너 외부에서 애플리케이션에 연결할 수 있으려면 모든 인터페이스를 수신하도록 애플리케이션을 구성해야 합니다. IPv4에서는 127.0.0.1 대신 0.0.0.0을 수신한다는 의미입니다. 이는 애플리케이션 자체에서 구성해야 하며, docker는 애플리케이션에서 사용하는 포트를 제어하지 않고 해당 포트로만 전달합니다.