ports와 expose 차이

Kyunglim_Khang·2021년 5월 24일
1

docker

목록 보기
1/1

ports

ports이미지와 함께 보자면, 호스트OS 내부를 'WORLD INSIDE DOCKER'로 보시면 되고 외부 호스트를 'WORLD OUTSIDE DOCKER'로 보시면 됩니다.

출처: https://stackoverflow.com/questions/40801772/what-is-the-difference-between-docker-compose-ports-vs-expose


ports는 호스트OS와 컨테이너의 포트를 바인딩 시켜줍니다. (ports 3306:3306)

ports는 호스트 포트와 컨테이너 포트를 모두 노출시키기 때문에,
호스트 내부의 컨테이너끼리는 컨테이너 포트로 특정 컨테이너에 접근할 수 있고,
호스트 외부에서는 컨테이너 포트와 바인딩된(연결된) 호스트 포트를 통해 특정 컨테이너에 접근할 수 있습니다.

  • 형식: "host:container" 또는 "container"
#"host:container"
ports:
	- "8080:8080"

#또는 "container" => 이 경우 host는 랜덤한 값으로 정해짐
ports:
	- "8080"

expose

expose이미지와 함께 보자면, 호스트OS 내부를 'WORLD INSIDE DOCKER'로 보시면 되고 외부 호스트를 'WORLD OUTSIDE DOCKER'로 보시면 됩니다.

출처: https://stackoverflow.com/questions/40801772/what-is-the-difference-between-docker-compose-ports-vs-expose



expose는 호스트 포트를 공개하지 않고 컨테이너의 포트만 공개합니다 (expose 3306)

호스트 내부의 컨테이너끼리는 컨테이너 포트로 특정 컨테이너에 접근할 수 있지만,
호스트 외부의 경우, 외부 호스트에서 특정 컨테이너에 접근하려고 할 때, 그 컨테이너 포트와 바인딩된(연결된) 호스트 포트가 없기 때문에 해당 컨테이너에 접근할 수 없습니다.
이러한 특징 때문에 expose는 도커 내부에서 컨테이너 간의 통신만 필요한 경우에 주로 사용됩니다.

expose:
	- "8080"

정리

ports 와 expose는 모두 컨테이너 포트를 노출시키는 역할을 한다는 점에서는 동일합니다.
단, expose로 노출시키는 경우, 호스트 내부에서만 접근이 가능합니다.
반면, ports로 노출시키는 경우에는 호스트 외부의 다른 호스트들도 ports 에 설정한 호스트 포트를 통해 접근이 가능합니다.

ex) A 컨테이너의 expose 를 "8080" 으로 설정해줬다면, 같은 호스트 내부의 B 컨테이너가 8080 포트로 A 컨테이너에 접근 가능. 단, 외부 호스트들은 A 컨테이너에 접근 불가.
ex) A 컨테이너의 ports 를 "3307:3006" 으로 설정해줬다면, 컨테이너의 3306 포트가 호스트의 3307 포트로 매핑된 것 ⇒ 외부 호스트가 해당 호스트의 3307 포트를 통해 A 컨테이너에 접근 가능

즉, 외부 호스트들은 컨테이너의 포트만으로는 컨테이너에 접근할 수 없고, 컨테이너 포트와 매핑된 호스트 포트를 통해서만 호스트 내부의 컨테이너에 접근할 수 있습니다.
이때, 호스트 포트와 컨테이너 포트를 매핑시켜 컨테이너 포트를 노출시키는 것이 ports 이고, 이때 공개된 호스트 포트를 통해 외부 호스트들도 컨테이너에 접근할 수 있습니다.
반면, 호스트 포트를 공개하지 않고 컨테이너 포트만 노출시키는 것이 expose 이고, 공개된 호스트 포트가 없기 때문에 외부 호스트들은 컨테이너에 접근할 수 없습니다.

참고

What is the difference between docker-compose ports vs expose

[Docker] ports와 expose의 차이

[Docker CE] docker-compose 문법 간단 정리 (2) (ports, expose, depends_on, nevironment, env_file, container_name, labels, volumes, volumes_from)

🧐도커 관련해서 가장 좋은 참고 자료는 공식 문서

Compose file version 3 reference

기능이나 옵션에 대해 궁금한 게 있다면 1차적으로 공식 문서 참고,

그 다음은 직접 테스트해보기 추천.

추가로 궁금한 것

  • expose에서 -p 옵션을 활용하면 ports와 똑같이 사용할 수가 있다고 함. 이 부분 자세히 모르겠음. (근데 우선은 expose로 설정하고 -p 옵션을 붙여서 ports 처럼 사용하거나 말거나를 추후에 결정하면 될 듯?)
  • A라는 컨테이너가 있고, 이 컨테이너는 H1 라는 호스트에 있을 때, H2라는 외부 호스트가 A라는 컨테이너에 접근할 수 없는 상황은 어떤 건지....? (구체적인 상황이 떠오르지가 않음)
  • 그래서 어떤 상황에서 호스트 포트를 공개해야 할 지, 아니면 공개하지 말아야 할 지도 감이 안 잡히는 듯

    => 내부적으로 컨테이너 연결만이 목적이라면 expose로 충분. 내부적으로만 쓸 목적이라면 외부로부터의 접근은 불필요하기 때문. (필요한 만큼 최소한으로만 공개를 하는 것이 보안상으로 좋다)

    ex) 장고 컨테이너와 db 컨테이너를 compose로 띄우는 상황. db의 경우 외부로 노출하지 않는 것이 좋고, 컨테이너끼리의 연결만으로 충분하기 때문에 expose를 활용하면 이점이 더 많을 것!

0개의 댓글