Docker

[Docker] Docker Swarm host mode로 서비스 생성하기

박만자 2022. 7. 27. 20:35

본 포스팅은 ingress에 대한 지식을 필요로 합니다. ingress에 대한 정보는 아래 글을 참고해주시길 바랍니다.

https://yoo11052.tistory.com/184

 

[Docker] Docker Swarm Network의 종류

도커 스웜 네트워크 스웜 모드는 여러 개의 노드에 같은 컨테이너를 분산해서 할당하기 때문에 각 노드를 하나로 묶어줄 네트워크가 필요합니다. 뿐만 아니라 서비스를 외부에서 접근한다 했을

yoo11052.tistory.com

 

Docker Swarm에서는 서비스를 생성하면 기본적으로 ingress mode로 서비스를 생성합니다.

ingress mode로 서비스를 생성하게되면 서비스로 요청이 들어올 시 서비스로 생성된 컨테이너 중 하나로 요청을 redirect하게 됩니다.

예시로 nginx 서비스를 띄운후 inspect 명령어로 정보를 출력해봤습니다.

$ docker service inspect nginx | jq '.[].Endpoint.Ports'
[
  {
    "Protocol": "tcp",
    "TargetPort": 80,
    "PublishedPort": 80,
    "PublishMode": "ingress"
  }
]

 

위와 같이 PublishModeingress로 되어있는 것을 보실 수 있습니다. 

때문에 별도의 모드를 지정하지 않고 서비스를 생성해도 다음과 같이 자동으로 로드밸런싱이 가능했던 것입니다.

ingress mode

host mode

만약 로드밸런싱이 필요하지 않은 경우에는 어떻게 해야 할까요?

node-exporter나 cadvisor 같은 exporter의 경우 해당 노드에 있는 메트릭 정보를 수집해야 하기 때문에 다른 컨테이너로 요청을 redirect 해선 안됩니다.

따라서 이 경우 docker swarm에서 제공하는 host mode를 사용하여 해결할 수 있습니다.

host mode는 ingress mode와 달리 요청을 다른 컨테이너로 redirect하지 않습니다. host mode로 생성된 서비스에 요청을 보내면 해당 노드에서 실행되고 있는 컨테이너로 직접 요청을 전달합니다.

host mode

host mode로 서비스를 생성하는 방법은 간단합니다.

다음과 같이 -p 옵션뒤에 mode=host로 지정해 주면됩니다. 다만 host mode로 서비스를 생성 시 해당 노드에 컨테이너가 실행중인지 알 수 없기 떄문에 글로벌 서비스로 생성해주어야 합니다.

$ docker service create --name nginx --mode global -p mode=host,target=80,published=80 nginx:latest

 

다음과 같이 PublishMode가 host로 설정되있는 것을 보실 수 있습니다.

$ docker service inspect nginx | jq '.[].Endpoint.Ports'
[
  {
    "Protocol": "tcp",
    "TargetPort": 80,
    "PublishedPort": 80,
    "PublishMode": "host"
  }
]

 

참고