Swarm 시작하기

이해하기

Swarm(스웜)?

Docker Swarm(도커 스웜)은 Docker가 제공하는 오케스트레이션(Orchestration) 도구야. 쉽게 말해서:

👉 여러 개의 Docker 컨테이너를 묶어서 클러스터처럼 운영하게 해주는 기술

Kubernetes(K8s)처럼 컨테이너를 여러 서버에 분산해서 돌리고, 장애가 나면 자동으로 다른 노드에 재배치하는 등의 기능을 제공해.

Docker가 만든 “간단한 쿠버네티스” (쿠버네티스보다 가볍고 단순하지만 기능은 더 적음)

🧩 Docker Swarm이 할 수 있는 일

Docker Swarm은 다음을 자동으로 해줘:

✔ 컨테이너 클러스터 구성

여러 서버(Node)를 하나의 클러스터(Swarm)로 묶음

✔ 서비스(컨테이너) 자동 배포

docker stack deploy로 여러 개의 컨테이너를 여러 노드에 배포

✔ 로드밸런싱

서비스 replicas=3 → 3개의 컨테이너로 자동 분산 처리

✔ 장애 복구

노드가 죽으면 자동으로 다른 노드에 컨테이너 재생성

✔ 롤링 업데이트

버전업 시 하나씩 교체하며 배포

Stack

스웜에서 사용하는 Compose 기반 “전체 애플리케이션 단위” 스웜 전용 compose 파일을 stack이라고 부르고 Service(서비스) — Swarm에서 실행되는 컨테이너 그룹(복제 포함) Swarm = 하나의 파일(docker-stack.yml)

서비스

서비스(Service) Swarm에서 실행되는 컨테이너 그룹(복제 포함)

시작하기

스웜 초기화 (Swarm 클러스터에 가입)

$ docker swarm init

스웜 종료 (Swarm 클러스터에서 탈출)

docker swarm leave --force

스웜 확인

docker swarm ls

네트워크 생성

$ docker network create -d overlay net-spring
$ docker network create -d overlay net-db

네트워크 확인

docker network ls
docker network inspect net-db

네트워크 삭제

$ docker network rm net-db

스웜 노드 확인

$ docker node ls

스택 배포

# docker-stack.yml

version: "3.9"

services:
  db:
    image: postgres:15
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: 1234
      POSTGRES_DB: postgres
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure

  spring:
    image: spring-backend:latest # build 대신 이미지 필요
    ports:
      - "8080:8080"
    depends_on:
      - db
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
      update_config:
        parallelism: 1
      placement:
        max_replicas_per_node: 2 # 노드가 1개이기 때문에 2개가 동일 노드에 실행됨

volumes:
  pgdata:

docker stack deploy -c docker-compose-swarm.yml dockerStack

스택 확인

$ docker stack ls

스택 삭제

$ docker stack rm dockerStack

Service(서비스)

서비스 확인

$ docker service ls

서비스 업데이트 (스택배포시 이름이 같아 반영이 안될경우)

$ docker service update --force dockerStack_spring

서비스 스케일 0으로 초기화

$ docker service scale myapp_spring=0
$ docker service scale myapp_db=0

서비스 삭제

$ docker service rm myapp_spring
$ docker service rm myapp_db

Contents