
도커 컴포즈는 여러 개의 컨테이너로 구성된 시스템을 효율적으로 관리하기 위한 도구입니다. 직접 각 컨테이너를 하나씩 제어하는 것은 복잡하고 번거로운 작업일 수 있습니다. 도커 컴포즈는 이러한 불편함을 해소하기 위해, 시스템 구축에 필요한 명령어를 하나의 파일에 정의하고 이를 통해 시스템을 일괄적으로 실행 및 폐기할 수 있도록 돕습니다.
도커 컴포즈의 구성
도커 컴포즈는 YAML 포맷의 파일을 사용하여 시스템 구축에 필요한 설정을 저장합니다. 이 파일에는 컨테이너, 볼륨 생성 시 어떤 설정으로 생성 및 실행할지를 포함한 다양한 항목이 정의되어 있습니다.
docker-compose.yml 기본 구조
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- frontend
depends_on:
- api
api:
build: ./api
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=database
volumes:
- ./api:/app
networks:
- frontend
- backend
depends_on:
- database
database:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: myapp
MYSQL_USER: appuser
MYSQL_PASSWORD: apppassword
volumes:
- db_data:/var/lib/mysql
networks:
- backend
volumes:
db_data:
networks:
frontend:
driver: bridge
backend:
driver: bridge주요 섹션 설명
| 섹션 | 설명 | 예시 |
|---|---|---|
| version | Compose 파일 버전 지정 | version: '3.8' |
| services | 컨테이너 서비스 정의 | web:, api:, database: |
| volumes | 데이터 볼륨 정의 | db_data: |
| networks | 네트워크 정의 | frontend:, backend: |
주요 커맨드
기본 명령어
up: 이 커맨드는 docker run과 유사하며, 정의된 이미지를 다운로드하고 컨테이너를 생성 및 실행합니다. 네트워크와 볼륨 등 주변 환경도 함께 설정할 수 있어, 한 번의 실행으로 모든 구성을 완료할 수 있습니다.
down: 이 커맨드는 실행 중인 컨테이너와 네트워크를 정지하고 삭제합니다. 단, 볼륨과 이미지는 삭제되지 않습니다.
stop: 컨테이너와 네트워크를 삭제하지 않고 중지하려면 이 커맨드를 사용하면 됩니다.
# 서비스 시작 (백그라운드)
docker-compose up -d
# 서비스 시작 (포그라운드, 로그 확인 가능)
docker-compose up
# 특정 서비스만 시작
docker-compose up web database
# 서비스 중지 및 삭제
docker-compose down
# 볼륨까지 함께 삭제
docker-compose down -v
# 이미지까지 함께 삭제
docker-compose down --rmi all
# 서비스 중지 (삭제하지 않음)
docker-compose stop
# 서비스 재시작
docker-compose restart
# 특정 서비스 재시작
docker-compose restart web고급 명령어
# 서비스 상태 확인
docker-compose ps
# 서비스 로그 확인
docker-compose logs
docker-compose logs -f web # 실시간 로그
# 서비스 스케일링
docker-compose up -d --scale web=3
# 설정 파일 검증
docker-compose config
# 서비스 실행 (일회성 명령)
docker-compose exec web bash
docker-compose run --rm api npm test
# 이미지 빌드
docker-compose build
docker-compose build --no-cache web
# 이미지 풀
docker-compose pull도커 컴포즈와 Dockerfile 스크립트의 차이
도커 컴포즈는 여러 개의 docker run 명령어를 모아둔 것처럼, 컨테이너뿐만 아니라 네트워크와 볼륨도 함께 생성합니다. 반면, Dockerfile 스크립트는 이미지를 만들기 위한 것이므로 네트워크와 볼륨을 생성할 수 없습니다. 즉, Dockerfile은 이미지의 빌드 과정에 집중하는 반면, 도커 컴포즈는 실행 환경을 설정하는 데 중점을 둡니다.
| 목적 | 이미지 빌드 | 다중 컨테이너 실행 환경 |
| 파일 형식 | 텍스트 (명령어) | YAML |
| 주요 기능 | 이미지 레이어 구성 | 서비스 오케스트레이션 |
| 네트워크 | 설정 불가 | 커스텀 네트워크 생성 |
| 볼륨 | 설정 불가 | 볼륨 관리 |
| 사용 시점 | 빌드 타임 | 런타임 |
실제 사용 예시
# Dockerfile (이미지 빌드용)
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["npm", "start"]# docker-compose.yml (실행 환경용)
version: '3.8'
services:
app:
build: . # 위 Dockerfile 사용
ports:
- "3000:3000"
environment:
- NODE_ENV=production
depends_on:
- redis
- postgres
redis:
image: redis:7-alpine
postgres:
image: postgres:15
environment:
POSTGRES_DB: myapp도커 컴포즈와 쿠버네티스의 차이
쿠버네티스는 컨테이너를 관리하는 도구로, 대규모의 컨테이너 오케스트레이션을 지원합니다. 반면 도커 컴포즈는 주로 컨테이너의 생성과 삭제 기능에 초점을 맞추고 있으며, 관리 기능은 제공하지 않습니다. 따라서 도커 컴포즈는 주로 개발 및 테스트 환경에서 유용하게 사용되며, 쿠버네티스는 프로덕션 환경에서 더 적합한 선택입니다.
| 복잡도 | 낮음 | 높음 |
| 학습 곡선 | 완만 | 가파름 |
| 적용 환경 | 개발/테스트 | 프로덕션 |
| 확장성 | 단일 호스트 | 멀티 호스트 클러스터 |
| 자동 복구 | 제한적 | 강력함 |
| 로드 밸런싱 | 기본적 | 고급 |
| 롤링 업데이트 | 수동 | 자동 |
| 모니터링 | 기본적 | 풍부한 생태계 |
실무 활용 시나리오
Docker Compose 사용 사례:
- 로컬 개발 환경 구축
- CI/CD 파이프라인의 테스트 환경
- 소규모 애플리케이션 배포
- 프로토타입 및 데모 환경
Kubernetes 사용 사례:
- 대규모 프로덕션 환경
- 마이크로서비스 아키텍처
- 고가용성이 필요한 서비스
- 자동 스케일링이 필요한 환경
실무 활용 예시
웹 애플리케이션 스택
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- app
networks:
- frontend
app:
build:
context: .
dockerfile: Dockerfile
environment:
- NODE_ENV=production
- DB_HOST=database
- REDIS_HOST=redis
volumes:
- ./uploads:/app/uploads
networks:
- frontend
- backend
depends_on:
- database
- redis
database:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_USER: appuser
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- backend
redis:
image: redis:7-alpine
command: redis-server --appendonly yes
volumes:
- redis_data:/data
networks:
- backend
volumes:
postgres_data:
redis_data:
networks:
frontend:
driver: bridge
backend:
driver: bridge환경 변수 관리
# .env 파일
DB_PASSWORD=secretpassword
REDIS_PASSWORD=redispassword
APP_SECRET=mysecretkey# docker-compose.yml에서 환경 변수 사용
services:
app:
environment:
- DB_PASSWORD=${DB_PASSWORD}
- APP_SECRET=${APP_SECRET}개발 환경과 프로덕션 환경 분리
# docker-compose.yml (기본)
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
# docker-compose.override.yml (개발용)
version: '3.8'
services:
app:
volumes:
- .:/app
environment:
- NODE_ENV=development
command: npm run dev
# docker-compose.prod.yml (프로덕션용)
version: '3.8'
services:
app:
environment:
- NODE_ENV=production
restart: unless-stopped# 개발 환경 실행
docker-compose up
# 프로덕션 환경 실행
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d결론
도커 컴포즈는 복잡한 시스템을 간편하게 관리할 수 있는 강력한 도구입니다. YAML 파일로 설정을 정의하여 한 번의 커맨드로 전체 시스템을 실행하고 폐기할 수 있는 장점이 있습니다. 도커 컴포즈와 Dockerfile, 쿠버네티스의 차이를 이해함으로써, 각 도구를 적절하게 활용할 수 있습니다.
핵심 포인트:
- YAML 기반의 선언적 설정으로 인프라를 코드로 관리
- 다중 컨테이너 애플리케이션의 간편한 오케스트레이션
- 개발 환경에서 프로덕션과 유사한 환경 구축 가능
- 네트워크와 볼륨을 포함한 전체 스택 관리
- 환경별 설정 분리를 통한 유연한 배포
Docker Compose를 마스터하면 복잡한 다중 컨테이너 애플리케이션을 효율적으로 개발하고 테스트할 수 있으며, 팀 전체가 일관된 개발 환경에서 작업할 수 있습니다.
'IT기술 > 도커 (docker)' 카테고리의 다른 글
| Docker Compose 정의 파일 완벽 가이드: 아파치와 워드프레스 컨테이너 실행 예제 (10) | 2025.07.18 |
|---|---|
| Docker Compose 설치와 실행 완벽 가이드: 다중 컨테이너 관리의 시작 (0) | 2025.07.16 |
| Docker Hub 완벽 가이드: 이미지 관리와 배포의 중심 플랫폼 (2) | 2025.07.14 |
| Docker 컨테이너 개조 완벽 가이드: 실행 중인 컨테이너 커스터마이징 방법 (14) | 2025.07.12 |
| Docker 이미지 생성과 배포 완벽 가이드: 컨테이너에서 커스텀 이미지 만들기 (4) | 2025.07.11 |