지난 포스팅에서 도커 컴포즈(Docker Compose)를 이용해 하나의 서버 내에서 웹과 데이터베이스를 동시에 띄우는 방법을 알아보았습니다. 하지만 비즈니스가 성장하여 트래픽이 폭주한다면, 단 한 대의 물리적 서버(또는 가상머신)로는 한계에 부딪히게 됩니다. 만약 그 유일한 서버의 하드웨어가 고장 난다면 서비스는 즉시 중단되고 맙니다.
이러한 물리적 한계를 극복하기 위해 **여러 대의 서버를 하나로 묶어 거대한 하나의 서버처럼 관리하고, 서비스 중단 없이 업데이트를 배포하는 기술을 ‘컨테이너 오케스트레이션(Container Orchestration)’**이라고 합니다.
쿠버네티스(Kubernetes)가 이 분야의 사실상 표준(De facto)이지만, 학습 곡선이 매우 가파릅니다. 중소규모의 프로젝트나 오케스트레이션 입문자에게는 도커에 기본적으로 내장되어 있어 설정이 매우 쉬운 **도커 스웜(Docker Swarm)**이 최고의 선택지입니다. 오늘은 도커 스웜을 활용한 다중 서버 환경 구축과 대망의 ‘무중단 배포(Zero-Downtime Deployment)’ 실무 적용법을 완벽하게 정리해 드리겠습니다.
1. 도커 스웜(Docker Swarm)의 핵심 개념: 매니저와 워커
도커 스웜으로 묶인 서버들의 무리를 **’클러스터(Cluster)’**라고 부릅니다. 이 클러스터 내부의 서버들은 역할에 따라 두 가지로 나뉩니다.
- 매니저 노드(Manager Node): 클러스터 전체를 관리하는 지휘관입니다. 워커 노드들의 상태를 감시하고, 새로운 컨테이너를 어느 서버에 배치할지 결정하며, 사용자의 명령을 수전하는 브레인 역할을 합니다. (고가용성을 위해 보통 홀수 개로 구성합니다.)
- 워커 노드(Worker Node): 매니저의 지시를 받아 실제 컨테이너를 실행하고 노동을 담당하는 일꾼 서버들입니다.
2. 다중 서버 클러스터 구축하기 (Swarm Init & Join)
여러 대의 서버(예: AWS EC2 인스턴스 3대)에 도커가 설치되어 있다고 가정하고 클러스터를 구성해 보겠습니다.
[Step 1] 매니저 노드 초기화 매니저 역할을 할 첫 번째 서버의 터미널에 접속하여 스웜 모드를 활성화합니다.
Bash
docker swarm init --advertise-addr [매니저_서버의_공인_또는_사설_IP]
명령어를 실행하면 화면에 docker swarm join --token ... 으로 시작하는 긴 명령어가 출력됩니다. 이 명령어는 다른 서버를 워커로 합류시키기 위한 **초대장(Token)**입니다.
[Step 2] 워커 노드 합류시키기 두 번째, 세 번째 서버(워커 노드)에 차례대로 접속하여, Step 1에서 발급받은 초대장 명령어를 그대로 복사해서 붙여넣습니다.
Bash
docker swarm join --token [발급받은_토큰] [매니저_IP]:2377
This node joined a swarm as a worker.라는 메시지가 뜨면 성공입니다. 다시 매니저 노드로 돌아와 docker node ls 명령어를 치면 3대의 서버가 하나의 클러스터로 아름답게 묶인 것을 확인할 수 있습니다.
3. 서비스(Service) 배포와 스케일링(Scaling)
단일 도커에서는 docker run 명령어로 ‘컨테이너’를 띄웠지만, 스웜 환경에서는 **’서비스(Service)’**라는 개념을 사용합니다. 서비스는 여러 개의 동일한 컨테이너(레플리카)를 묶어서 관리하는 논리적인 단위입니다.
[Nginx 웹 서버 5개로 확장 배포하기] 매니저 노드에서 아래 명령어를 실행하여 Nginx 웹 서버를 띄워봅니다.
Bash
docker service create --name my_web --publish 80:80 --replicas 5 nginx:latest
--replicas 5옵션이 핵심입니다. Nginx 컨테이너 5개를 3대의 서버(매니저 1대, 워커 2대)에 골고루 분산시켜서 띄우라는 지시입니다.- 만약 워커 노드 1번이 갑자기 다운되어 그 안의 컨테이너 2개가 죽어버리면, 매니저 노드는 이를 즉각 감지하고 살아있는 다른 서버에 컨테이너 2개를 새로 생성하여 무조건 5개의 개수(상태)를 유지합니다. 이것이 바로 스웜의 강력한 ‘자가 복구(Self-Healing)’ 능력입니다.
4. 실무의 꽃: 무중단 배포(Zero-Downtime) 롤링 업데이트 구현
서비스를 운영하다 보면 소스 코드를 업데이트하여 새로운 버전의 이미지를 배포해야 합니다. 과거에는 기존 서버를 끄고 새 서버를 켜는 동안 ‘점검 중입니다’라는 화면을 띄워야 했지만, 도커 스웜의 **’롤링 업데이트(Rolling Update)’**를 사용하면 사용자 모르게 무중단 배포가 가능합니다.
현재 myapp:v1 이라는 이미지로 서비스가 5개 돌아가고 있다고 가정해 보겠습니다. 이를 myapp:v2 로 업데이트하려면 매니저 노드에서 아래의 명령어를 입력합니다.
Bash
docker service update \
--image myapp:v2 \
--update-delay 10s \
--update-parallelism 1 \
my_web
[옵션 상세 설명]
--image myapp:v2: 새로 배포할 V2 이미지를 지정합니다.--update-parallelism 1: 한 번에 1개의 컨테이너씩만 업데이트하라는 뜻입니다.--update-delay 10s: 하나의 컨테이너를 업데이트한 후, 다음 컨테이너를 업데이트하기 전까지 10초 동안 대기(안정화)하라는 뜻입니다.
[무중단 배포의 동작 원리] 명령어를 실행하면 5개의 V1 컨테이너 중 1개를 종료시키고 V2 컨테이너를 새로 띄웁니다. 그 10초 동안 접속하는 사용자들은 살아있는 4개의 V1 컨테이너로 알아서 연결되므로 서비스 중단을 겪지 않습니다. 이렇게 1개씩 순차적으로 교대하며 최종적으로 5개 모두 V2로 교체되는 마법 같은 무중단 배포가 완성됩니다.
결론: 쿠버네티스로 가기 전 반드시 거쳐야 할 관문
도커 스웜은 매니저와 워커 노드의 개념, 레플리카(복제본) 유지, 그리고 롤링 업데이트라는 현대 오케스트레이션 시스템의 핵심 원리를 완벽하게 품고 있으면서도 세팅이 믿을 수 없을 만큼 간단합니다.
실제 실무 현장에서도 수십 대 이상의 거대한 인프라가 아니라면, 복잡한 쿠버네티스 대신 가볍고 직관적인 도커 스웜을 메인 인프라로 채택하는 강소기업들이 매우 많습니다. 단일 서버의 한계를 넘어 진정한 의미의 무중단 아키텍처를 설계하는 첫걸음, 도커 스웜 클러스터링을 직접 구축하고 테스트해 보시기 바랍니다. 인프라 엔지니어로서의 시야가 획기적으로 넓어지는 것을 경험하실 수 있을 것입니다.