본문 바로가기

DevOps & Infra/Docker

[Infrastructure/Docker] EXPOSE와 docker run -p의 차이점

EXPOSE

도커 파일에서 사용되는 EXPOSE 구문은 컨테이너가 지정된 네트워크 포트에서 수신함을 명시합니다. 포트 번호와 함께 TCP 또는 UDP에서 수신되는지 지정할 수 있으며, 프로토콜을 지정하지 않았다면 디폴트는 TCP입니다.

EXPOSE [포트 번호|포트 번호/프로토콜]

EXPOSE가 컨테이너가 포트를 실제로 공개하는 것은 아닙니다. 이미지를 빌드하는 주체가 이를 컨테이너에서 실행하는 사용자에게 알리는 일종의 설명문 또는 주석문과 같은 용도입니다.

도커 파일에서 다음 구문은 컨테이너가 8080 포트를 오픈해야 하며, TCP 포트임을 명시하고 있습니다.

# 해당 이미지를 사용하는 컨테이너는 80 포트를 오픈해야 합니다.
EXPOSE 80

포트와 프로토콜을 함께 명시하려면, 다음과 같이 도커 파일을 작성합니다.

# 해당 이미지를 사용하는 컨테이너는 80/TCP 포트를 오픈해야 합니다.
EXPOSE 80/TCP

두 개 이상의 포트를 명시하려면, 다음과 같이 도커 파일을 작성합니다.

# 해당 이미지를 사용하는 컨테이너는 80/TCP 포트를 오픈해야 합니다.
EXPOSE 80/tcp
# 해당 이미지를 사용하는 컨테이너는 80/UDP 포트를 오픈해야 합니다.
EXPOSE 80/udp

docker run -p

docker run -p는 도커 명령문에서 사용되는 플래그 중 하나입니다. -p 플래그는 docker run 명령문으로 실행되는 컨테이너와 호스트의 포트를 맵핑시킵니다.

docker run -p [호스트 포트]:[컨테이너 포트] [이미지 이름]

예를 들어, 호스트의 8080 포트에 입력되는 패킷을 컨테이너로 포워딩하려면 다음 예시와 같이 컨테이너를 실행합니다.

docker run -p 8080:8080 [이미지 이름]

호스트에서 컨테이너로 포워딩하는 포트는 서로 간에 일치해야하는 것은 아닙니다.

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

호스트의 다수 포트를 컨테이너의 단일 포트에 맵핑하는 것도 가능합니다. 다음은 5개의 컨테이너를 실행하며, 호스트의 8080~8084 포트를 실행되는 컨테이너의 80포트에 순차적으로 맵핑합니다.

docker run -p 8080:80 [이미지 이름]
docker run -p 8081:80 [이미지 이름]
docker run -p 8082:80 [이미지 이름]
docker run -p 8083:80 [이미지 이름]
docker run -p 8084:80 [이미지 이름]

EXPOSE와 docker run -p의 차이점

정리하면 EXPOSE는 이미지를 빌드하는 주체가 이를 컨테이너에서 실행하는 사용자에게 알리는 일종의 설명문 또는 주석문입니다. 반면 docker run -p 명령문을 사용한 컨테이너의 실행은 호스트의 포트로 입력되는 패킷을 실행 컨테이너의 포트로 포워딩합니다. 따라서 EXPOSE에서의 명시처럼 사용자는 컨테이너의 실행 시 호스트와 컨테이너 포트를 맵핑해야합니다.