본문 바로가기
개발과 기술

[Docker] ports와 expose의 차이

by growd 2020. 5. 7.

개발, 배포, 운영에 큰 장점이 있는 가상화/컨테이너 애플리케이션인 도커(docker)는 그 이점들이 있기 때문에 최근 많이 사용이 되고 있습니다. 도커를 사용함에 있어서 초보자들에게 매우 헷갈리는 부분으로 ports와 expose 설정이 있습니다. 두 설정 모두 컨테이너의 포트번호 설정에 관한 것으로 어떨 때 무엇을 사용해야 하는지 매우 헷갈리는 부분이 존재합니다.

 

 

 


 

 

 

결론부터 말씀드리자면,

 

expose와 ports 모두 컨테이너 포트를 노출 시키는 것이지만 expose는 호스트 내부의 다른 컨테이너들만 액세스가 가능하고 ports로 노출하면 ports에 설정한 호스트 포트번호로 호스트 외부의 다른 호스트들도 호스트 포트번호로 액세스가 가능합니다. 물론 이 부분은 호스트의 포트 공개 여부에 따라 다를 수 있지만 기본적으로는 이런 특징을 가집니다.

 

아래와 같이 docker-compose를 설정을 한다면,

 

db:
  image: mysql:latest
  ports:
    - "3307:3306"
node:
  image: node:latest

 

위의 mysql 컨테이너는 컨테이너 내부의 3306포트가 호스트의 3307 포트로 매핑이 되게 됩니다. 위의 node 컨테이너는 3307 포트로 mysq 컨테이너로 액세스가 가능하고 다른 호스트 또한 위 호스트의 3307 포트로 mysql 컨테이너에 액세스가 가능하게 됩니다.

 

 

 

아래와 같이 docker-compose를 설정한다면,

 

db:
  image: mysql:latest
  expose:
    - "3306"
node:
  image: node:latest

 

위의 mysql 컨테이너는 호스트 내부에서 3306포트를 노출하게 됩니다. node 컨테이너는 3306 포트로 mysql 컨테이너에 액세스가 가능하지만 호스트 외부의 다른 호스트들을 mysql 컨테이너로 액세스가 불가합니다.

 

 

 


 

 

 

추가적으로 위의 docker-compose파일을 설명하겠습니다.

 

my_db:
  image: mysql:latest
  expose:
    - "3306"
my_node:
  image: node:latest

 

위 파일에서 db 또 node는 docker-compose로 실행하게될 컨테이너의 서비스명입니다. docker-compose로 컨테이너들을 동시에 실행하게 되면 docker 엔진 내부에서 my_db 혹은 my_node라는 이름의 호스트네임을 가지게 됩니다. 쉽게 말하여 docker 엔진에서 내부에서 my_db 혹은 my_node라는 url 주소를 가지게 됩니다. 예를들어, nginx에서 upstream_server로 node 컨테이너를 설정할 때 위와 같이 설정된 경우라면 my_node를 server로 설정해주면 됩니다.

 

 

댓글