docker run -p와 Dockerfile의 EXPOSE
개요
매번 헷갈리기에 이 참에 제대로 정리
참고 링크: https://hbase.tistory.com/98
EXPOSE 공식문서: https://docs.docker.com/engine/reference/builder/#expose
docker run -p 공식 문서: https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose
TL;DR
EXPOSE는 Dockerfile 안에 명시하는데 도커 이미지를 실행하면 해당 port를 외부에 공개할 예정이라는 말이다. 실제로 공개하려면 docker run -p 또는 docker run -P 명령을 써야 한다.
Dockerfile 안에 EXPOSE 5005 라고 하였다면
docker run -p 6006:5005 // 호스트의 6006으로 접근하면 도커 컨테이너의 5005로 연결해주라는 말이며
docker run -P // 로 대문자 P를 사용하면 호스트의 사용하지 않는 임의의 포트가 도커 컨테이너의 5005로 연결된다.
공식문서 EXPOSE
런타임에 컨테이너가 특정 포트를 듣고 있는다는 말이다.
TCP, UDP를 명시할 수 있으며 디폴트는 TCP이다.
EXPOSE를 썼다고 실제로 해당 포트를 공개(publish) 하는 것은 아니다.
위에 언급한 대로 docker run 할 때에 -p 또는 -P 옵션을 사용해야 한다.
중요. EXPOSE 에 어떤 포트를 명시했건 상관없이 -p 로 특정 포트를 할당하면 그걸로 overwrite된다.
공식문서 docker run -p
아래 명령은 도커 컨테이너를 실행하며 호스트의 80포트를 도커 컨테이너의 8080포트와 연결한다.
여기서는 TCP를 명시했다.
127.0.0.1이라고 명시하지 않았다면 외부에서도 접근이 가능하다.