Docker

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

암낫어로봇 2024. 5. 30. 19:51
반응형

`docker run` 명령어에서 `-p [도커호스트포트]:[컨테이너포트]` 옵션을 주는 것과 Dockerfile에서 `EXPOSE` 명령어를 사용하여 컨테이너의 포트를 열어주는 것이 개념적으로 어떻게 다른건지 정리한다.

 

docker run -p 옵션

도커 호스트의 포트와 실행되는 컨테이너의 포트를 매핑하는 명령어이다.

이 옵션은 -p [도커호스트포트]:[컨테이너포트] 형태로 사용되며, 콜론을 기준으로 왼쪽에 입력되는 포트는 도커를 실행하는 컴퓨터인 도커 호스트의 포트 번호이고, 오른쪽에 입력되는 포트는 docker run 명령어를 통해 실행하는 컨테이너의 포트를 의미한다.

 

예를 들어, 아래와 같이 명령어를 작성하는 경우

docker container run -p 8000:80 [이미지이름]

 

다음 그림과 같이 HOST의 8000번 포트와 컨테이너의 80번 포트가 연결된다.

외부 클라이언트가 HOST의 8000번 포트로 접속 시, 컨테이너의 80번 포트에 해당하는 애플리케이션에 접근 가능해진다.

Host의 8000번 포트와 컨테이너의 80번 포트가 내부적으로 연결

 

 

Dockerfile의 EXPOSE

Dockerfile은 Docker 이미지를 빌드하기 위해 사용되는 파일이다. 이미지를 생성하기 위해 필요한 명령어들이 모여있다.

그 중에서도 EXPOSE는 컨테이너가 사용할 포트를 미리 문서화해두는 개념이다. 컨테이너 내부에서 사용할 포트를 지정하지만, 실제로 포트를 어딘가에 노출하거나 호스트에 매핑하는 작업이 아니다.

 

예를들어 `EXPOSE 80` 이라는 명령은, "이 Dockerfile을 빌드해 생성된 이미지로 실행될 컨테이너가 80번 포트를 사용할 것이다." 라고 미리 명시해두는 것이다. 단순히 EXPOSE 80이라고 Dockerfile 작성 후 별도의 포트포워딩(-p 옵션) 없이 컨테이너를 생성하면, 랜덤한 도커 호스트 포트번호와 컨테이너의 80번 포트가 자동으로 매핑된다.

 

결국 도커 호스트의 특정 포트와 컨테이너의 특정 포트를 구체적으로 매핑해주고 싶다면 docker run -p 옵션을 사용해야 하고, 컨테이너에서 사용할 포트를 미리 명시만 해두고 싶다면 Dockerfile EXPOSE에 작성해두면 된다.

 

사용 예시

Dockerfile 작성

FROM nginx
EXPOSE 80

 

Dockerfile을 사용한 이미지(my_nginx) 빌드

docker build -t my_nginx .

 

docker run -p 옵션을 통해 호스트 8080번 포트와 컨테이너 80번 포트 매핑

docker run -p 8080:80 my_nginx

 


참고 자료

https://soft.plusblog.co.kr/139

 

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

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

soft.plusblog.co.kr

 

반응형