Docker Compose

2025. 12. 21. 21:59기타

반응형

Docker Compose 가이드

Docker Compose는 여러 개의 Docker 컨테이너를 정의하고 실행하기 위한 도구입니다. YAML 파일을 사용하여 애플리케이션의 서비스, 네트워크, 볼륨 등을 구성할 수 있습니다.


📌 주요 특징

1. 다중 컨테이너 관리

  • 하나의 명령어로 여러 컨테이너를 동시에 시작/중지할 수 있습니다
  • 복잡한 애플리케이션 스택을 쉽게 관리할 수 있습니다

2. 선언적 구성

  • docker-compose.yml 파일에 인프라를 코드로 정의합니다
  • 버전 관리가 가능하고 재현 가능한 환경을 만들 수 있습니다

📄 기본 구조 예시

version: '3.8'

services:
  # 웹 애플리케이션 서비스
  web:
    build: ./app
    ports: 
      - "3000:3000"
    environment: 
      - DATABASE_URL=postgres://db:5432/myapp
    depends_on:
      - db
    volumes:
      - ./app:/usr/src/app

  # 데이터베이스 서비스
  db:
    image: postgres: 15
    environment: 
      - POSTGRES_DB=myapp
      - POSTGRES_PASSWORD=secret
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data: 

⌨️ 주요 명령어

명령어 설명
docker compose up 서비스 시작 (컨테이너 생성 및 실행)
docker compose up -d 백그라운드에서 서비스 시작
docker compose down 서비스 중지 및 컨테이너 삭제
docker compose build 서비스 이미지 빌드
docker compose logs 서비스 로그 확인
docker compose ps 실행 중인 컨테이너 목록
docker compose exec <서비스> <명령> 실행 중인 컨테이너에서 명령 실행

⚙️ 주요 설정 옵션

services (서비스 정의)

옵션 설명
image 사용할 Docker 이미지
build Dockerfile 경로 (이미지를 직접 빌드할 때)
ports 포트 매핑 (호스트: 컨테이너)
volumes 볼륨 마운트
environment 환경 변수
depends_on 서비스 의존성 정의
restart 재시작 정책 (always, on-failure 등)

volumes (볼륨 정의)

  • 데이터 영속성을 위한 볼륨 정의

networks (네트워크 정의)

  • 컨테이너 간 통신을 위한 네트워크 구성

🚀 사용 예시

# 서비스 시작 (빌드 포함)
docker compose up --build

# 백그라운드 실행
docker compose up -d

# 특정 서비스만 시작
docker compose up web

# 서비스 중지 및 볼륨까지 삭제
docker compose down -v

# 서비스 스케일링 (web 서비스를 3개로)
docker compose up -d --scale web=3

✅ 장점

  1. 개발 환경 표준화: 팀원 모두 동일한 환경에서 개발 가능
  2. 빠른 환경 구축: 한 번의 명령으로 전체 스택 실행
  3. 마이크로서비스 관리: 여러 서비스를 효율적으로 관리
  4. CI/CD 통합: 테스트 및 배포 파이프라인에 쉽게 통합

Docker Compose 주의사항 및 단점

⚠️ 주의사항

1. 프로덕션 환경에서의 제한

  • Docker Compose는 단일 호스트에서만 작동합니다
  • 대규모 프로덕션 환경에서는 Kubernetes, Docker Swarm 등 오케스트레이션 도구를 권장합니다
  • 고가용성(HA), 자동 복구, 로드 밸런싱 기능이 제한적입니다

2. depends_on의 한계

services:
  web:
    depends_on: 
      - db  # db 컨테이너가 "시작"되면 web 시작
  • depends_on은 컨테이너 시작 순서만 보장합니다
  • 서비스가 실제로 준비(ready) 되었는지는 확인하지 않습니다
  • 해결책: healthcheck + condition 사용
services:
  web: 
    depends_on:
      db:
        condition: service_healthy
  db:
    image: postgres: 15
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

3. 환경 변수 보안

# ❌ 안전하지 않음 - 비밀번호 노출
environment:
  - DB_PASSWORD=mysecretpassword

# ✅ 권장 - . env 파일 또는 secrets 사용
env_file:
  - .env
  • docker-compose.yml에 민감한 정보를 직접 작성하지 마세요
  • .env 파일은 반드시 .gitignore에 추가하세요

4. 볼륨 데이터 삭제 주의

# ⚠️ 주의! 볼륨까지 모두 삭제됨
docker compose down -v

# 안전하게 중지만 (볼륨 유지)
docker compose down

5. 네트워크 충돌

  • 여러 프로젝트에서 같은 포트를 사용하면 충돌 발생
  • 프로젝트별로 다른 포트를 지정하거나 네트워크 분리 필요

👎 단점

1. 확장성 제한

항목 Docker Compose Kubernetes
다중 호스트
자동 스케일링
자동 복구
롤링 업데이트 제한적

2. 모니터링 기능 부재

  • 내장된 모니터링, 로깅 시스템이 없습니다
  • 별도 도구 필요 (Prometheus, Grafana, ELK Stack 등)

3. 서비스 디스커버리 제한

  • 기본적인 DNS 기반 서비스 디스커버리만 제공
  • 복잡한 마이크로서비스 환경에서는 부족할 수 있음

4. 리소스 관리의 한계

# 리소스 제한 설정 가능하지만... 
services:
  web: 
    deploy:
      resources: 
        limits:
          cpus:  '0.5'
          memory: 512M
  • deploy 섹션은 Swarm 모드에서만 완전히 동작
  • 일반 Compose에서는 --compatibility 플래그 필요

5. 버전 호환성 문제

  • Docker Engine 버전에 따라 지원되는 Compose 파일 버전이 다름
  • 팀원 간 Docker 버전 차이로 문제 발생 가능

6. 디버깅의 어려움

  • 여러 컨테이너 간 문제 추적이 복잡할 수 있음
  • 로그가 분산되어 있어 통합 확인이 어려움

✅ 권장 사용 환경

환경 적합성 비고
로컬 개발 ⭐⭐⭐⭐⭐ 최적
테스트/CI ⭐⭐⭐⭐⭐ 최적
스테이징 ⭐⭐⭐⭐ 적합
소규모 프로덕션 ⭐⭐⭐ 가능
대규모 프로덕션 ⭐⭐ 비권장 (K8s 추천)

💡 Best Practices

# docker-compose.yml 모범 사례
version:  '3.8'

services:
  web: 
    image: myapp:${APP_VERSION:-latest}  # 버전 태그 사용
    restart: unless-stopped              # 재시작 정책
    logging:                             # 로깅 설정
      driver: "json-file"
      options: 
        max-size: "10m"
        max-file: "3"
    healthcheck:                          # 헬스체크 설정
      test:  ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3

📚 참고 자료


📌 요약: Docker Compose는 개발 및 테스트 환경에서는 훌륭한 도구이지만, 대규모 프로덕션 환경에서는 Kubernetes 같은 오케스트레이션 도구를 고려하세요!

반응형

'기타' 카테고리의 다른 글

First Class Collection  (1) 2025.06.13
Github Actions  (1) 2024.10.10
Kafka가 빠른 이유  (0) 2024.07.25
WEB 3.0  (0) 2023.12.24
3-Tier Architecture  (0) 2023.11.01