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
✅ 장점
- 개발 환경 표준화: 팀원 모두 동일한 환경에서 개발 가능
- 빠른 환경 구축: 한 번의 명령으로 전체 스택 실행
- 마이크로서비스 관리: 여러 서비스를 효율적으로 관리
- 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 |