본문 바로가기
Tools

[Docker] 도커파일의 EXPOSE와 "docker run -p " 명령의 차이점

by A6K 2021. 5. 6.

도커 컨테이너로 애플리케이션을 구동할 때 컨테이너의 포트를 호스트의 포트와 매핑시킬 수 있다. 도커의 포트포워딩과 관련한 옵션에는 실행시 줄 수 있는 'docker run -p' 옵션과 도커 파일에 명시할 수 있는 EXPOSE 절이 있다. 이번 포스트에서는 이 둘의 차이점 정리해보겠다.

목차

    docker run -p 명령

    도커 컨테이너를 실행할 때, '-p' 옵션을 이용해서 호스트 운영체제의 포트와 컨테이너의 포트를 매핑시킬 수 있다. 예를 들어 다음 명령을 이용해 컨테이너를 실행했다고 해보자.

    docker run -it -p 5005:5005 ubuntu

    -p 옵션으로 호스트 머신의 5005번 포트와 컨테이너의 5005번 포트를 매핑 시킬 수 있다. 이렇게 실행이되면, 호스트 운영체제의 5005번 포트로 들어오는 데이터들이 도커 컨테이너의 5005번 포트로 포워딩된다.

    -p 옵션으로 줄 수 있는 포트 매핑은 꼭 같은 번호로 하지 않아도 된다.

    docker run -it -p 8088:80 webserver

    이런식으로 호스트 운영체제의 8088번 포트를 컨테이너의 80번 포트로 연결할 수도 있다. 도커에 여러개의 컨테이너를 띄울 때, 

    docker run -it -p 8081:80 webserver
    docker run -it -p 8082:80 webserver
    docker run -it -p 8083:80 webserver
    docker run -it -p 8084:80 webserver
    docker run -it -p 8085:80 webserver

    이런식으로 호스트 운영체제의 8081~8085번 포트를 각각 컨테이너들의 80번 포트로 연결시킬 수 있다. 각 컨테이너의 프로그램은 동일하게 80번 포트를 보고 있지만 호스트 운영체제에서는 8081~8085번 포트를 사용하게 된다.

    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"]

    EXPOSE절을 이용해서 5005번 포트를 명시했다. 'EXPOSE 5005'의 의미는 "이 도커 이미지는 5005번 포트를 외부에 공개할 예정이다"라는 의미다. 딱 거기까지다. EXPOSE를 명시했다고 자동으로 외부에 공개되는 것은 아니고  'docker run -p' 옵션으로 포트를 명시하지 않으면 컨테이너의 포트가 호스트 운영체제에 공개되지 않는다.

    다만 EXPOSE 구문으로 명시한 포트는 'docker run -P' 명령을 이용할 때 호스트 운영체제로 오픈된다. -p 옵션으로 포트들을 하나씩 매핑하지 않고, EXPOSE 구문으로 외부에 공개할 포트들을 도커파일에 명시한 다음 -P 옵션을 주면, 호스트 운영체제의 랜덤 포트 번호가 컨테이너의 EXPOSE 구문으로 명시한 포트에 매핑된다. 

    그 밖에 도커를 다루는 GUI 프로그램에서 -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번 포트로 매핑된 것을 확인할 수 있다.

    댓글