읽는 데 3분 25. May 2021
docker run -p 옵션과 Dockerfile의 EXPOSE와의 차이

docker run -p vs EXPOSE

도커 컨테이너를 실행할 때 사용하는 명령어인 docker run 명령어의 옵션 중 컨테이너의 포트를 호스트 OS와 매핑시킬 수 있는 옵션인 -p 옵션이 있다. 해당 옵션은 콜론을 기준으로 왼쪽은 들어오는 포트, 오른쪽은 매핑시킬 포트를 입력한다. 예를 들어 -p 8080:8080으로 입력한다.

도커 파일(Dockerfile)을 작성할 때 EXPOSE라는 옵션을 지정하여 컨테이너의 포트를 개방시킬 수 있다.

EXPOSE

도커 파일에 작성된 EXPOSE 옵션은 이 이미지가 해당 포트를 외부로 개방할 것이다. 라고 명시하는 것이지 EXPOSE로 지정되어 있다고 해서 사용자가 해당 포트로 접근이 가능하거나 한 것은 아니다. 컨테이너를 실행할 때 호스트 OS로 들어오는 포트와 해당 포트를 매핑시켜야 한다.

예를 들어 도커 파일에 EXPOSE 8888로 적혀있다면 해당 이미지로 생성된 컨테이너는 외부로 8888번 포트를 개방하겠다는 뜻이다. 그리고 호스트 OS에서 해당 컨테이너를 실행시킬 때 위 포트로 매핑시키면 드디어 의미가 있어진다.

사용

docker run -p 명령어를 사용해서 매핑시키는 포트의 왼쪽은 정리했듯이 호스트 OS로 들어오는 포트고, 오른쪽은 매핑시킬 컨테이너의 포트를 작성하면 된다. 여기서 실 사용자가 8080번 포트로 접속하면 컨테이너의 개방된 8888번 포트로 매핑시키고 싶다 하면 docker run -p 8080:8888 centos로 작성하면 된다는 소리이다.

-P 과 EXPOSE

도커 파일에 아래와 같이 3개의 포트를 개방한다고 가정한다.

EXPOSE 3000
EXPOSE 4000
EXPOSE 5000

호스트 OS에서 컨테이너를 실행할 때 매번 포트 룰을 정하는 것은 귀찮은 일이다. 랜덤한 포트를 지정해서 개방된 포트를 런타임에 매핑시킬 수 있다. 이미지를 빌드하고 명령어를 실행할 때, 소문자 p 대신 대문자를 사용하면 된다.

docker run -it -d -P exposed-ports bash
37760ccc5da912d1e6baa1e002f73c6f3b5facd50e08c35446b4780751dc82e4
docker port 37760ccc5da9

3000/tcp -> 0.0.0.0:49163
3000/tcp -> :::49163
4000/tcp -> 0.0.0.0:49162
4000/tcp -> :::49162
5000/tcp -> 0.0.0.0:49164
5000/tcp -> :::49164

포트가 자동으로 매핑된 것을 확인할 수 있다.