Docker Compose로 실전 서비스 구성하기
단일 컨테이너로는 한계가 있습니다. 실제 서비스는 웹 서버, 애플리케이션, 데이터베이스 등 여러 컴포넌트로 구성됩니다. Docker Compose는 이러한 멀티 컨테이너 애플리케이션을 단일 YAML 파일로 정의하고 관리하는 도구입니다.
Docker Compose 설치
# Docker와 함께 자동 설치됨 (Docker Desktop)
docker compose version
# Linux에서 플러그인 설치
sudo apt install docker-compose-plugin -y # Ubuntu
sudo dnf install docker-compose-plugin -y # RHEL/Rocky
기본 compose.yml 구조
# compose.yml
services:
web: # 서비스 이름
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- app
app:
build: ./app # Dockerfile이 있는 경로
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
depends_on:
db:
condition: service_healthy
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d mydb"]
interval: 10s
timeout: 5s
retries: 5
volumes:
pgdata:
실전 예제: WordPress + MariaDB + Nginx
# compose.yml
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/ssl:ro
- wordpress_files:/var/www/html
depends_on:
- wordpress
restart: unless-stopped
wordpress:
image: wordpress:php8.2-fpm-alpine
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wp_user
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_files:/var/www/html
depends_on:
db:
condition: service_healthy
restart: unless-stopped
db:
image: mariadb:11-jammy
environment:
MARIADB_DATABASE: wordpress
MARIADB_USER: wp_user
MARIADB_PASSWORD: ${DB_PASSWORD}
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
volumes:
- db_data:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 3
restart: unless-stopped
volumes:
wordpress_files:
db_data:
# .env 파일로 민감한 정보 분리
cat > .env << EOF
DB_PASSWORD=SecurePass123!
DB_ROOT_PASSWORD=RootSecurePass123!
EOF
Compose 주요 명령어
# 서비스 시작 (백그라운드)
docker compose up -d
# 서비스 상태 확인
docker compose ps
# 로그 확인
docker compose logs -f # 전체
docker compose logs -f wordpress # 특정 서비스
# 서비스 재시작
docker compose restart nginx
# 서비스 중지
docker compose stop
# 서비스 삭제 (볼륨 포함)
docker compose down -v
# 설정 검증
docker compose config
환경별 설정 분리
# 기본 설정 + 오버라이드 방식
docker compose -f compose.yml -f compose.prod.yml up -d
# compose.prod.yml (프로덕션 오버라이드)
services:
db:
deploy:
resources:
limits:
cpus: '2'
memory: 4G
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "5"
wordpress:
deploy:
replicas: 3
헬스체크와 의존성 관리
services:
app:
depends_on:
db:
condition: service_healthy # 헬스체크 통과 후 시작
redis:
condition: service_started # 시작만 확인
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s # 초기화 시간 허용
볼륨 백업 자동화
#!/bin/bash
# backup-volumes.sh
DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_DIR="/backup/docker"
mkdir -p $BACKUP_DIR
# 볼륨 목록
volumes=(wordpress_files db_data)
for vol in "${volumes[@]}"; do
echo "백업 중: $vol"
docker run --rm \
-v ${vol}:/data \
-v $BACKUP_DIR:/backup \
alpine tar czf /backup/${vol}-${DATE}.tar.gz -C /data .
done
# 7일 이상 된 백업 삭제
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
echo "백업 완료"
Docker Compose는 개발 환경과 프로덕션 환경 모두에서 일관된 서비스 구성을 보장합니다. .env 파일로 환경 변수를 분리하고, 헬스체크와 depends_on을 활용하여 서비스 시작 순서를 올바르게 제어하는 것이 안정적인 운영의 핵심입니다.
댓글남기기