D: 도커(Docker)가 컨테이너 기술의 혁명을 가져왔다면, Docker Compose는 여러 컨테이너를 하나의 서비스로 조화롭게 운영할 수 있는 필수 도구입니다. 🚀 이번 포스팅에서는 Docker Compose의 핵심 개념부터 실무에서 활용하는 고급 기법까지 상세히 알아보겠습니다.
1. Docker Compose란? 왜 필요한가?
Docker Compose는 다중 컨테이너 애플리케이션을 정의하고 실행하기 위한 도구입니다. 단일 docker run 명령어로는 한계가 있는 복잡한 서비스 환경을 YAML 파일 하나로 간편하게 관리할 수 있습니다.
🔍 전통적 방식 vs Compose 방식 비교
# 전통적 방식 (번거로움)
docker run -d --name db -e MYSQL_ROOT_PASSWORD=1234 mysql
docker run -d --name web -p 8080:80 -v ./app:/app --link db nginx
# Compose 방식 (간편함)
docker-compose up -d
2. 핵심 구성 요소 상세 분석
2-1. docker-compose.yml 파일 구조
version: '3.8' # Compose 파일 버전
services: # 서비스 정의 시작
webapp:
build: ./web
ports:
- "5000:5000"
depends_on:
- redis
redis:
image: redis:alpine
volumes:
- redis_data:/data
volumes: # 영구 데이터 볼륨
redis_data:
2-2. 주요 설정 항목 심화
-
네트워킹: 사용자 정의 네트워크 생성 가능
networks: app_network: driver: bridge ipam: config: - subnet: 172.20.0.0/24
-
환경 변수 관리: .env 파일과 연동
environment: DB_HOST: ${DB_HOST} DB_PORT: 5432
-
리소스 제한: CPU/Memory 제한 설정
deploy: resources: limits: cpus: '0.50' memory: 512M
3. 실무에서 효과적으로 사용하는 방법 🛠️
3-1. 멀티 스테이지 빌드 적용
services:
app:
build:
context: .
target: runtime
args:
NODE_ENV: production
3-2. 프로파일을 이용한 환경 분리
services:
frontend:
# ... 기본 설정 ...
profiles: ["frontend"]
debug-tools:
# ... 설정 ...
profiles: ["debug"]
실행시: docker-compose --profile debug up
3-3. 확장 구성 파일 활용
# 기본 파일 + 오버라이드 파일 조합
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
4. 고급 오케스트레이션 기법
4-1. 서비스 의존성 제어
services:
web:
depends_on:
db:
condition: service_healthy
db:
healthcheck:
test: ["CMD", "pg_isready"]
interval: 5s
4-2. 자동 복구 시스템
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
4-3. 로깅 시스템 통합
logging:
driver: "json-file"
options:
max-size: "200k"
max-file: "10"
5. 성능 최적화 팁 ⚡
-
볼륨 최적화: named volume 사용
volumes: app_data: driver_opts: type: tmpfs device: tmpfs
-
빌드 캐시 활용: .dockerignore 파일 필수 작성
node_modules .git *.log
-
병렬 빌드:
--parallel
옵션 사용docker-compose build --parallel
6. 실제 프로젝트 적용 사례
MERN 스택 (MongoDB + Express + React + Node.js) 예제:
version: '3.8'
services:
mongo:
image: mongo:5.0
volumes:
- mongo_data:/data/db
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
api:
build: ./backend
ports:
- "3001:3001"
depends_on:
- mongo
environment:
DB_URI: mongodb://root:example@mongo:27017
client:
build: ./frontend
ports:
- "3000:3000"
stdin_open: true
volumes:
mongo_data:
7. 주의사항 및 문제 해결 🚨
- 버전 호환성: Docker Engine과 Compose 버전 일치 확인
- 포트 충돌:
netstat -tuln
으로 사용 중인 포트 확인 - 로그 분석:
docker-compose logs -f service_name
- 자원 정리:
docker-compose down -v
(볼륨 포함 삭제)
Docker Compose는 마이크로서비스 아키텍처에서 특히 강력한 힘을 발휘합니다. 이 가이드를 통해 단순한 컨테이너 실행을 넘어 프로덕션 수준의 서비스 오케스트레이션을 구현해 보세요! 🎯
💡 추가 학습 자료:
- 공식 문서: https://docs.docker.com/compose/
- 샘플 프로젝트: https://github.com/docker/awesome-compose
- 실습 환경: Docker Desktop의 내장 Compose 지원 활용