도커스웜에 대해 학습한다.
도커스웜을 알아보기 전에 먼저 컨테이너 오케스트레이션에 대해 학습해보자.
컨테이너 오케스트레이션은 애플리케이션 배포 시 컨테이너의 네트워킹 및 관리를 자동화하는 프로세스이다. 프로비저닝과 스케줄링에서 배포, 삭제 등 전체 수명 주기를 자동화하여 컨테이너 인프라 관리를 최소화할 수 있도록 돕는다.
오케스트레이션과 컨테이너 오케스트레이션이란?
오케스트레이션: 여러 컴포넌트 또는 서비스가 함께 작동하도록 조정하고 관리하는 프로세스
컨테이너 오케스트레이션: 특정 시스템에서 여러 컨테이너 관리를 자동화하는 과정. 오케스트레이션 중에서도 컨테이너 기반 서비스 운영에 초점을 맞춘다.
주요 컨테이너 오케스트레이션으로는 Kubernetes와 Docker Swarm이 있다.
Docker는 컨테이너 패키징을 위한 오픈소스 도구로, 단일 서버 인스턴스에서 여러 컨테이너를 관리하기 위해 사용할 수 있지만 확장이 어렵다. 다중 서버 환경에서 컨테이너 관리를 수행하려면 복잡한 코드를 짜야 했고, 이를 다시 버전관리하거나 설정을 확장하는 등 어려움이 많았다. 컨테이너 오케스트레이션을 사용하면 이러한 복잡성을 자동화하고 해결하여 수동 관리에 관련된 문제를 해소할 수 있다.
기존에는 일반적으로 컨테이너 또는 그를 실행하는 시스템이 다운되더라도 다시 시작되지 않았다. 컨테이너 오케스트레이션은 컨테이너를 자동으로 재시작하거나 머신 장애 시 항상 두 개 이상의 버전이 실행되도록 할 수 있다.
컨테이너화된 애플리케이션의 확장성, 가용성 및 성능을 자동화할 수 있다. 수요나 네트워크 가용성, 인프라 제한에 따라 확장하도록 구성할 수 있다. 컨테이너 오케스트레이션은 컨테이너 네트워크 전반의 성능을 모니터링하고 최적의 성능을 위해 컨테이너를 자동으로 재구성할 수 있다.
서버 및 인스턴스는 실행 비용이 들기에 비용 최적화를 위해 효율적으로 사용해야 한다. 컨테이너 오케스트레이션을 사용하면 사용 가능한 각 인스턴스의 사용을 극대화하고, 리소스가 부족한 경우에는 온디맨드 인스턴스를 새로 구성할 수 있다. 이를 통해 인프라 비용을 절감할 수 있다.
컨테이너 오케스트레이션은 서버 인스턴스(노드) 그룹에서 컨테이너를 관리하는 방식으로 작동한다. 상호 연결된 컨테이너를 실행하는 노드 그룹을 클러스터라고 한다.
컨테이너 오케스트레이션은 클러스터의 모든 노드에서 실행되는 기본 컨테이너화 솔루션이 필요한데, 보통 여기에 Docker를 사용한다. 마스터 노드는 오케스트레이션 솔루션 자체의 컨트롤러이다. 관리자는 마스터 노드의 GUI나 명령줄 컨트롤러를 사용하여 컨테이너 오케스트레이션 도구를 관리하고 모니터링할 수 있다.
컨테이너 오케스트레이션 솔루션은 YAML 또는 JSON으로 작성된 선언적 구성 파일을 읽고 시스템 상태를 파악한 후 다음을 수행한다.
1. 컨테이너 레지스트리에서 컨테이너 이미지를 가져온다.
2. 컨테이너에 개별 요구 사항을 제공한다.
3. 컨테이너 간에 필요한 네트워킹을 결정한다.
이후에는 다중 컨테이너 애플리케이션을 스케줄링하고 클러스터 전체에 배포한다. CPU나 메모리 등 노드의 리소스 제약 조건과 정의된 컨테이너 요구사항을 기반으로 각 컨테이너를 실행할 노드를 선택한다.
컨테이너가 클러스터 전체에서 실행되면 컨테이너 오케스트레이션 솔루션이 전체 시스템 상태를 관리하며 지정된 성능을 유지하도록 한다. 여기에는 다음 과정이 포함될 수 있다.
컨테이너 오케스트레이션 솔루션을 사용하더라도 기본 리소스 관리가 필요하다. 컨테이너 대신 오케스트레이션 도구의 리소스 프로비저닝을 관리해야 한다.
컨테이너 오케스트레이션을 최적으로 사용하기 위해서는 오케스트레이션을 올바르게 처리하고, 원하는 상태를 정의하며, 모니터링 결과를 이해할 수 있는 숙련된 도구 관리자가 필요하다. 복잡한 컨테이너 환경을 성공적으로 관리하기 위해서는 DevOps, CI/CD 프로세스, 컨테이너화, 머신 아키텍처에 대한 깊은 이해가 필요하다.
소프트웨어 애플리케이션은 버전이 지정되며 스테이지, 프로덕션 등 특정 환경을 위한 빌드가 있다. 마찬가지로 컨테이너 오케스트레이션 도구에는 버전 기록과 함께 문서화된 여러 구성이 필요하다.
위에서도 스치듯 언급했지만 도커(Docker)만으로는 다중 호스트 환경에서의 컨테이너 관리가 힘들다. 아래의 문제들이 발생하기 때문이다.
도커스웜은 도커가 공식적으로 개발한 오케스트레이션 도구로, 도커가 다중 호스트 환경에서 클러스터링하여 단일 가상 호스트로 사용할 수 있도록 돕는다.
사실 도커스웜은 쿠버네티스가 컨테이너 오케스트레이션에서 큰 입지를 차지하고 있는 상황에서 매력적이지 않을 수 있다. 하지만 그럼에도 도커스웜을 사용하기 좋은 이유가 있다.
YAML 파일을 사용한다.
도커스웜은 클러스터 관리 기능으로, 여러 도커 호스트를 하나의 호스트인 것처럼 사용할 수 있게 한다. 여기에서 각 호스트 노드는 매니저 노드 혹은 워커 노드로 구분할 수 있다.
매니저 노드는 스웜 클러스터의 관리 및 조정을 담당한다. 클러스터 내의 모든 워커 노드를 관리하고 노드에 서비스를 스케줄링하며 클러스터의 상태를 유지한다. 매니저 노드는 클러스터의 리더 역할로, 클러스터 내에 여러 매니저 노드가 존재할 수 있다. 이 중 하나가 리더 노드로 선출되어 클러스터를 관리한다. 규모가 크지 않은 경우 단일 매니저 노드를 주로 사용한다.
매니저 노드로부터 할당받은 작업을 수행하며, 컨테이너를 실행하는 역할을 한다. 매니저 노드가 스케줄링한 서비스를 실행하고 서비스 상태를 매니저 노드에 보고한다.
도커에는 bridge, Host 등 여러 네트워크가 있지만 도커스웜에서는 Overlay 네트워크를 사용한다. 오버레이 네트워크는 여러 도커 데몬이나 클러스터 노드 간에 통신이 가능하도록 하는 네트워크 모델이다. 이는 여러 분산된 컨테이너 간에 동일한 물리적 네트워크에 연결된 것처럼 통신할 수 있도록 한다.
오버레이 네트워크는 물리 네트워크 위에 가상 네트워크 계층을 추가함으로써 동작한다. 이를 통해 각 컨테이너는 독립적인 네트워크 네임스페이스(Network Namespace)를 가질 수 있으며, 이는 각 컨테이너가 독립적인 IP 주소 등을 가질 수 있음을 의미한다.

서비스는 단일 도커 이미지를 기반으로 클러스터 안에서 구동시킬 컨테이너 묶음이다. 도커(Docker)의 기본 배포 단위가 컨테이너(Container)였다면, 도커스웜(Docker Swarm)의 기본 배포 단위는 서비스(Service)이다.
서비스는 도커 이미지, 실행할 명령, 포트 등 컨테이너의 스펙을 정의하고 어떤 노드에서 해당 컨테이너를 실행할 것인지 결정한다. 또한 레플리카의 개수를 지정하여 동일 컨테이너를 동시에 여러 개 실행하도록 할 수도 있다.
서비스의 명세에 따라 생성되어 노드에 배치되는 개별 컨테이너의 배포 단위는 태스크(Task)이다.
도커스웜에서 특정 서비스의 인스턴스를 레플리카라고 한다. 스택에서 서비스의 레플리카 수를 지정할 수 있다. 레플리카 수는 서비스의 복제본 수를 의미하며, 지정된 수만큼 클러스터 내에 컨테이너를 띄운다. 이를 통해 서비스 규모를 조정하거나 고가용성을 확보할 수 있다.
도커스웜은 레플리카의 상태를 모니터링하며 레플리카가 실패하거나 노드에 문제 발생 시 자동으로 레플리카를 재시작하거나 다른 노드에 레플리카를 재배치하여 서비스의 안정성과 가용성을 보장한다.
도커스웜은 분명 사용법이 간단한 것이 장점이지만, 자세히 들어가면 명령어가 다양하다. 따라서 자세히 궁금하다면 아래 포스트에 잘 설명되어 있으니 여기를 참고하자.
Docker Swarm의 주요 용어, 활성화 방법 및 노드(Node) 관리법 살펴보기
컨테이너 오케스트레이션이란 무엇인가요? - aws
컨테이너 오케스트레이션 (Docker Swarm, Kubernetes)
Docker Swarm의 주요 용어, 활성화 방법 및 노드(Node) 관리법 살펴보기
All about 도커스웜
Docker Swarm - 네이버 블로그