/엔지니어/Docker / 컨테이너/Docker Compose 실전 — 멀티 컨테이너
Docker / 컨테이너중급UbuntuDebianCentOSdockerdocker-compose컨테이너

Docker Compose 실전 — 멀티 컨테이너 앱 구성

docker-compose.yml 작성부터 서비스 의존성, 볼륨, 환경변수, 헬스체크까지 실무 패턴을 정리합니다.

docker-compose.yml 기본 구조

YAML
services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - ./logs:/app/logs

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

volumes:
  pg_data:

자주 쓰는 명령

Bash
# 빌드 + 시작 (백그라운드)
docker compose up -d --build

# 특정 서비스만 재시작
docker compose restart app

# 로그 실시간 확인
docker compose logs -f app

# 실행 중인 컨테이너 상태
docker compose ps

# 컨테이너 내부 접속
docker compose exec app sh

# 모두 중지 + 네트워크/볼륨 제거
docker compose down -v

# 스케일 업 (app 서비스 3개 실행)
docker compose up -d --scale app=3

환경 파일 분리

Bash
# .env 파일 (기본으로 자동 로드)
DB_PASSWORD=secret
APP_PORT=3000
YAML
# docker-compose.yml에서 사용
environment:
  DB_PASSWORD: ${DB_PASSWORD}
  APP_PORT: ${APP_PORT}
Bash
# 환경별 오버라이드
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

리소스 제한

YAML
services:
  app:
    image: myapp:latest
    deploy:
      resources:
        limits:
          cpus: "0.50"
          memory: 512M
        reservations:
          cpus: "0.25"
          memory: 256M

Nginx + App + DB 실전 구성

YAML
services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./certbot/conf:/etc/letsencrypt:ro
    depends_on:
      - app

  app:
    build:
      context: .
      dockerfile: Dockerfile
    expose:
      - "3000"
    env_file:
      - .env
    depends_on:
      db:
        condition: service_healthy
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    volumes:
      - pg_data:/var/lib/postgresql/data
      - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql
    env_file:
      - .env.db
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
      interval: 10s
      retries: 5
    restart: unless-stopped

volumes:
  pg_data:
#docker#docker-compose#컨테이너#멀티서비스#devops
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

관련 공식 문서Docker 공식 문서

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.