관리 메뉴

피터의 개발이야기

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

DevOps/Docker

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

기록하는 백앤드개발자 2025. 1. 8. 22:46
반응형

ㅁ 들어가며

 Docker를 설정하면서 포트 설정과 관련하여 Dockerfile의 EXPOSE 명령어와 "docker run -p" 옵션을 보게 된다. 이 두 가지는 비슷해 보이지만 실제로는 매우 다른 목적을 가지고 있다. 

 

EXPOSE: 문서화 및 메타데이터 제공되며, 이미지 빌드 시 적용됨.
"docker run -p": 컨테이너 실행 시 실제 포트 매핑 수행

 

ㅁ Dockerfile의 EXPOSE

 EXPOSE 명령어는 Dockerfile에서 사용되며, 컨테이너가 실행 중에 사용할 네트워크 포트를 지정하는 역할을 한다. 하지만 EXPOSE가 실제로 포트를 열어주지는 않는다.

FROM nginx
EXPOSE 80

 

문서역할: 이미지를 빌드할 때에 사용가능한 포트를 안내하는 커뮤니케이션 도구

실제 포트 개방 없음: EXPOSE만으로는 호스트와 컨테이너 간 포트 연결이 이루어지지 않는다.

랜덤포트: "docker run -P" 옵션을 사용하면 EXPOSE로 지정된 포트가 랜덤으로 연결된다.

 

ㅁ "docker run -p" 옵션

docker run -p 8080:80 my-nginx-image

실제 포트 매핑: "docker run -p" 옵션은 실제로 호스트와 컨테이너 간의 포트 매핑을 수행한다.

유연한 포트 지정: 호스트와 컨테이너의 포트 번호를 다르게 지정할 수 있다.

런타임 설정: 컨테이너 실행 시점에 포트 설정을 변경할 수 있다.

 

ㅁ "docker run -P" 옵션 테스트

$ docker run --help 중
  -P, --publish-all   Publish all exposed ports to random ports

ㅇ 설명에 -P 옵션은 모든 노출된 포트를 임의의 포트에 게시한다.

 

  -P 옵션을 사실 사용해 본 적이 없어서 테스트 해 보았다.

FROM nginx
EXPOSE 7070 9090

ㅇ Dockerfile 생성

 

# 빌드
$ docker build -t expose-test .

# 실행
$ docker run -P -itd --name test expose-test:latest

# 확인
$ docker ps
CONTAINER ID  IMAGE              ~~ PORTS                                                                   NAMES
b69abbbdf102  expose-test:latest ~~ 0.0.0.0:55003->80/tcp, 0.0.0.0:55004->7070/tcp, 0.0.0.0:55005->9090/tcp test

- 0.0.0.0:55003->80/tcp

- 0.0.0.0:55004->7070/tcp

- 0.0.0.0:55005->9090/tcp

모든 expose port에 임의 포트가 지정되어 있다.

 

ㅁ 마무리

 EXPOSE와 "docker run -p"는 서로 다른 목적과 사용 시점을 가지고 있다. EXPOSE는 이미지 설계 단계에서 의도된 포트를 명시하는 용도로, "docker run -p"는 실제 컨테이너 실행 시 포트 매핑을 수행하는 용도로 사용한다. 두 기능을 적절히 조합하여 사용하면 동적으로  포트를 이용하여 Docker 컨테이너의 네트워크 설정을 할 수 있다.

 

ㅁ 함께 보면 좋은 사이트

Dockerfile에서 EXPOSE와 "docker run -p " 명령의 차이점 

반응형
Comments