2 분 소요

단일 컨테이너로는 한계가 있습니다. 실제 서비스는 웹 서버, 애플리케이션, 데이터베이스 등 여러 컴포넌트로 구성됩니다. Docker Compose는 이러한 멀티 컨테이너 애플리케이션을 단일 YAML 파일로 정의하고 관리하는 도구입니다.

데이터센터 이미지

Docker Compose로 구성된 컨테이너 서비스 환경

Docker Compose 설치

# Docker와 함께 자동 설치됨 (Docker Desktop)
docker compose version

# Linux에서 플러그인 설치
sudo apt install docker-compose-plugin -y   # Ubuntu
sudo dnf install docker-compose-plugin -y   # RHEL/Rocky

기본 compose.yml 구조

# compose.yml

services:
  web:        # 서비스 이름
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - app

  app:
    build: ./app    # Dockerfile이 있는 경로
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/mydb
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d mydb"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  pgdata:

실전 예제: WordPress + MariaDB + Nginx

# compose.yml

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./ssl:/etc/ssl:ro
      - wordpress_files:/var/www/html
    depends_on:
      - wordpress
    restart: unless-stopped

  wordpress:
    image: wordpress:php8.2-fpm-alpine
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress_files:/var/www/html
    depends_on:
      db:
        condition: service_healthy
    restart: unless-stopped

  db:
    image: mariadb:11-jammy
    environment:
      MARIADB_DATABASE: wordpress
      MARIADB_USER: wp_user
      MARIADB_PASSWORD: ${DB_PASSWORD}
      MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 3
    restart: unless-stopped

volumes:
  wordpress_files:
  db_data:
# .env 파일로 민감한 정보 분리
cat > .env << EOF
DB_PASSWORD=SecurePass123!
DB_ROOT_PASSWORD=RootSecurePass123!
EOF

Compose 주요 명령어

# 서비스 시작 (백그라운드)
docker compose up -d

# 서비스 상태 확인
docker compose ps

# 로그 확인
docker compose logs -f             # 전체
docker compose logs -f wordpress   # 특정 서비스

# 서비스 재시작
docker compose restart nginx

# 서비스 중지
docker compose stop

# 서비스 삭제 (볼륨 포함)
docker compose down -v

# 설정 검증
docker compose config

서버 하드웨어 이미지

Docker Compose로 서비스를 배포하는 환경

환경별 설정 분리

# 기본 설정 + 오버라이드 방식
docker compose -f compose.yml -f compose.prod.yml up -d
# compose.prod.yml (프로덕션 오버라이드)
services:
  db:
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4G
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
        max-file: "5"

  wordpress:
    deploy:
      replicas: 3

헬스체크와 의존성 관리

services:
  app:
    depends_on:
      db:
        condition: service_healthy    # 헬스체크 통과 후 시작
      redis:
        condition: service_started   # 시작만 확인
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s   # 초기화 시간 허용

볼륨 백업 자동화

#!/bin/bash
# backup-volumes.sh

DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_DIR="/backup/docker"

mkdir -p $BACKUP_DIR

# 볼륨 목록
volumes=(wordpress_files db_data)

for vol in "${volumes[@]}"; do
    echo "백업 중: $vol"
    docker run --rm \
        -v ${vol}:/data \
        -v $BACKUP_DIR:/backup \
        alpine tar czf /backup/${vol}-${DATE}.tar.gz -C /data .
done

# 7일 이상 된 백업 삭제
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
echo "백업 완료"

Docker Compose는 개발 환경과 프로덕션 환경 모두에서 일관된 서비스 구성을 보장합니다. .env 파일로 환경 변수를 분리하고, 헬스체크와 depends_on을 활용하여 서비스 시작 순서를 올바르게 제어하는 것이 안정적인 운영의 핵심입니다.

댓글남기기