Skip to content

Docker swarm #

Find similar titles

12회 업데이트 됨.

Edit
  • 최초 작성자
  • 최근 업데이트
    shlee

개요 #

도커(Docker)는 컨테이너 기반 애플리케이션을 관리할 때 유용한 도구이다. 하지만 단일 호스트로 구성된 환경은 확장성(Scalability)과 가용성(Availabilty), 그리고 장애 허용성(Fault Tolerance) 측면에서 많은 한계가 있다.
만약 이용자가 늘어나면서 호스트의 가용 시스템 자원이 바닥나거나, 어떠한 이유로든 호스트가 일시적으로 작동 불능의 상태가 된다면 애플리케이션이 곧바로 중단되는 될 것이다. 따라서, 개인 블로그 정도의 작은 규모가 아닌 이상, 대부분은 여러 대의 호스트를 함께 운영하며 이러한 상황에 대비해야 한다.

그런데 다중 호스트 컨테이너 관리 등 도커만으로는 해결하기 어려운 또 다른 문제가 있다.

  • 서로 다른 각각의 호스트들을 어떻게 연결하고 관리할 것인가?
  • 어떤 컨테이너를 어느 호스트에 배치하여 구동시킬 것인가?
  • 각기 다른 호스트에 배치된 컨테이너들의 상호 통신을 어떻게 제어할 것인가?

바로 위와 같은 문제들을 해결하기 위해 나타난 것이 "컨테이너화된 애플리케이션에 대한 자동화된 설정, 관리 및 제어 체계", 즉 컨테이너 오케스트레이션(Container Orchestration)이다. 

도커는 자체적으로 컨테이너 오케스트레이션을 위한 도구를 마련해 두었다.

바로, 이번에 소개할 도커 스웜(Docker Swarm)이다.

도커 스웜(Docker Swarm) #

쿠버네티스가 컨테이너 오케스트레이션에 관한 사실상의 표준 기술로 자리 잡은 상태에서 도커 스웜(Docker Swarm)은 더 이상 매력적인 선택지가 아닐 수 있다.
그럼에도 아래와 같은 장점들이 있다.

쿠버네티스 만큼은 아니더라도, 여러 대의 호스트로 구성된 중소 규모의 클러스터에서 컨테이너 기반 애플리케이션 구동을 제어하기에 충분한 기능을 갖추고 있다.
도커 엔진(Docker Engine)이 설치된 환경이라면 별도의 구축 비용 없이 스웜 모드(Swarm Mode)를 활성화하는 것만으로 시작할 수 있다.
도커 컴포즈(Docker Compose)를 사용해 본 사람이라면 도커 스웜(Docker Swarm)의 스택(Stack)을 이용한 애플리케이션 운영에 곧바로 적응할 수 있다.
도커 데스크탑(Docker Desktop)으로도 클러스터 관리와 배포가 모두 가능한 단일 노드 클러스터를 바로 만들 수 있다.
따라서 최소한의 자원으로 컨테이너 오케스트레이션 환경을 만들어 시험해볼 수 있다.
이처럼 진입 장벽이 낮고, 간단한 구조로 빠르게 구현 가능한 특성은 큰 이점이다. 같은 컨테이너 오케스트레이션 도구로서 도커 스웜(Docker Swarm)에 대해 익힌 내용은 추후 쿠버네티스 등 엔터프라이즈 레벨의 도구를 다루는 과정에도 도움이 될 것이다.

주요 용어 정리 #

도커 스웜에서 흔하게 사용되는 주요 용어들을 설명한다.

  • 노드(Node) : 클러스터를 구성하는 개별 도커 서버.
  • 매니저 노드(Manager Node) : 클러스터 관리와 컨테이너 오케스트레이션을 담당한다. 쿠버네티스의 마스터 노드(Master Node)와 같은 역할이라고 할 수 있다.
  • 워커 노드(Worker Node) : 컨테이너 기반 서비스(Service)들이 실제 구동되는 노드를 의미한다. 쿠버네티스와 다른 점이 있다면, Docker Swarm에서는 매니저 노드(Manager Node)도 기본적으로 워커 노드(Worker Node)의 역할을 같이 수행할 수 있다는 것이다. 스케줄링을 임의로 막는 것도 가능하다.
  • 스택(Stack) : 하나 이상의 서비스(Service)로 구성된 다중 컨테이너 애플리케이션 묶음을 의미한다. 도커 컴포즈(Docker Compose)와 유사한 양식의 YAML 파일로 스택 배포를 진행한다.
  • 서비스(Service) : 노드에서 수행하고자 하는 작업을 정의해놓은 것으로, 클러스터 안에서 구동시킬 컨테이너 묶음을 정의한 객체라고 할 수 있다. 도커 스웜에서의 기본적인 배포 단위로 취급된다. 하나의 서비스는 하나의 이미지를 기반으로 구동되며, 이들 각각이 전체 애플리케이션의 구동에 필요한 개별적인 마이크로서비스(microservice)로 기능하다.
  • 태스크(Task) : 클러스터를 통해 서비스를 구동시킬 때, 도커 스웜은 해당 서비스의 요구 사항에 맞춰 실제 마이크로서비스가 동작할 도커 컨테이너를 구성하여 노드에 분배한다. 이것을 태스크(Task)라고 한다. 하나의 서비스는 지정된 복제본(replica) 수에 따라 여러 개의 태스크를 가질 수 있으며, 각각의 태스크에는 하나씩의 컨테이너가 포함된다.
  • 스케줄링(Scheduling) : 도커 스웜에서 스케줄링은 서비스 명세에 따라 태스크(컨테이너)를 노드에 분배하는 작업을 의미한다. 2022년 8월 기준으로 도커 스웜에서는 오직 균등 분배(spread) 방식만 지원하고 있다. 노드별 설정 변경 또는 라벨링(labeling)을 통해 스케줄링 가능한 노드의 범위를 제한할 수도 있다.

docker swarm 시작하기 #

사전 준비 사항 #

클러스터에 포함시킬 각 호스트에 도커 엔진(Docker Engine) 1.12 버전 이상이 설치되어 있어야 한다. 또한 아래의 포트들이 반드시 사용할 수 있는 상태여야 한다.

  • 2377/tcp : 클러스터 관리에 사용되는 포트.
  • 7946/tcp, 7946/udp : 노드 간 통신에 사용.
  • 4789/udp : 클러스터에서 사용되는 Ingress 오버레이 네트워크 트래픽에 사용.

클라우드 서비스를 이용할 경우 위의 내용이 포함된 보안 그룹(Security Group)을 생성한 뒤 각 호스트에 적용하면 된다.

Docker Swarm 모드 활성화 #

도커 엔진(Docker Engine) 자체에 도커 스웜(Docker Swarm)이 통합되어 있어서, 도커가 설치되어 있다면 아래의 한 줄 명령으로 스웜 모드(Swarm Mode)를 바로 시작할 수 있다.

docker swarm init

이렇게 되면 현재 접속 중인 호스트로 단일 노드로 구성된 클러스터가 새로 구축된다. 만약 특정 IP주소를 기준으로 클러스터를 시작하려면 아래와 같이 입력하면 된다.

docker swarm init --advertise-addr <매니저 노드 IP주소>

스웜 모드(Swarm Mode) 활성화가 완료되면 아래와 같은 내용이 출력된다.

Swarm initialized: current node (mozraz7r7nwrzx3olba9zul6m) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-2bw203esriuzboiwow9koelu6tzgnf262he3boyxno7orqk3o6-bgru21cio1ua0s76rm5ip9ia9 192.168.65.*:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

도커 스웜이 잘 활성화 되었는지 확인하고 싶다면 docker info 명령어를 입력해보면, 아래와 같이, Server.Swarm 값이 active로 바뀐 것을 볼 수 있다.

$ docker info |grep -i swarm: -A 20
Swarm: active
NodeID: mozraz7r7nwrzx3olba9zul6m
Is Manager: true
ClusterID: vfgryj6ukdy3mq4lmi65a4vry
Managers: 1 
... (이하 생략)

클러스터 만들기 #

단일 노드 클러스터 #

이제 노드 목록을 조회한다. 조금 전에 활성화한 매니저 노드 하나만 존재하는 단일 노드 클러스터가 구성된 것을 확인할 수 있다.

$docker node ls
ID   HOSTNAME   STATUS   AVAILABILITY   MANAGER STATUS   ENGINE VERSION
mozraz7r7nwrzx3olba9zul6m *   docker-desktop   Ready   Active   Leader   20.10.24

도커 데스크탑(Docker Desktop)에서도 위와 같은 방법으로 단일 노드 구성을 빠르게 진행할 수 있다. 단, 맥(Mac) 또는 윈도우(Windows)에서 도커 데스크탑(Docker Desktop)을 쓸 땐 여러 개의 노드로 구성된 클러스터를 만들 수 없다.

다중 노드 클러스터 #

도커 스웜(Docker Swarm)에서는 토큰(token)이 포함된 docker swarm join 명령을 이용하여 노드를 추가한다. 이때 삽입할 토큰 값은 추가할 노드의 종류에 따라 다르다. 참고로 첫 번째로 init을 실행한 노드 외의 나머지 노드에서는 별도로 docker swarm init을 할 필요가 없다.

앞서 첫 번째로 docker swarm init을 실행 완료한 노드에 출력된 안내문 일부를 다시 확인해 보겠다.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-2bw203esriuzboiwow9koelu6tzgnf262he3boyxno7orqk3o6-bgru21cio1ua0s76rm5ip9ia9 192.168.65.*:2377

안내문을 살펴보면 워커 노드 추가를 위한 명령어가 포함되어 있다. 워커 노드로 추가할 호스트에 접속해서 도커 엔진(Docker Engine) 설치와 필요 포트 개방을 마친 후, 위의 명령어를 실행시키면 This node joined a swarm as a worker.란 간결한 메시지와 함께 클러스터에 추가된다.

$ docker swarm join --token SWMTKN-1-2bw203esriuzboiwow9koelu6tzgnf262he3boyxno7orqk3o6-bgru21cio1ua0s76rm5ip9ia9 192.168.65.*:2377

// 노드 추가가 완료되면 아래 메시지가 출력.
This node joined a swarm as a worker.

만약 매니저 노드를 추가하고 싶다면, 매니저 노드로 돌아와 docker swarm join-token manager를 실행한다. 그러면 아래와 같이 별도의 토큰이 생성된다. 이것을 가지고 새 노드에서 docker swarm join 명령을 수행하면 된다.

// 매니저 노드 join용 토큰을 요청
$ docker swarm join-token manager
To add a manager to this swarm, run the following command:

docker swarm join --token SWMTKN-1- 2bw203esriuzboiwow9koelu6tzgnf262he3boyxno7orqk3o6-8tfrkout7lzjosycsm4nomhto 192.168.65.*:2377


// 매니저 노드로 추가할 호스트에 접속해서 위의 명령문을 실행.
$ docker swarm join --token SWMTKN-1-   2bw203esriuzboiwow9koelu6tzgnf262he3boyxno7orqk3o6-8tfrkout7lzjosycsm4nomhto 192.168.65.*:2377

// 노드 추가 완료 메시지
This node joined a swarm as a manager.

만약 워커 또는 매니저 노드 추가에 필요한 토큰값만 얻고 싶다면, docker swarm join-token 명령에 --quiet 플래그를 추가하면 된다.

참고 #

[https://seongjin.me/docker-swarm-introduction-nodes/](https://seongjin.me/docker-swarm-introduction-nodes/)

0.0.1_20230725_7_v68