도커 스웜(Docker Swarm) 환경에서 컨테이너를 효율적으로 관리하기 위한 서비스(Service)의 개념과 레플리카(Replica), 스케일링(Scaling), 그리고 글로벌 모드(Global Mode)의 동작 원리를 살펴보자.
1. 도커 스웜 서비스(Service)와 태스크(Task)의 이해
도커 스웜에서 컨테이너를 실행하는 기본 단위는 '서비스'다.
단일 노드에서 docker run으로 컨테이너를 실행하는 것과 달리, 스웜 모드에서는 docker service create를 통해 클러스터 전체에 컨테이너 배포를 명령한다.
- 서비스: 동일한 이미지로 생성된 컨테이너들의 집합을 제어하는 논리적인 단위다. 사용자가 "nginx 컨테이너 5개를 유지하라"고 정의하면, 이 정의 자체가 서비스가 된다.
- 태스크: 스웜 클러스터에서 실행되는 가장 작은 스케줄링 단위로, 서비스에 의해 관리되는 개별 컨테이너를 의미한다. 서비스가 명령이라면, 태스크는 그 명령이 실행된 결과물인 '개별 컨테이너 인스턴스'라고 볼 수 있다. 스웜 매니저는 서비스 정의에 따라 각 노드(Manager, Slave 등)에 태스크를 할당한다.
- 동작 방식: 매니저 노드는 클러스터 상태를 감시하며, 서비스 정의에 명시된 상태를 유지하기 위해 태스크를 적절한 노드에 배치한다.

구현 및 실행
가장 먼저 우분투 이미지를 활용해 주기적으로 "hello world" 메시지를 출력하는 기본 서비스를 생성해보자.
# 서비스 생성
docker service create --name myweb --with-registry-auth ubuntu:16.04 /bin/sh -c 'while true ; do echo "hello world" ; sleep 2 ; done'
# 서비스 상태 확인
docker service ps myweb
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
q12z1wnu4l4u myweb.1 ubuntu:16.04 slave1 Running Running 10 seconds ago
위와 같이 스웜 매니저가 태스크를 slave1에 할당했음을 확인할 수 있다.
또 서비스가 제대로 실행되고 있는지 로그 모니터링을 해볼 수 있다 있다.
# 서비스 로그 모니터링
docker service logs -f myweb

2. 레플리카(Replica)를 이용한 가용성 확보
서비스를 생성할 때 --replicas 옵션을 사용하면 실행할 컨테이너의 개수를 지정할 수 있다.
이렇게 함으로써 서비스의 가용성을 높일 수 있다.
# 5개의 레플리카를 가진 nginx 서비스 생성
docker service create --name myweb2 --replicas 5 -p 80:80 --with-registry-auth nginx
# 배포된 태스크의 노드 위치 확인
docker service ps myweb2
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
w27hw2p1yyn3 myweb2.1 nginx:latest slave2 Running Running 10 seconds ago
pdn9vlydq6kl myweb2.2 nginx:latest master Running Running 10 seconds ago
n07ixp661qg6 myweb2.3 nginx:latest slave1 Running Running 10 seconds ago
u5i8lcy8t0qt myweb2.4 nginx:latest slave2 Running Running 10 seconds ago
u7ertp36zonz myweb2.5 nginx:latest master Running Running 10 seconds ago
위와 같이 5개의 컨테이너가 각 노드(master, slave1, slave2)에 고루 분배되었음을 알 수 있다.
- Desired State 유지: 스웜의 가장 큰 장점은 셀프 힐링(Self-healing) 기능이다. 5개의 레플리카를 지정하면 스웜은 클러스터 내에 항상 5개의 컨테이너가 가동되도록 보장한다. 만약 특정 노드가 다운되어 컨테이너가 사라지면, 매니저는 즉시 다른 가동 중인 노드에 새 태스크를 생성한다.
- 이 개념은 쿠버네티스의 ReplicaSet과 동일하다.
3. 서비스 스케일링(Scaling): 동적 자원 조절
부하가 늘어나거나 줄어들 때 docker service scale 명령을 사용하면 실시간으로 컨테이너 수를 조절할 수 있다.
구현 및 실행
기존 5개였던 myweb2 서비스의 컨테이너를 9개로 늘렸다가 다시 3개로 줄여본다.
# 컨테이너를 9개로 확장 (Scale-out)
docker service scale myweb2=9
# 상태 확인 (각 노드에 고르게 분산됨을 확인)
docker service ps myweb2
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
w27hw2p1yyn3 myweb2.1 nginx:latest slave2 Running Running 6 minutes ago
pdn9vlydq6kl myweb2.2 nginx:latest master Running Running 6 minutes ago
n07ixp661qg6 myweb2.3 nginx:latest slave1 Running Running 6 minutes ago
u5i8lcy8t0qt myweb2.4 nginx:latest slave2 Running Running 6 minutes ago
u7ertp36zonz myweb2.5 nginx:latest master Running Running 6 minutes ago
wmqf1gb60cpt myweb2.6 nginx:latest slave1 Running Running 17 seconds ago
cjo9b4xm6qdv myweb2.7 nginx:latest slave1 Running Running 18 seconds ago
kveqfx34jtjo myweb2.8 nginx:latest slave2 Running Running 18 seconds ago
xz818pijaf42 myweb2.9 nginx:latest master Running Running 18 seconds ago
# 컨테이너를 3개로 축소 (Scale-in)
docker service scale myweb2=3
# 상태 확인 (각 노드에 고르게 분산됨을 확인)
docker service ps myweb2
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
w27hw2p1yyn3 myweb2.1 nginx:latest slave2 Running Running 7 minutes ago
pdn9vlydq6kl myweb2.2 nginx:latest master Running Running 7 minutes ago
n07ixp661qg6 myweb2.3 nginx:latest slave1 Running Running 7 minutes ago
💡로드 밸런싱(Load Balancing)
스웜 매니저는 새로운 태스크를 추가할 때 각 노드의 부하를 고려하여 로드 밸런싱을 수행한다.
사용자가 어떤 노드의 IP로 접속하더라도 스웜 내부의 인그레스 메쉬(Ingress Mesh) 네트워크를 통해 현재 가동 중인 컨테이너로 연결된다.
4. 글로벌 모드(Global Mode) 서비스
일반적인 서비스(Replicated Mode)는 매니저가 컨테이너를 적절히 분산 배치하지만, 글로벌 모드는 클러스터 내의 모든 노드에 반드시 하나씩의 컨테이너를 실행한다.
구현 및 실행
--mode global 옵션을 사용하여 모든 노드에 Nginx 컨테이너를 하나씩 배치한다.
# 글로벌 모드로 서비스 생성
docker service create --name myweb3 --mode global --with-registry-auth nginx
# 전체 서비스 목록 및 모드 확인
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
zngb1uctf1k5 myweb replicated 1/1 ubuntu:16.04
s7k4rzx9x75h myweb2 replicated 3/3 nginx:latest *:80->80/tcp
62jcsol6y3i5 myweb3 global 3/3 nginx:latest
# 각 노드별 태스크 실행 확인
docker service ps myweb3
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
zx4hav9dedkc myweb3.dk76134jj99r7mxfwqyrt47an nginx:latest slave1 Running Running 20 seconds ago
wwkp8v2rso42 myweb3.t9gpb4hu6293x26nqmu2cv6ac nginx:latest slave2 Running Running 20 seconds ago
ua13o116g6or myweb3.zusguu0rpklsrwnb1xwmwcnm5 nginx:latest master Running Running 20 seconds ago
5. 정리
- 복제 모드(Replicated - 기본값): 사용자가 지정한 개수만큼 컨테이너를 생성하여 분산 배치한다.
- 글로벌 모드(Global): 노드가 추가되면 자동으로 해당 노드에도 컨테이너가 생성된다.
| 구분 | 복제 모드 (Replicated) | 글로벌 모드 (Global) |
| 개수 지정 | 사용자가 지정 (--replicas) | 노드 수에 따라 자동 결정 |
| 주요 용도 | 일반 웹 서버, DB, 애플리리케이션 | 모니터링 에이전트, 로그 수집기(Fluentd 등) |
| 특징 | 특정 노드에 몰릴 수 있음 | 모든 노드에 균등 배포 보장 |
💡글로벌 모드는 시스템 전체를 모니터링하거나 각 노드마다 필요한 보안 에이전트를 설치할 때 매우 유용하다.
클러스터 규모가 확장됨에 따라 관리자가 일일이 컨테이너 개수를 조정할 필요 없이 인프라와 동기화된 서비스를 운영할 수 있게 해준다.
'AI Journey > 클라우드' 카테고리의 다른 글
| [Docker Swarm] Rolling Update - 서비스 업데이트와 복구 (0) | 2026.01.15 |
|---|---|
| [Docker Swarm] 컨테이너 및 노드 장애 복구 메커니즘 (0) | 2026.01.15 |
| [Docker Swarm] 도커 스웜으로 만드는 컨테이너 클러스터 (0) | 2026.01.14 |
| [Docker] 도커 환경에서 FTP 서버 구축하기 (Pure-FTPd) (0) | 2026.01.13 |
| [Docker] Nginx 로그를 Fluentd를 통해 MongoDB에 저장하기 (중앙 집중형 로그 관리) (0) | 2026.01.12 |