Docker Compose
여러 컨테이너로 구성된 애플리케이션을 정의하고 실행
여러 컨테이너로 구성된 애플리케이션을 정의하고 실행
목표: 복잡한 다중 컨테이너 환경을 효율적으로 관리할 수 있는 수준
🎯 Docker Compose 개요
개념
YAML 파일로 다중 컨테이너 애플리케이션을 정의.
graph TB
subgraph "Docker Compose"
WEB["🌐 Web App"] -->|"DB 연결"| DB["🗄️ Database"]
WEB -->|"캐시"| CACHE["💨 Redis"]
subgraph "docker-compose.yml"
YML["services:<br/> web:<br/> db:<br/> cache:"]
end
end
📝 docker-compose.yml
기본 구조
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=db
depends_on:
- db
- cache
networks:
- frontend
- backend
db:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
cache:
image: redis:7-alpine
networks:
- backend
volumes:
db-data:
networks:
frontend:
backend:
🔧 서비스 설정
빌드
services:
web:
# 현재 디렉토리의 Dockerfile
build: .
# 특정 Dockerfile
build:
context: ./web
dockerfile: Dockerfile.prod
args:
NODE_ENV: production
# 이미지 태그
image: myapp:v1.0.0
포트
services:
web:
ports:
- "3000:3000" # 호스트:컨테이너
- "127.0.0.1:3000:3000" # 특정 IP
- "3000" # 랜덤 호스트 포트
볼륨
services:
web:
volumes:
- ./src:/app/src # 바인드 마운트
- data:/app/data # 명명된 볼륨
- /app/temp # 익명 볼륨
- type: bind
source: ./config
target: /app/config
read_only: true
volumes:
data:
환경변수
services:
web:
environment:
NODE_ENV: production
API_KEY: secret
# 또는 .env 파일
env_file:
- .env
- .env.local
네트워크
services:
web:
networks:
- frontend
- backend
db:
networks:
- backend
networks:
frontend:
driver: bridge
backend:
internal: true # 외부 접근 불가
🚀 명령어
기본
# 시작
docker-compose up
docker-compose up -d # 백그라운드
docker-compose up --build # 빌드 후 시작
# 중지
docker-compose down
docker-compose down -v # 볼륨도 삭제
# 상태
docker-compose ps
docker-compose logs
docker-compose logs -f web # 실시간
# 실행
docker-compose exec web sh
docker-compose run --rm web npm test
관리
# 빌드
docker-compose build
docker-compose build --no-cache web
# 풀
docker-compose pull
# 재시작
docker-compose restart web
# 스케일
docker-compose up -d --scale web=3
# 설정 확인
docker-compose config
📋 고급 기능
헬스체크
services:
web:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
재시작 정책
services:
web:
restart: unless-stopped
# always, on-failure, unless-stopped, no
리소스 제한
services:
web:
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
프로파일
services:
web:
profiles:
- frontend
db:
profiles:
- backend
dev-tools:
profiles:
- dev
# 사용
# docker-compose --profile frontend up
# docker-compose --profile dev up
🔄 개발 환경
개발 vs 프로덕션
# docker-compose.yml (공통)
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:15
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
# docker-compose.override.yml (개발 - 자동 로드)
version: '3.8'
services:
web:
volumes:
- ./src:/app/src
environment:
- NODE_ENV=development
command: npm run dev
# docker-compose.prod.yml (프로덕션)
version: '3.8'
services:
web:
restart: always
deploy:
replicas: 3
# 개발
docker-compose up
# 프로덕션
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
📋 체크리스트
- docker-compose.yml 작성
- 서비스 정의
- 볼륨 설정
- 네트워크 설정
- 환경변수 설정
- 의존성 설정
- 헬스체크
- 리소스 제한
- 프로파일 사용
- 개발/프로덕션 분리
🔗 관련 노트
- 01-03-도커-기본 — Docker 기본
- 01-01-K8s-아키텍처-이해 — 컨테이너 오케스트레이션
- 02-01-Jenkins-파이프라인 — CI/CD
마지막 업데이트: 2026-06-01