Docker Compose

여러 컨테이너로 구성된 애플리케이션을 정의하고 실행


여러 컨테이너로 구성된 애플리케이션을 정의하고 실행

목표: 복잡한 다중 컨테이너 환경을 효율적으로 관리할 수 있는 수준


🎯 Docker Compose 개요

개념

YAML 파일로 다중 컨테이너 애플리케이션을 정의.

graph TB
    subgraph "Docker Compose"
        WEB["🌐 Web App"] -->|"DB 연결"| DB["🗄️ Database"]
        WEB -->|"캐시"| CACHE["💨 Redis"]
        
        subgraph "docker-compose.yml"
            YML["services:<br/>  web:<br/>  db:<br/>  cache:"]
        end
    end

📝 docker-compose.yml

기본 구조

version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
    depends_on:
      - db
      - cache
    networks:
      - frontend
      - backend

  db:
    image: postgres:15
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend

  cache:
    image: redis:7-alpine
    networks:
      - backend

volumes:
  db-data:

networks:
  frontend:
  backend:

🔧 서비스 설정

빌드

services:
  web:
    # 현재 디렉토리의 Dockerfile
    build: .
    
    # 특정 Dockerfile
    build:
      context: ./web
      dockerfile: Dockerfile.prod
      args:
        NODE_ENV: production
    
    # 이미지 태그
    image: myapp:v1.0.0

포트

services:
  web:
    ports:
      - "3000:3000"           # 호스트:컨테이너
      - "127.0.0.1:3000:3000" # 특정 IP
      - "3000"                # 랜덤 호스트 포트

볼륨

services:
  web:
    volumes:
      - ./src:/app/src        # 바인드 마운트
      - data:/app/data        # 명명된 볼륨
      - /app/temp             # 익명 볼륨
      - type: bind
        source: ./config
        target: /app/config
        read_only: true

volumes:
  data:

환경변수

services:
  web:
    environment:
      NODE_ENV: production
      API_KEY: secret
    
    # 또는 .env 파일
    env_file:
      - .env
      - .env.local

네트워크

services:
  web:
    networks:
      - frontend
      - backend
  
  db:
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    internal: true  # 외부 접근 불가

🚀 명령어

기본

# 시작
 docker-compose up
 docker-compose up -d          # 백그라운드
 docker-compose up --build     # 빌드 후 시작

# 중지
 docker-compose down
 docker-compose down -v        # 볼륨도 삭제

# 상태
 docker-compose ps
 docker-compose logs
 docker-compose logs -f web    # 실시간

# 실행
 docker-compose exec web sh
 docker-compose run --rm web npm test

관리

# 빌드
 docker-compose build
 docker-compose build --no-cache web

# 풀
 docker-compose pull

# 재시작
 docker-compose restart web

# 스케일
 docker-compose up -d --scale web=3

# 설정 확인
 docker-compose config

📋 고급 기능

헬스체크

services:
  web:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

재시작 정책

services:
  web:
    restart: unless-stopped
    # always, on-failure, unless-stopped, no

리소스 제한

services:
  web:
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 512M
        reservations:
          cpus: '0.5'
          memory: 256M

프로파일

services:
  web:
    profiles:
      - frontend
  
  db:
    profiles:
      - backend
    
  dev-tools:
    profiles:
      - dev

# 사용
# docker-compose --profile frontend up
# docker-compose --profile dev up

🔄 개발 환경

개발 vs 프로덕션

# docker-compose.yml (공통)
version: '3.8'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  
  db:
    image: postgres:15
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:
# docker-compose.override.yml (개발 - 자동 로드)
version: '3.8'
services:
  web:
    volumes:
      - ./src:/app/src
    environment:
      - NODE_ENV=development
    command: npm run dev
# docker-compose.prod.yml (프로덕션)
version: '3.8'
services:
  web:
    restart: always
    deploy:
      replicas: 3
# 개발
 docker-compose up

# 프로덕션
 docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

📋 체크리스트

  • docker-compose.yml 작성
  • 서비스 정의
  • 볼륨 설정
  • 네트워크 설정
  • 환경변수 설정
  • 의존성 설정
  • 헬스체크
  • 리소스 제한
  • 프로파일 사용
  • 개발/프로덕션 분리

🔗 관련 노트

  • 01-03-도커-기본 — Docker 기본
  • 01-01-K8s-아키텍처-이해 — 컨테이너 오케스트레이션
  • 02-01-Jenkins-파이프라인 — CI/CD

마지막 업데이트: 2026-06-01