도커(Docker) 컨테이너 기술을 도입하여 단일 서버 환경에서 애플리케이션을 가동하다 보면, 서비스의 규모가 커짐에 따라 단일 노드(Single Node)의 한계에 직면하게 됩니다. 물리적인 서버 한 대가 고장 나거나 시스템 점검에 들어가면 서비스 전체가 중단(Downtime)되며, 갑작스러운 트래픽 증가에 대응하기 위해 컨테이너 인스턴스를 여러 대로 확장하여 부하를 분산하는 작업 역시 수동으로 제어하기에는 많은 어려움이 따릅니다.
이러한 문제를 해결하고 여러 대의 서버 자원을 하나의 거대한 가상 서버처럼 묶어서 통합 관리하는 기술을 컨테이너 오케스트레이션(Container Orchestration)이라고 합니다. 대표적인 도구인 쿠버네티스(Kubernetes)는 기능이 매우 강력하지만 학습 곡선이 높고 복잡한 반면, 도커에 기본 내장된 Docker Swarm(도커 스웜)은 추가적인 복잡한 설치 과정 없이 손쉽게 여러 서버를 하나의 클러스터(Cluster)로 구축할 수 있는 최적의 솔루션입니다.
본 글에서는 Docker Swarm의 기본 개념과 아키텍처 구조부터, 실제 여러 대의 리눅스 서버를 묶어 클러스터를 구축하는 세팅 방법, 그리고 서비스 배포 및 가동 상태 모니터링 가이드까지 상세히 알아 보겠습니다.
1. Docker Swarm의 개념과 클러스터링 도입의 장점
Docker Swarm은 도커 엔진 자체에 기본 통합되어 제공되는 네이티브 컨테이너 클러스터링 및 오케스트레이션 도구입니다. 별도의 복잡한 제어 프로그램이나 서드파티 소프트웨어를 설치하지 않고도 몇 가지 기본 명령어만으로 복수의 호스트 서버를 하나의 논리적 클러스터로 바인딩할 수 있습니다.
[이미지: 중앙의 Manager 노드가 작업 지시를 내리고 여러 Worker 노드들에 컨테이너들이 분산 배포되는 Docker Swarm 클러스터 아키텍처 구조도]
Docker Swarm을 도입하여 서버 클러스터를 구성할 때 얻을 수 있는 주요 장점은 다음과 같습니다.
- 초보자 친화적인 뛰어난 접근성: 쿠버네티스와 달리 별도의 인프라 구성이나 복잡한 설정 파일 없이 기존 도커 CLI 명령어 체계와 동일한 방식으로 클러스터를 관리할 수 있습니다.
- 고가용성(High Availability, HA) 보장: 클러스터 내 특정 노드 서버의 전원이 꺼지거나 다운되는 장애가 발생하더라도, Swarm 엔진이 이를 자동 감지하여 정상 작동 중인 다른 노드에 해당 컨테이너를 즉시 재배포(Failover)합니다.
- 유연한 스케일링(Autoscaling) 및 로드 밸런싱: 명령어 하나만으로 실행 중인 컨테이너 인스턴스 개수(Replicas)를 자유롭게 늘리거나 줄일 수 있으며, 외부 요청을 각 노드로 균등하게 분산시켜 줍니다.
- 무중단 롤링 업데이트(Rolling Update): 기존 서비스를 정지하지 않고 구버전 컨테이너를 하나씩 순차적으로 최신 버전으로 교체하여 24시간 끊김 없는 웹 서비스 운영이 가능합니다.
2. Docker Swarm 노드 구성 요소: 매니저(Manager) vs 워커(Worker)
Docker Swarm 클러스터는 역할을 명확히 분담한 2가지 종류의 노드(Node, 서버)들로 구성됩니다.
노드 역할 분담 및 특징
- 매니저 노드 (Manager Node)
- 클러스터의 전체 상태를 유지 관리하고, 스웜 상태를 동기화하며, 서비스 배포 및 컨테이너 스케줄링을 전담하는 중앙 제어 서버입니다.
- Raft 합의 알고리즘(Raft Consensus Algorithm)을 사용하여 매니저 노드 간 데이터를 안전하게 공유하므로, 고가용성을 위해 운영 환경에서는 3대 이상의 홀수 개(3, 5대 등)로 구성하는 것이 권장됩니다.
- 매니저 노드 역시 필요에 따라 컨테이너를 직접 구동하는 워커 노드의 역할을 겸임할 수 있습니다.
- 워커 노드 (Worker Node)
- 매니저 노드로부터 할당받은 실제 작업 단위(Task/Container)를 전달받아 애플리케이션을 실행하고 구동하는 실행 서버입니다.
- 클러스터 관리나 상태 결정에는 관여하지 않으며, 지정된 컨테이너 프로세스의 구동과 리소스 제공에 집중합니다.
3. 실전 Docker Swarm 클러스터 구축 3단계
두 대 이상의 리눅스 서버(예: 매니저 노드 1대, 워커 노드 2대)에 도커(Docker)가 미리 설치되어 있다는 가정하에 진행하는 클러스터 구축 실전 가이드입니다.
[이미지: 터미널에서 docker swarm init 명령어를 실행하여 생성된 토큰(Token) 구문을 다른 워커 노드에 입력해 클러스터에 합류시키는 장면]
메인 제어 서버로 사용할 첫 번째 서버(Manager) 터미널에 접속하여 스웜 모드를 초기화합니다.
- 명령어: docker swarm init --advertise-addr [매니저_서버_IP]
- 실행 예시: docker swarm init --advertise-addr 192.168.0.10
- Verification: 명령 실행 성공 후 터미널에 Swarm initialized 메시지와 함께 다른 서버를 워커 노드로 추가할 수 있는 docker swarm join --token ... 구문이 출력되는지 확인합니다.
워커로 참여시킬 각 서브 서버들의 터미널에 접속한 뒤, 아까 매니저 노드에서 출력되었던 조인 토큰 명령어를 그대로 복사하여 입력합니다.
- 명령어: docker swarm join --token [발급받은_토큰값] [매니저_서버_IP]:2377
- Verification: 각 서브 서버 터미널에 This node joined a swarm as a worker. 메시지가 표시되는지 확인합니다.
매니저 노드 터미널로 돌아와 클러스터에 등록된 전체 서버 노드들의 연결 상태를 점검합니다.
- 명령어: docker node ls
- Verification: 모든 노드의 STATUS가 Ready로 표시되고 AVAILABILITY가 Active 상태로 목록에 출력되는지 최종 확인합니다.
4. Swarm 서비스 배포 및 스케일링(Replicas) 구동법
클러스터 구축이 완료되면 단일 docker run 대신 docker service 명령어를 통해 클러스터 전체에 컨테이너를 배포하고 확장할 수 있습니다.
- Swarm 서비스 생성 및 배포 (docker service create)
- 매니저 노드에서 Nginx 웹 서버 서비스를 클러스터에 새로 등록하여 실행합니다.
- 명령어: docker service create --name my-web --publish published=80,target=80 --replicas 2 nginx
- 배포된 서비스 상태 조회 (docker service ps)
- 서비스 내의 개별 컨테이너(Task)들이 어느 노드 서버에 분산되어 구동 중인지 확인합니다.
- 명령어: docker service ps my-web
- 실시간 컨테이너 인스턴스 확장 (docker service scale)
- 트래픽 증가에 대응하기 위해 컨테이너 개수(Replicas)를 2개에서 5개로 순식간에 확장합니다.
- 명령어: docker service scale my-web=5
- Verification: docker service ls 명령을 입력하여 REPLICAS 항목이 5/5로 변경되고 노드들로 자동 분산되었는지 검증합니다.
자주 묻는 질문 (FAQ)
Q1. Docker Swarm과 쿠버네티스(Kubernetes) 중 어떤 것을 선택해야 하나요?
A1. 운영하고자 하는 인프라의 규모와 관리 인력의 숙련도에 따라 달라집니다. 소규모 개인 홈랩, 소기업, 또는 도커 기술에 익숙하지만 복잡한 관리 부담을 피하고 싶은 경우에는 도커 기본 내장 도구인 Docker Swarm이 훨씬 쉽고 직관적입니다. 반면 수백 대 이상의 대규모 인프라, 미세한 트래픽 제어, 복잡한 멀티 클라우드 생태계 관리가 필요한 기업형 서비스라면 쿠버네티스를 도입하는 것이 바람직합니다.
Q2. 클러스터를 구축할 때 서버 간에 반드시 개방해야 하는 방화벽 포트가 있나요?
A2. 네, 그렇습니다. Swarm 노드 간 원활한 통신과 데이터 동기화를 위해 호스트 서버 방화벽(UFW 등)에서 다음 포트들을 통동 개방해야 합니다.
- TCP 2377번: 클러스터 관리 통신용 포트
- TCP / UDP 7946번: 노드 간 상태 전파 및 멤버십 통신용 포트
- UDP 4789번: 오버레이 네트워크(Overlay Network) 패킷 통신용 포트
Q3. 특정 워커 노드 서버가 갑자기 고장 나서 꺼지면 서비스는 어떻게 되나요?
A3. 매니저 노드가 해당 워커 노드의 이탈을 즉시 감지합니다. 이어서 꺼진 서버에서 구동되던 컨테이너 개수만큼 정상 작동 중인 다른 노드에 컨테이너를 자동으로 새로 생성하여 지정된 전체 레플리카(Replicas) 수량을 그대로 유지합니다. 따라서 사용자는 서버 장애 상황에서도 서비스 중단 없이 안정적인 서비스를 이용할 수 있습니다.
결론
단일 도커 서버 운영의 한계를 넘어 안정적이고 유연한 가상화 시스템을 완성하는 핵심 열쇠는 바로 Docker Swarm 클러스터 구축입니다.
매니저 노드와 워커 노드의 단순한 3단계 연동 절차만으로 고가용성(HA)과 자동 부하 분산(Load Balancing)을 손쉽게 확보할 수 있으며, docker service scale 명령어를 통해 클러스터 내 컨테이너 수량을 자유자재로 제어할 수 있습니다.
본 가이드의 구축 순서와 서비스 배포 명령어를 참고하시어, 예기치 못한 서버 장애에도 24시간 끊김 없이 작동하는 강력한 나만의 컨테이너 클러스터 인프라를 직접 구축해 보시기 바랍니다.
'가상화 및 서브 PC 활용' 카테고리의 다른 글
| 리눅스 사용자 권한 관리: sudo 권한 부여 및 그룹(Group) 제어 기초 (0) | 2026.11.07 |
|---|---|
| 가상화 서버 네트워크 브리지(Bridge) 세팅: KVM/Proxmox 독립 IP 할당 (0) | 2026.11.06 |
| PostgreSQL / MySQL 도커 컨테이너 데이터베이스 백업 및 복원 방법 (0) | 2026.11.06 |
| 리눅스 패키지 관리 완벽 가이드: apt 명령어 사용법과 캐시 정리 (0) | 2026.11.06 |
| Cloudflare Tunnels 활용하기: 포트 포워딩 없이 안전하게 외부 웹 서비스 개방하는 방법 (0) | 2026.11.05 |