화. 8월 12th, 2025

D: Docker Compose는 멀티 컨테이너 애플리케이션을 정의하고 실행하기 위한 강력한 도구입니다. 하지만 YAML 파일 작성 시 실수하기 쉽고, 최적화되지 않은 설정은 성능 저하로 이어질 수 있어요. 개발자라면 꼭 알아야 할 실용적인 팁을 알려드립니다!


1. 기본 구조 이해하기 📝

version: '3.8'  # 최신 버전 사용 권장
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: example
  • version: 3.x 이상 사용 (최신 기능 활용)
  • services: 각 컨테이너 서비스 정의
  • 네트워크/볼륨은 자동 생성되지만 명시적으로 정의 가능

2. 환경 변수 관리의 달인 되기 🔑

(1) .env 파일 활용

# .env 파일
DB_PASSWORD=super_secret
WEB_PORT=8080
# docker-compose.yml
services:
  db:
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}

(2) 환경 변수 파일 분리

env_file:
  - db.env
  - web.env

💡 비밀번호 같은 민감정보는 절대 YAML에 직접 노출 금지!


3. 의존성 관리 Smart하게 ⏳

services:
  web:
    depends_on:
      - db
      - redis
    healthcheck:  # 추가 추천!
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
  • depends_on만으로는 준비 상태를 보장하지 않음
  • healthcheck 추가로 실제 서비스 가능 상태 확인

4. 볼륨 사용 시 필수 팁 💾

services:
  app:
    volumes:
      - type: bind
        source: ./app
        target: /usr/src/app
      - data_volume:/var/lib/mysql

volumes:
  data_volume:
  • 로컬 개발 시: bind mount로 실시간 코드 반영
  • 프로덕션: 이름 지정 볼륨(named volume) 사용
  • 최적화: :cached (MacOS) 또는 :delegated 사용

5. 리소스 제한 필수 설정 ⚖️

services:
  redis:
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 512M
        reservations:
          memory: 256M
  • 메모리 누수 방지
  • CPU 스파이크로 인한 전체 시스템 영향도 감소

6. 네트워크 고급 설정 🌐

networks:
  frontend:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/24
  backend:
    internal: true  # 외부 격리

services:
  web:
    networks:
      - frontend
  db:
    networks:
      - backend
  • internal 네트워크: 보안 강화
  • 사용자 정의 서브넷: IP 충돌 방지

7. 개발 vs 프로덕션 분리 🏭

docker-compose.override.yml 활용

# docker-compose.yml (기본)
services:
  web:
    image: myapp:prod
    restart: always

# docker-compose.override.yml (개발)
services:
  web:
    build: .
    volumes:
      - .:/code
    ports:
      - "8000:8000"

docker-compose up 시 자동으로 병합 적용


8. 성능 향상을 위한 추가 팁 �

  1. 이미지 태그 명시: latest 대신 nginx:1.21-alpine
  2. 멀티-스테이지 빌드: 최종 이미지 크기 축소
  3. restart 정책: restart: unless-stopped
  4. 로그 제어:
    logging:
     driver: "json-file"
     options:
       max-size: "10m"
       max-file: "3"

9. 검증 도구 활용하기 🔍

  1. YAML 문법 검사:
    docker-compose config
  2. hadolint: Dockerfile 린팅
  3. VS Code 확장: Docker + YAML 지원

10. 실전 예제: Django + Postgres 🐍+🐘

version: '3.8'

services:
  db:
    image: postgres:13
    environment:
      - POSTGRES_DB=mydb
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
    volumes:
      - postgres_data:/var/lib/postgresql/data

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

volumes:
  postgres_data:

마무리 🎯

Docker Compose는 단순한 설정 파일이 아니라 애플리케이션 인프라의 청사진입니다. 이 가이드를 참고하여:

  1. 재사용 가능한 템플릿 만들기
  2. 버전 컨트롤 시스템에 관리
  3. 팀 내부 표준 가이드 문서화

컨테이너 관리가 편해지면 개발 생산성이 200% 상승하는 걸 경험하실 거예요! 🚀

답글 남기기

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