만자의 개발일지

[Docker] Docker Stack이란? 본문

Docker

[Docker] Docker Stack이란?

박만자 2022. 8. 2. 15:48

Docker Stack

Docker Compose가 여러 개의 컨테이너로 구성된 어플리케이션을 관리하기 위한 도구라면, Docker Stack은 여러 개의 서비스로 구성된 어플리케이션을 관리하기 위한 도구입니다. 서비스를 관리하기 때문에 Docker Stack은 Swarm mode에서만 사용할 수 있습니다.

 

Docker Stack의 구조는 Docker Compose와 비슷하지만 지원하는 옵션이나 내부 로직에서 차이가 있습니다.

Docker Compose는 기본 네트워크가 브릿지 네트워크로 생성되지만 Docker Stack은 Overlay 네트워크가 생성됩니다.

또한 links, devices, privileged 등등 Docker Compose 에서는 지원하는 옵션들이 Docker Stack 에서는 지원하지 않으므로 Docker Stack이 어떤 옵션을 지원하는지 잘 찾아보고 사용하셔야 합니다.

 

Docker Stack 사용하기

Docker Stack의 사용 방법은 매우 간단합니다.

먼저 다음과 같이 Swarm Cluster를 구성해줍니다. 매니저 노드 1개와 워커 노드 2개로 구성해 주었습니다.

$ docker node ls
ID                            HOSTNAME                                         STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
ob8gjt15kes3rd3o9bv1komse *   ip-10-0-0-206.ap-northeast-2.compute.internal    Ready     Active         Leader           20.10.13
gkofukpbdg4pe9rnxv9fyaffz     ip-10-0-10-154.ap-northeast-2.compute.internal   Ready     Active                          20.10.13
z7y2xasu8rug8g7bmoealq39a     ip-10-0-11-168.ap-northeast-2.compute.internal   Ready     Active                          20.10.13

 

그다음 예시로 다음과 같이 YAML 파일로 서비스를 정의해줍니다.

version: "3.9"

services:
    monitoring:
      image: dockersamples/visualizer
      ports:
        - "9000:8080"
      volumes:
        - /var/run/docker.sock:/var/run/docker.sock
      deploy:
        mode: global
        placement:
          constraints:
            - node.role == manager
    web:
      image: nginx
      ports:
        - "80:80"
      deploy:
        mode: global
        placement:
          constraints:
            - node.role == worker

워커 노드에는 nginx를 배포하고 매니저 노드에는 visualizer를 배포해주도록 설정해 주었습니다.

visualizer는 Swarm mode에서 노드와 컨테이너의 분포상태를 시각적으로 볼 수 있게해주는 도구입니다. 

 

그다음 docker stack deploy 명령어로 서비스를 배포해줍니다. -c 옵션으로 배포할 서비스가 정의된 YAML 파일을 지정해줄 수 있습니다.

$ docker stack deploy -c <yaml-file> <stack-name>

 

배포가 정상적으로 완료되었다면 매니저 노드의 visualizer로 Swarm 클러스터내 서비스의 상태를 모니터링할 수 있습니다.

 

또한 docker stack ps 명령어로 스택이 관리하는 서비스의 상태를 확인할 수 있습니다. 

$ docker stack ps <stack-name>
ID             NAME                                        IMAGE                             NODE                                             DESIRED STATE   CURRENT STATE            ERROR     PORTS
v0p8lbctx6s5   demo_monitoring.ob8gjt15kes3rd3o9bv1komse   dockersamples/visualizer:latest   ip-10-0-0-206.ap-northeast-2.compute.internal    Running         Running 15 seconds ago
rxdkyr2245vx   demo_web.gkofukpbdg4pe9rnxv9fyaffz          nginx:latest                      ip-10-0-10-154.ap-northeast-2.compute.internal   Running         Running 34 seconds ago
8ghp5gcphwsw   demo_web.z7y2xasu8rug8g7bmoealq39a          nginx:latest                      ip-10-0-11-168.ap-northeast-2.compute.internal   Running         Running 34 seconds ago

 

마지막으로 docker stack rm 명령어로 생성한 스택을 삭제합니다. 스택이 삭제되면 스택이 관리하던 서비스와 네트워크 모두 삭제됩니다.

$ docker stack rm <stack-name>

 

Comments