Dockerfile에서 EXPOSE와 "docker run -p " 명령의 차이점
도커 컨테이너를 다룰 때 네트워크 설정을 잘 이해하고 사용하는게 중요하다. 도커 환경에서 각 컨테이너들에 할당되는 내부 IP, Port와 호스트 운영체제의 IP, Port 사이의 관계를 잘 이해하고 있어야 도커 환경을 잘 사용할 수 있다.
docker run -p 명령
도커 컨테이너를 실행 시킬 때, '-p' 옵션으로 호스트 운영체제와 컨테이너 환경의 포트를 매핑 시킬 수 있다. 예를 들어
docker run -it -p 5005:5005 ubuntu
이렇게 컨테이너를 새로 만들면, 호스트 운영체제의 5005번 포트와 컨테이너의 5005 포트가 매핑된다. 즉, 호스트 운영체제의 5005 포트로 전달된 정보들이 컨테이너 환경의 5005 포트로 포워딩된다는 의미다.
docker run -it -p 8088:80 webserver
포트 매핑은 꼭 같은 번호로 하지 않아도 된다. 위 명령처럼 컨테이너를 실행하면 호스트 운영체제의 8088번 포트가 컨테이너의 80번 포트로 연결된다.
Dockerfile의 EXPOSE
도커 이미지를 만들 수 있는 Dockerfile에 EXPOSE 명령을 사용할 수 있다. 예를 들어
FROM openjdk:8
COPY Test.class /root
WORKDIR /root
EXPOSE 5005
ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005", "Test"]
이런 Dockerfile이 있을 때 EXPOSE 명령을 이용해, '이 도커 이미지는 5005번 포트를 외부에 공개할 예정이다'라고 명시할 수 있다.
Dockerfile의 EXPOSE로 포트를 명시했다고해서 달라지는건 없다. 'docker run -p' 옵션으로 포트를 명시하지 않으면 컨테이너의 포트가 호스트 운영체제에 공개되지 않는다.
EXPOSE 구문으로 명시한 포트는 'docker run -P' 명령을 이용할 때 호스트 운영체제로 오픈된다. 이 때, 호스트 운영체제의 랜덤 포트 번호가 컨테이너의 EXPOSE 구문으로 명시한 포트에 매핑된다. 또 한, 도커를 다루는 GUI 프로그램에서 -p 옵션으로 줄 수 있게 힌트 역할을 할 수도 있다.
docker run -p 옵션과 docker run -P 옵션을 비교해보자.
우선 docker run -d -p 5005:5005 명령으로 컨테이너를 띄워보면,
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d94bd97ad9d test_container "java -agentlib:jdwp…" 3 seconds ago Up 2 seconds 0.0.0.0:5005->5005/tcp adoring_mclean
PORTS 정보에 0.0.0.0:5005->5005/tcp 라는 항목을 볼 수 있다. 호스트의 5005번 포트와 컨테이너의 5005번 포트가 매핑된 것을 알 수 있다.
두 번째로 docker run -d P 명령으로 컨테이너를 띄워봤다.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d2dc4b0f8b5 test_container "java -agentlib:jdwp…" 10 minutes ago Up 10 minutes 0.0.0.0:32768->5005/tcp heuristic_lamarr
0.0.0.0:32768->5005/tcp 이라는 정보에서 호스트 운영체제의 랜덤 포트 번호가 컨테이너의 5005번 포트로 매핑된 것을 확인할 수 있다.