IT기술/도커 (docker)

Docker Compose 완벽 가이드: 다중 컨테이너 시스템의 효율적 관리

후스파 2025. 7. 15. 23:59
반응형

도커 컴포즈는 여러 개의 컨테이너로 구성된 시스템을 효율적으로 관리하기 위한 도구입니다. 직접 각 컨테이너를 하나씩 제어하는 것은 복잡하고 번거로운 작업일 수 있습니다. 도커 컴포즈는 이러한 불편함을 해소하기 위해, 시스템 구축에 필요한 명령어를 하나의 파일에 정의하고 이를 통해 시스템을 일괄적으로 실행 및 폐기할 수 있도록 돕습니다.


도커 컴포즈의 구성

도커 컴포즈는 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를 마스터하면 복잡한 다중 컨테이너 애플리케이션을 효율적으로 개발하고 테스트할 수 있으며, 팀 전체가 일관된 개발 환경에서 작업할 수 있습니다.

반응형