D: 컨테이너 오케스트레이션을 시작하는 개발자라면 반드시 알아야 할 Docker Compose! 복잡한 멀티 컨테이너 애플리케이션을 손쉽게 관리할 수 있는 이 도구에 대해 깊이 파헤쳐보겠습니다. ✨
1. Docker Compose란?
“여러 컨테이너를 하나의 파일로 정의하고 관리하는 도구”
👉 단일 호스트에서 다중 컨테이너 애플리케이션을 YAML 파일로 정의해 한 번에 실행/관리합니다.
- 기존 Docker의 문제점:
docker run -p 8080:80 -e ENV=value...
같은 복잡한 명령어 반복 필요 - Compose의 해결책:
docker-compose up
한 줄이면 모든 서비스(DB, 웹서버, 캐시 등) 동시 실행!
예시 시나리오:
웹 앱(React) + API 서버(Node.js) + 데이터베이스(MySQL) + 캐시(Redis)
2. 핵심 기능 🔥
📌 선언적 구성 (YAML 파일)
docker-compose.yml
예시:
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: mysecretpassword
📌 서비스 간 의존성 관리
services:
backend:
depends_on:
- db
- redis
📌 환경 변수 관리
.env
파일과 연동:
DB_PASSWORD=supersecret
environment:
DB_PASSWORD: ${DB_PASSWORD}
📌 볼륨/네트워크 통합
volumes:
db-data:
networks:
app-network:
driver: bridge
3. 실전 사용법 🛠️
기본 명령어
# 전체 서비스 시작 (데몬 모드)
docker-compose up -d
# 특정 서비스만 시작
docker-compose up web
# 서비스 중지 (컨테이너 유지)
docker-compose stop
# 완전 삭제 (컨테이너+네트워크+볼륨)
docker-compose down -v
로그 확인
# 모든 서비스 로그
docker-compose logs
# 실시간 로그 스트림
docker-compose logs -f db
확장 기능
- 프로파일 사용:
services: frontend: profiles: ["dev"] test: profiles: ["test"]
- 다중 파일 구성:
docker-compose -f docker-compose.yml -f override.yml up
4. 고급 활용 테크닉 ⚡
1) Health Check
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
2) 리소스 제한
deploy:
resources:
limits:
cpus: '0.50'
memory: 512M
3) 빌드+실행 통합
services:
app:
build: ./app
image: myapp:latest
5. 주의사항 및 모범 사례 🚨
- 버전 호환성: Docker Engine 버전과 맞춰야 함
- 보안 이슈:
.env
파일은 절대 공유하지 말 것! - 최적화 팁:
restart: unless-stopped
로 자동 복구 설정- 로컬 개발 시
volumes
사용해 핫 리로드 구현
마치며 🎯
Docker Compose는 로컬 개발 환경 구축부터 CI/CD 파이프라인까지 다양한 영역에서 활용됩니다. 이 가이드를 통해 여러분의 컨테이너 관리가 한층 더 효율적으로 변할 거예요!
💡 추천 학습 경로:
- 공식 문서 실습 → 2. 샘플 프로젝트 클론 → 3. 기존 프로젝트 Compose화
# 오늘 바로 시작해보세요!
curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
궁금한 점은 댓글로 남겨주세요! 다음 시간에는 Kubernetes vs Docker Compose 비교 포스팅으로 찾아올게요 👋