우와한 개발자

[Docker] Docker Swarm 이란? 아키텍처와 주요 명령어(+쿠버네티스 비교)

by 우와한개발자

[ Docker Swarm 도커스웜 ]

1.Docker Swarm 이란

  • docker 에서 제공하는 고수준의 클러스터링 및 오케스트레이션 도구
❓HA(고가용성 high availability)
- 서버 일부가 죽어도 서비스가 계속 운영되도록 하는 설계 방식
- 단일 장애점(Single Point of Failure)을 없애기 위함

❓고가용성을 위한 서버 다중화 방식
1) Active-Standby 방식
- Active 하나만 실제 요청 처리
- Standby는 언제든 대신할 수 있게 대기만 함
- 하둡 NameNode 가 대표적인 예 → Primary NameNode 죽으면 Secondary가 대신함

2) Active-Active 방식
- 모든 서버가 동시에 요청 처리
- 로드밸런서가 트래픽 분산 필수
- 하나 죽어도 나머지가 이어받음

2. Docker Swarm 아키텍처 및 용어

1) 노드 (Node)

  • 도커 스웜 클러스터의 각 호스트
  • 노드는 매니저 노드와 워커 노드로 나뉨

(1) 매니저 노드

  • 클러스터 관리와 스케줄링 담당
  • 기본적으로 2377 포트 사용
  • 새로운 노드를 클러스터에 조인하거나 스웜 관리 작업 수행

(2) 워커 노드

  • 매니저 노드의 지시를 받아 실제 컨테이너 실행

 

2) 서비스 (Service)

  • 여러 노드에 걸쳐 실행되는 동일한 컨테이너들의 그룹
  • 서비스를 사용하여 확장, 로드 밸런싱, 롤링 업데이트 등을 관리

 

3) 스케일링 (Scaling)

  • 자동으로 인스턴스(컨테이너) 수를 조절 (복제(replica) 수 조절)

 

4) 로드 밸런싱 (Load Balancing)

  • 라운드로빈 등 다양한 방식으로 트래픽 분산

 

5) 스웜 모드 (Swarm Mode)

  • 여러 대의 도커 호스트를 하나의 클러스터로 묶어서 관리하는 도커의 내장 오케스트레이션 기능
  • 명령어 한 번으로 전체 관리
docker swarm init   # 스웜 모드 ON
docker swarm leave  # 스웜 모드 OFF

 

6) 보안 (Security)

  • 서비스 간 통신 암호화
  • RBAC (롤 기반 액세스 제어)를 통한 권한 관리 가능

 

7) 엔드포인트 모드 (endpoint_mode)

  • 도커 스웜의 엔드포인트: 클러스터를 관리하고 서비스에 액세스하는 데 사용되는 URL 또는 IP 주소 및 포트

(1) 엔드포인트 종류

종류 포트 용도
매니저 노드 2377 노드 조인·스웜 관리 명령
웹 UI 2375 (HTTP) / 2376 (HTTPS) 브라우저로 스웜 관리
서비스 직접 지정한 포트 실제 앱 접속

 

(2) 서비스에 대한 네트워크 엔드포인트 할당 방식

방식 설명
가상 IP vip 하나의 대표 IP로 모든 컨테이너에 단일 엔드포인트 제공
DNS 라운드 로빈 dnsrr 각 컨테이너에 별도 DNS 레코드 할당, 순서대로 분산
내장 로드밸런서 ingress 어느 노드로 접속해도 스웜이 알아서 컨테이너로 연결

 

3. Docker Swarm 주요 명령어

1) 스웜 초기화 및 조인

docker swarm init --advertise-addr <ip>   # 스웜 클러스터 초기화(스웜 모드 ON)
docker swarm join --token <token> <manager-ip>:<port>  # 워커 노드 조인
docker swarm leave --force                # 스웜 클러스터에서 강제 이탈(스웜모드 OFF)

 

2) 스웜 정보 확인

docker info           # 스웜 클러스터 전반적인 정보 조회
docker node ls        # 스웜 노드 목록 조회
docker service ls     # 스웜 서비스 목록 조회

 

3) 스웜 서비스 관리

docker service create --name <name> <image>          # 서비스 생성
docker service scale <service-name>=<replica-count>  # 서비스 스케일링
docker service update --image <new-image> <name>     # 서비스 업데이트
docker service rm <service-name>                     # 서비스 제거

 

4) 스웜 노드 관리

docker node rm <node-id>                            # 노드 제거
docker node update --availability drain <node-id>   # 노드 작업 중지

 

5) 서비스 네트워크 확인

docker service ps <service-name> --no-trunc  # 서비스 task/container 상세 확인
docker inspect <network-id>                  # 네트워크 구조 상세 확인

 

6) 스택 실행

  • 스택 stack : docker-compose.yml 파일로 정의한 여러 서비스를 하나의 묶음으로 스웜에 배포하는 단위
docker stack deploy -c docker-compose.yml my_stack  # 컴포즈 파일로 스웜 실행
kubectl delete all --all                             # 모든 리소스 삭제

 

5. Docker Swarm실행

1) 초기화

docker swarm init
docker swarm init --advertise-addr 192.168.2.49 # 가상화한경우
  • 가상화한경우에는 하나의 이더넷카드에 두개 이상의 ip가 할당되어있으면 오류가 발생할 수 있어 ip주소 명시

 

2) 컴포즈 파일 작성 (docker-compose.yml)

version: '3.8'
services:
  oracle-db:
    image: jinkyoungheo/oracle11g
    ports:
      - 1521:1521

  tomcat-app:
    image: jinkyoungheo/tomcat10
    deploy:
      replicas: 3          # 레플리카 3개
      endpoint_mode: vip   # 가상 IP 방식
    volumes:
      - tomcat_vol:/usr/local/tomcat/webapps
    ports:
      - 8888:8080

volumes:
  tomcat_vol:

 

3) 스웜 실행 및 확인

docker stack deploy -c docker-compose.yml my_stack  # 스웜 실행
docker service ls                                    # 서비스 확인
docker service scale my_stack_tomcat-app=2          # 스케일 조정

 

4) 컨테이너 강제 삭제 후 자동 복구 확인

docker stop <container-id>    # 컨테이너 하나 강제 중지
docker service ls             # 잠시 후 다시 확인 → 자동으로 3/3 복구됨

 

5) 전체 삭제

docker stack rm my_stack      # 스택 전체 삭제 (서비스·컨테이너 모두 삭제)

 

[ Docker Swarm vs Kubernetes 비교 ]

구분 Docker Swarm Kubernetes
난이도 쉬움 복잡함
아키텍처 마스터-워커 (2계층) 마스터-노드-워커 (3계층)
배포 단위 서비스(Service) 파드(Pod)
설치 도커에 내장 별도 설치 필요
확장성 중소규모 대규모
네트워킹 기본적 강력하고 다양함
보안 기본 제공 RBAC 등 강력한 보안
모니터링 기본적 다양한 도구 지원
커뮤니티 활발 매우 크고 활발

 

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기