해결된 질문
작성
·
617
2
docker run -d -p 8080:3000 --name defaultColorApp devwikirepo/envnodecolorapp
해당 도커 실행 명령어 중 docker run -d -p 8080:3000
명령어는 호스트의 8080 포트를 컨테이너의 3000 포트에 매핑하여 실행한다.
docker run -d -p 8080:3000 docker run -d -p 8080:3001
로 내부 컨테이터 포트를(3000 -> 3001) 바꾸게 되면 동작하지 않습니다. 제 생각에는 해당 이미지에 할당된 포트번호 있다고 예상했고 docker image inspect devwikirepo/envnodecolorapp
을 실행 후 해당 이미지 Json에 포트번호가 있는것을 확인했습니다.
"ExposedPorts": {
"3000/tcp": {}
},
1. "ExposedPorts" 의 "3000/tcp": 내부 컨테이너 포트번호는 별도로 세팅할 수 없나요?
2. 제가 시도하여 찾은 "ExposedPorts"의 "3000/tcp": {} 이 docker run -d -p 8080:3000
명령어의 :3000 과 같나요?
3. 8080:3001
로 내부 컨테이너 포트번호를 변경 시 컨테이너 실행은 정상적으로 되지만 왜 Nginx에 접속할 수 없는 걸까요?
답변 1
2
최종민님 안녕하세요. 데브위키입니다.
먼저 컨테이너의 포트에 궁금증을 가지고 접근하시는 방식이 아주 좋은 접근이신 것 같습니다.
먼저 8080:3000 를 8080:3001 로 바꾸어서 접근해 보셨는데요.
이렇게 포워딩 정보를 바꾸셔도 컨테이너 실행에는 문제가 되지 않습니다.
다만 문제는 컨테이너 안에서 실행되는 내부 프로세스가 실제 사용하는 포트가 3000번으로 고정되어 있기 때문에, 3001번으로 접근하면 정상적인 응답이 돌아오지 않는 것입니다. 프로세스가 사용하는 포트는 소스코드 안에서 지정합니다.
정리하자면 포트를 지정하는 부분은 총 3가자 입니다.
애플리케이션이 실제로 사용하는 포트(소스코드에서 지정합니다)
이미지 작성 시 지정하는 포트: 프로그램이 사용하는 포트는 소스코드를 봐야만 알 수 있기 때문에, 이미지 제작 시 EXPOSE라는 지시어를 사용해서 프로그램이 사용하는 포트를 편의상 이미지에 기록할 수 있습니다. 기록된 정보는 docker inspect 명령 사용 시 ExposedPorts로 표시됩니다.
포트포워딩을 사용해서 호스트의 포트를 통해 컨테이너의 특정 포트로 접근하도록 설정하는 부분입니다.
포트포워딩을 8080:3001 로 바꾸실 경우 내부에서 프로세스가 사용하는 포트는 여전히 3000이기 때문에 접근이 되지 않는 것입니다.
이 부분은 제가 동일한 내용으로 네트워크 파트의 포트포워딩 부분에 실습을 만들어 둔 것이 있습니다!
혹시 궁금하시면 네트워크 파트를 먼저 들으셔도 커리큘럼은 문제없이 수강하실 수 있으니 한 번 들어보시는 것도 추천 드립니다 😀
친절한 답변 감사합니다. ㅎㅎ 완강이 기대되는 강의입니다