D: 개발을 하다 보면 웹 서버, 데이터베이스, 캐시 서버 등 여러 서비스를 동시에 운영해야 하는 경우가 많죠.
이런 복잡한 멀티 컨테이너 환경을 Docker Compose로 효율적으로 관리하는 방법을 상세하게 알아보겠습니다!
1. Docker Compose가 왜 필요할까? 🤔
기존 Docker는 단일 컨테이너를 실행하는 데 최적화되어 있습니다.
하지만 현대 애플리케이션은 여러 구성 요소가 유기적으로 연결되어 동작하죠.
예를 들어:
- 웹 앱 (Node.js/Python)
- 데이터베이스 (MySQL/PostgreSQL)
- 캐시 시스템 (Redis)
- 메시지 큐 (RabbitMQ)
이 모든 서비스를 수동으로 하나씩 실행하면?
docker run -d --name db mysql
docker run -d --name cache redis
docker run -d --name app -p 3000:3000 my-app
➡️ 명령어가 길어지고, 의존성 관리가 어려워집니다!
2. Docker Compose의 핵심 기능 🔥
YAML 파일 하나로 전체 서비스 스택을 정의합니다.
주요 장점:
- ✅ 단일 명령으로 모든 컨테이너 실행/정지
- ✅ 서비스 간 의존성 자동 관리
- ✅ 네트워크/볼륨 설정 통합
- ✅ 환경 변수 중앙 관리
3. 실전 예제: 웹 앱 + DB + Redis 구성 🛠️
docker-compose.yml
파일 예시:
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- redis
- db
environment:
- DB_HOST=db
- REDIS_HOST=redis
redis:
image: redis:alpine
volumes:
- redis_data:/data
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
redis_data:
4. 주요 기능 상세 설명 📚
▶ 서비스 의존성 관리
depends_on:
- db
- redis
- 웹 서비스는 DB와 Redis가 준비된 후에 실행됩니다.
▶ 볼륨 관리
volumes:
db_data:
redis_data:
- 데이터 영구 저장을 위해 볼륨을 사용합니다.
▶ 환경 변수 주입
environment:
POSTGRES_PASSWORD: "secret"
- 민감한 정보는 별도
.env
파일에서 관리할 수 있습니다.
5. 고급 활용 팁 💡
1) 멀티 스테이지 빌드
web:
build:
context: .
target: production
- 개발/운영 환경별로 다른 Dockerfile 스테이지 사용
2) 헬스 체크
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
- 컨테이너 상태를 주기적으로 확인
3) 리소스 제한
deploy:
resources:
limits:
cpus: '0.50'
memory: 512M
- CPU/메모리 사용량 제한 설정
6. 실제 운영 시 주의사항 ⚠️
- 프로덕션 환경에서는
restart: always
추가 - 비밀번호는 절대 하드코딩하지 말고
.env
사용 - 로그 관리를 위해 로그 드라이버 설정
logging: driver: "json-file" options: max-size: "200k" max-file: "10"
7. 실행 방법 🚀
# 전체 서비스 시작
docker-compose up -d
# 특정 서비스만 빌드
docker-compose build web
# 로그 확인
docker-compose logs -f
# 서비스 정지
docker-compose down
마무리 ✨
Docker Compose는 복잡한 멀티 컨테이너 환경을 선언적으로 관리할 수 있는 강력한 도구입니다.
이제 여러분도 YAML 파일 하나로 전체 인프라를 관리하는 DevOps 엔지니어의 세계로 들어가 보세요!
궁금한 점이 있다면 댓글로 남겨주세요. 함께 고민해 보겠습니다 😊