← 가이드 목록으로 ← Back to guides

Docker Compose 실전과 Swarm 입문 가이드 Docker Compose in Practice & Swarm Introduction

기본 Docker 명령어와 이미지 최적화를 익혔다면, 이제 멀티 컨테이너 애플리케이션을 다룰 차례입니다. Docker Compose로 복잡한 서비스를 정의하고, Swarm으로 클러스터 환경을 구성하는 방법을 배웁니다.

After learning basic Docker commands and image optimization, it's time to handle multi-container applications. Learn how to define complex services with Docker Compose and set up cluster environments with Swarm.

Compose 파일 심화 Advanced Compose Files

# docker-compose.yml 실전 예제
version: '3.8'

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile.prod
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://db:5432/app
    depends_on:
      db:
        condition: service_healthy
    networks:
      - backend
    restart: unless-stopped

  db:
    image: postgres:15-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=${DB_PASSWORD}
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - backend

volumes:
  postgres_data:

networks:
  backend:
    driver: bridge
# docker-compose.yml practical example
version: '3.8'

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile.prod
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://db:5432/app
    depends_on:
      db:
        condition: service_healthy
    networks:
      - backend
    restart: unless-stopped

  db:
    image: postgres:15-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=${DB_PASSWORD}
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - backend

volumes:
  postgres_data:

networks:
  backend:
    driver: bridge

🔗 depends_on과 healthcheck 🔗 depends_on and healthcheck

depends_on만으로는 서비스가 "준비"됐는지 알 수 없습니다. condition: service_healthyhealthcheck를 함께 사용하면 DB가 완전히 시작된 후에 웹 서버가 시작됩니다.

depends_on alone doesn't check if a service is "ready". Using condition: service_healthy with healthcheck ensures the web server starts only after DB is fully ready.

개발/프로덕션 환경 분리 Separating Dev/Production Environments

Override 파일을 사용하면 환경별로 다른 설정을 적용할 수 있습니다.

Using override files, you can apply different configurations per environment.

# docker-compose.yml (공통 설정)
services:
  web:
    image: my-app
    ports:
      - "3000:3000"
# docker-compose.override.yml (개발 환경 - 자동 적용)
services:
  web:
    build: .
    volumes:
      - .:/app # 핫 리로드
    environment:
      - NODE_ENV=development
# docker-compose.prod.yml (프로덕션 환경)
services:
  web:
    image: my-app:${VERSION:-latest}
    environment:
      - NODE_ENV=production
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure
# 환경별 실행
$ docker-compose up # 개발 (override 자동 적용)
$ docker-compose -f docker-compose.yml -f docker-compose.prod.yml up # 프로덕션
# Run by environment
$ docker-compose up # Development (override auto-applied)
$ docker-compose -f docker-compose.yml -f docker-compose.prod.yml up # Production

Docker Networks 심화 Advanced Docker Networks

# 네트워크 생성 및 관리
$ docker network create backend-net
$ docker network ls
$ docker network inspect backend-net

# 컨테이너를 네트워크에 연결
$ docker run --network backend-net --name api my-api
$ docker run --network backend-net --name db postgres

# 같은 네트워크 내에서 DNS로 통신
# api 컨테이너에서:
$ ping db # 컨테이너 이름으로 접근 가능
# Network creation and management
$ docker network create backend-net
$ docker network ls
$ docker network inspect backend-net

# Connect containers to network
$ docker run --network backend-net --name api my-api
$ docker run --network backend-net --name db postgres

# Communicate via DNS within same network
# From api container:
$ ping db # Access by container name

Docker Swarm 기초 Docker Swarm Basics

Docker Swarm은 여러 Docker 호스트를 하나의 클러스터로 관리합니다. Kubernetes보다 단순하며, Docker 자체에 내장되어 있습니다.

Docker Swarm manages multiple Docker hosts as a single cluster. It's simpler than Kubernetes and built into Docker itself.

# Swarm 초기화 (매니저 노드)
$ docker swarm init

# 워커 노드 추가 (다른 서버에서 실행)
$ docker swarm join --token SWMTKN-xxx 192.168.1.1:2377

# 노드 목록 확인
$ docker node ls

# 서비스 배포
$ docker service create --name web --replicas 3 -p 80:80 nginx

# 서비스 상태 확인
$ docker service ls
$ docker service ps web

# 스케일 조정
$ docker service scale web=5

# 롤링 업데이트
$ docker service update --image nginx:alpine web
# Initialize Swarm (manager node)
$ docker swarm init

# Join worker node (run on another server)
$ docker swarm join --token SWMTKN-xxx 192.168.1.1:2377

# List nodes
$ docker node ls

# Deploy service
$ docker service create --name web --replicas 3 -p 80:80 nginx

# Check service status
$ docker service ls
$ docker service ps web

# Scale adjustment
$ docker service scale web=5

# Rolling update
$ docker service update --image nginx:alpine web

💡 Stack으로 여러 서비스 배포 💡 Deploy Multiple Services with Stack

docker stack deploy를 사용하면 docker-compose.yml 파일로 Swarm에 배포할 수 있습니다. docker stack deploy -c docker-compose.yml mystack

Using docker stack deploy, you can deploy to Swarm with docker-compose.yml. docker stack deploy -c docker-compose.yml mystack

⚠️ Swarm vs Kubernetes ⚠️ Swarm vs Kubernetes

소규모 팀이나 간단한 배포에는 Swarm이 적합합니다. 대규모 클러스터나 복잡한 오케스트레이션이 필요하면 Kubernetes를 고려하세요.

Swarm is suitable for small teams or simple deployments. Consider Kubernetes for large clusters or complex orchestration needs.