일. 8월 17th, 2025

D: 도커(Docker)가 컨테이너 기술의 혁명을 가져왔다면, Docker Compose는 여러 컨테이너를 하나의 서비스로 조화롭게 운영할 수 있는 필수 도구입니다. 🚀 이번 포스팅에서는 Docker Compose의 핵심 개념부터 실무에서 활용하는 고급 기법까지 상세히 알아보겠습니다.

1. Docker Compose란? 왜 필요한가?

Docker Compose는 다중 컨테이너 애플리케이션을 정의하고 실행하기 위한 도구입니다. 단일 docker run 명령어로는 한계가 있는 복잡한 서비스 환경을 YAML 파일 하나로 간편하게 관리할 수 있습니다.

🔍 전통적 방식 vs Compose 방식 비교

# 전통적 방식 (번거로움)
docker run -d --name db -e MYSQL_ROOT_PASSWORD=1234 mysql
docker run -d --name web -p 8080:80 -v ./app:/app --link db nginx

# Compose 방식 (간편함)
docker-compose up -d

2. 핵심 구성 요소 상세 분석

2-1. docker-compose.yml 파일 구조

version: '3.8'  # Compose 파일 버전
services:       # 서비스 정의 시작
  webapp:
    build: ./web
    ports:
      - "5000:5000"
    depends_on:
      - redis
  redis:
    image: redis:alpine
    volumes:
      - redis_data:/data

volumes:        # 영구 데이터 볼륨
  redis_data:

2-2. 주요 설정 항목 심화

  • 네트워킹: 사용자 정의 네트워크 생성 가능

    networks:
    app_network:
      driver: bridge
      ipam:
        config:
          - subnet: 172.20.0.0/24
  • 환경 변수 관리: .env 파일과 연동

    environment:
    DB_HOST: ${DB_HOST}
    DB_PORT: 5432
  • 리소스 제한: CPU/Memory 제한 설정

    deploy:
    resources:
      limits:
        cpus: '0.50'
        memory: 512M

3. 실무에서 효과적으로 사용하는 방법 🛠️

3-1. 멀티 스테이지 빌드 적용

services:
  app:
    build:
      context: .
      target: runtime
      args:
        NODE_ENV: production

3-2. 프로파일을 이용한 환경 분리

services:
  frontend:
    # ... 기본 설정 ...
    profiles: ["frontend"]

  debug-tools:
    # ... 설정 ...
    profiles: ["debug"]

실행시: docker-compose --profile debug up

3-3. 확장 구성 파일 활용

# 기본 파일 + 오버라이드 파일 조합
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

4. 고급 오케스트레이션 기법

4-1. 서비스 의존성 제어

services:
  web:
    depends_on:
      db:
        condition: service_healthy
  db:
    healthcheck:
      test: ["CMD", "pg_isready"]
      interval: 5s

4-2. 자동 복구 시스템

restart_policy:
  condition: on-failure
  delay: 5s
  max_attempts: 3
  window: 120s

4-3. 로깅 시스템 통합

logging:
  driver: "json-file"
  options:
    max-size: "200k"
    max-file: "10"

5. 성능 최적화 팁 ⚡

  1. 볼륨 최적화: named volume 사용

    volumes:
     app_data:
       driver_opts:
         type: tmpfs
         device: tmpfs
  2. 빌드 캐시 활용: .dockerignore 파일 필수 작성

    node_modules
    .git
    *.log
  3. 병렬 빌드: --parallel 옵션 사용

    docker-compose build --parallel

6. 실제 프로젝트 적용 사례

MERN 스택 (MongoDB + Express + React + Node.js) 예제:

version: '3.8'

services:
  mongo:
    image: mongo:5.0
    volumes:
      - mongo_data:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example

  api:
    build: ./backend
    ports:
      - "3001:3001"
    depends_on:
      - mongo
    environment:
      DB_URI: mongodb://root:example@mongo:27017

  client:
    build: ./frontend
    ports:
      - "3000:3000"
    stdin_open: true

volumes:
  mongo_data:

7. 주의사항 및 문제 해결 🚨

  • 버전 호환성: Docker Engine과 Compose 버전 일치 확인
  • 포트 충돌: netstat -tuln으로 사용 중인 포트 확인
  • 로그 분석: docker-compose logs -f service_name
  • 자원 정리: docker-compose down -v (볼륨 포함 삭제)

Docker Compose는 마이크로서비스 아키텍처에서 특히 강력한 힘을 발휘합니다. 이 가이드를 통해 단순한 컨테이너 실행을 넘어 프로덕션 수준의 서비스 오케스트레이션을 구현해 보세요! 🎯

💡 추가 학습 자료:

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다