Docker Swarm 을 이용한 다중 서비스 애플리케이션 배포 가이드

DockerBeginner
지금 연습하기

소개

이 튜토리얼에서는 강력한 컨테이너 오케스트레이션 플랫폼인 Docker Swarm 을 사용하여 다중 서비스 애플리케이션을 배포하는 과정을 살펴봅니다. Docker Compose 를 사용하여 애플리케이션의 서비스를 정의하고, Docker Swarm 스택으로 원활하게 배포하여 확장성과 고가용성을 보장하는 방법을 배울 것입니다.

Docker Swarm 이해

Docker Swarm 은 Docker 컨테이너를 위한 기본적인 클러스터링 및 오케스트레이션 솔루션입니다. Docker 호스트 그룹을 관리하고 여러 호스트에 걸쳐 애플리케이션을 배포하여 고가용성과 확장성을 제공합니다.

Docker Swarm 이란 무엇인가요?

Docker Swarm 은 Docker 의 내장 기능으로 Docker 호스트의 클러스터 (Swarm) 를 생성하고 관리할 수 있도록 합니다. Swarm 에서 여러 Docker 호스트 (노드) 는 하나의 가상 Docker 호스트로 함께 작동합니다. 이를 통해 애플리케이션과 서비스를 Swarm 전체에 배포할 수 있으며, Docker 는 로드 밸런싱, 확장 및 장애 복구를 처리합니다.

Docker Swarm 의 주요 개념

  • Swarm: 함께 작동하도록 구성된 Docker 호스트의 클러스터.
  • 노드: Swarm 의 일부인 단일 Docker 호스트.
  • 서비스: 애플리케이션 또는 서비스가 Swarm 전체에 배포되고 확장되는 방식을 선언적으로 정의하는 방법.
  • 태스크: 서비스의 일부로 실행되는 컨테이너의 단일 인스턴스.
  • 오버레이 네트워크: Swarm 내 모든 노드를 연결하는 가상 네트워크로, 컨테이너가 서로 통신할 수 있도록 합니다.

Docker Swarm 의 장점

  • 고가용성: Docker Swarm 은 서비스의 상태와 가용성을 자동으로 관리하여 실패한 태스크를 다시 시작하고 Swarm 전체에 재분배합니다.
  • 확장성: 레플리카 수를 조정하여 서비스를 쉽게 확장하거나 축소할 수 있습니다.
  • 로드 밸런싱: Docker Swarm 은 내장된 로드 밸런싱을 제공하여 서비스의 태스크에 걸쳐 들어오는 요청을 분산합니다.
  • 간편성: Docker Swarm 은 Docker 의 기본 기능이므로 컨테이너화된 애플리케이션을 설정하고 관리하기 쉽습니다.
graph TD A[Docker 호스트] --> B[Docker 호스트] B[Docker 호스트] --> C[Docker 호스트] C[Docker 호스트] --> A[Docker 호스트] A[Docker 호스트] -- Swarm --> B[Docker 호스트] B[Docker 호스트] -- Swarm --> C[Docker 호스트] C[Docker 호스트] -- Swarm --> A[Docker 호스트]

Docker Compose 를 사용한 다중 서비스 애플리케이션 배포

Docker Compose 는 다중 컨테이너 애플리케이션을 정의하고 실행할 수 있는 도구입니다. 특히 여러 서비스로 구성된 복잡한 애플리케이션을 배포해야 할 때 각 서비스마다 고유한 요구 사항이 있을 경우 유용합니다.

Docker Compose 파일 생성

Docker Compose 를 사용하여 다중 서비스 애플리케이션을 배포하려면 서비스, 구성 및 연결 방식을 정의하는 docker-compose.yml 파일을 생성해야 합니다. 다음은 예시입니다.

version: "3"
services:
  web:
    image: labex/web-app:v1
    ports:
      - "80:8080"
    depends_on:
      - db
  db:
    image: labex/database:v1
    volumes:
      - db-data:/var/lib/postgresql/data
volumes:
  db-data:

이 예제에서는 webdb 두 개의 서비스가 있습니다. web 서비스는 labex/web-app:v1 이미지를 사용하고 호스트 포트 80 에서 포트 8080 을 노출합니다. 또한 db 서비스에 종속됩니다. db 서비스는 labex/database:v1 이미지를 사용하고 데이터베이스 데이터를 위한 볼륨을 마운트합니다.

애플리케이션 배포

애플리케이션을 배포하려면 다음 명령어를 사용할 수 있습니다.

## (필요한 경우) 이미지 빌드
docker-compose build

## 애플리케이션 배포
docker-compose up -d

docker-compose up -d 명령어는 모든 서비스를 백그라운드에서 시작합니다.

애플리케이션 확장

Docker Compose 를 사용하면 서비스를 쉽게 확장할 수 있는 장점이 있습니다. 예를 들어, web 서비스를 3 개의 레플리카로 확장하려면 다음을 실행할 수 있습니다.

docker-compose scale web=3

이렇게 하면 web 서비스의 인스턴스가 두 개 더 생성되고 Docker Compose 는 자동으로 트래픽을 이들 인스턴스에 균등하게 분산합니다.

graph LR client[클라이언트] --> load_balancer[로드 밸런서] load_balancer --> web1[웹 서비스] load_balancer --> web2[웹 서비스] load_balancer --> web3[웹 서비스] web1 --> db[데이터베이스 서비스] web2 --> db web3 --> db

Docker Swarm 스택 관리 및 확장

다중 서비스 애플리케이션을 Docker Swarm 스택으로 배포한 후에는 다양한 명령어를 사용하여 관리 및 확장할 수 있습니다.

스택 배포

애플리케이션을 Docker Swarm 스택으로 배포하려면 docker stack deploy 명령어를 사용할 수 있습니다.

docker stack deploy -c docker-compose.yml my-app

이 명령어는 docker-compose.yml 파일에 있는 구성을 기반으로 Swarm 서비스를 생성합니다.

스택 모니터링

다음 명령어를 사용하여 Swarm 스택의 상태를 모니터링할 수 있습니다.

## 실행 중인 서비스 목록
docker stack services my-app

## 서비스의 태스크(컨테이너 인스턴스) 목록
docker service ps my-app_web

## 서비스의 로그 보기
docker service logs my-app_web

스택 확장

Swarm 스택에서 서비스를 확장하려면 docker service scale 명령어를 사용할 수 있습니다.

## "web" 서비스를 5개의 레플리카로 확장
docker service scale my-app_web=5

이렇게 하면 web 서비스의 인스턴스가 4 개 더 생성되고 Docker Swarm 은 자동으로 트래픽을 이들 인스턴스에 균등하게 분산합니다.

graph LR client[클라이언트] --> load_balancer[로드 밸런서] load_balancer --> web1[웹 서비스] load_balancer --> web2[웹 서비스] load_balancer --> web3[웹 서비스] load_balancer --> web4[웹 서비스] load_balancer --> web5[웹 서비스] web1 --> db[데이터베이스 서비스] web2 --> db web3 --> db web4 --> db web5 --> db

스택 업데이트

Swarm 스택을 새 버전의 서비스로 업데이트하려면 docker service update 명령어를 사용할 수 있습니다.

## "web" 서비스를 새로운 이미지로 업데이트
docker service update my-app_web --image labex/web-app:v2

이렇게 하면 web 서비스가 롤링 업데이트되어 서비스 중단 없이 이전 컨테이너를 새로운 컨테이너로 교체합니다.

이러한 명령어를 사용하여 Docker Swarm 스택을 효과적으로 관리하고 확장하여 다중 서비스 애플리케이션의 고가용성과 성능을 보장할 수 있습니다.

요약

이 튜토리얼을 마치면 Docker Swarm 과 다중 서비스 애플리케이션을 배포 및 관리하는 데 Docker Swarm 을 사용하는 방법에 대한 확실한 이해를 얻게 될 것입니다. Docker Swarm 클러스터를 설정하고 Docker Compose 를 사용하여 애플리케이션의 서비스를 정의하고, 확장 가능하고 강력한 시스템으로 전체 스택을 배포할 수 있게 될 것입니다.