본문 바로가기
카테고리 없음

[Docker] docker run -p 옵션과 Dockerfile의 EXPOSE 차이점

by 왕 달팽이 2020. 3. 13.
반응형

도커의 네트워크 관련된 설정 중에 포트와 관련된 설정이 있습니다. Docker를 실행할 때 -p 옵션으로 포트 포워딩을 해주는 것과 Dockerfile에서 EXPOSE를 통해 포트를 노출시키는 것이 어떻게 다른지 정리해보겠습니다.

docker run -p 명령

도커 컨테이너를 실행 시킬 때, '-p' 옵션으로 호스트 운영체제와 컨테이너 환경의 포트를 매핑 시킬 수 있습니다. 예를 들어

docker run -it -p 5005:5005 centos

이렇게 컨테이너를 새로 만들면, 호스트 운영체제의 5005번 포트와 컨테이너의 5005 포트가 매핑됩니다. 호스트 운영체제의 5005 포트로 전달된 정보들이 도커를 통해 컨테이너의 5005 포트로 포워딩된다는 의미입니다.

도커를 실행할 때 -p 옵션은 꼭 같은 번호로 하지 않아도 됩니다.

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번 포트로 매핑된 것을 확인할 수 있습니다.

반응형

댓글