DevToolBox무료
블로그

Docker Compose 치트시트: 서비스, 볼륨, 네트워크

10분 읽기by DevToolBox

Docker Compose는 하나의 YAML 파일로 멀티 컨테이너 애플리케이션을 정의하고 실행합니다.

파일 구조

docker-compose.yml은 4개의 주요 섹션으로 구성:

# docker-compose.yml
services:      # Container definitions
  web:
    image: nginx:alpine
  api:
    build: ./api

volumes:       # Persistent storage
  db-data:

networks:      # Custom networks
  frontend:
  backend:

서비스 설정

Image vs Build

services:
  # Use a pre-built image
  db:
    image: postgres:16

  # Build from Dockerfile
  api:
    build: ./api

  # Build with custom options
  web:
    build:
      context: ./frontend
      dockerfile: Dockerfile.prod
      args:
        NODE_ENV: production

포트 매핑

services:
  web:
    ports:
      - "80:80"         # host:container
      - "443:443"
      - "3000:3000"     # Expose to localhost
      - "127.0.0.1:8080:80"  # Bind to specific interface

환경 변수

services:
  api:
    # Inline environment variables
    environment:
      - NODE_ENV=production
      - DB_HOST=db
      - DB_PORT=5432

    # From external file
    env_file:
      - .env
      - .env.production

재시작 정책

services:
  web:
    restart: "no"             # Default: never restart
  api:
    restart: always           # Always restart
  db:
    restart: unless-stopped   # Restart unless manually stopped
  worker:
    restart: on-failure       # Restart only on failure
    # restart: on-failure:5   # Max 5 retries

헬스 체크

services:
  db:
    image: postgres:16
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

볼륨

services:
  db:
    volumes:
      # Bind mount (host path : container path)
      - ./data:/var/lib/postgresql/data

      # Named volume
      - db-data:/var/lib/postgresql/data

      # Read-only mount
      - ./config:/etc/app/config:ro

volumes:
  db-data:           # Named volume declaration
    driver: local

네트워크

services:
  web:
    networks:
      - frontend
  api:
    networks:
      - frontend
      - backend
  db:
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true    # No external access

완전한 스택 예시

Node.js + MongoDB + Redis

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - MONGO_URL=mongodb://mongo:27017/myapp
      - REDIS_URL=redis://redis:6379
    depends_on:
      - mongo
      - redis

  mongo:
    image: mongo:7
    volumes:
      - mongo-data:/data/db
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    restart: unless-stopped

volumes:
  mongo-data:

Django + PostgreSQL

services:
  web:
    build: .
    command: gunicorn myapp.wsgi:application --bind 0.0.0.0:8000
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgres://postgres:secret@db:5432/myapp
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - static:/app/static

  db:
    image: postgres:16
    environment:
      POSTGRES_DB: myapp
      POSTGRES_PASSWORD: secret
    volumes:
      - pg-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
  pg-data:
  static:

WordPress + MySQL + phpMyAdmin

services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: wp_pass
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp-content:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:8
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: wp_pass
      MYSQL_ROOT_PASSWORD: root_secret
    volumes:
      - db-data:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin:latest
    ports:
      - "8081:80"
    environment:
      PMA_HOST: db

volumes:
  wp-content:
  db-data:

필수 CLI 명령어

명령어설명
docker compose up -dStart services in background
docker compose downStop and remove containers
docker compose down -vStop and remove containers + volumes
docker compose logs -fFollow service logs
docker compose logs apiLogs for specific service
docker compose psList running containers
docker compose exec api shShell into running container
docker compose buildBuild/rebuild images
docker compose pullPull latest images
docker compose restart apiRestart specific service
docker compose configValidate and view config
docker compose topShow running processes

환경 파일 (.env)

Docker Compose는 같은 디렉토리의 .env 파일을 자동으로 읽습니다:

# .env file
POSTGRES_VERSION=16
POSTGRES_PASSWORD=my_secret_pass
APP_PORT=3000

# docker-compose.yml
services:
  db:
    image: postgres:${POSTGRES_VERSION}
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
  app:
    ports:
      - "${APP_PORT}:3000"

일반적인 실수

실수해결
프로덕션에서 `latest` 태그 사용특정 버전 태그 사용
docker-compose.yml에 시크릿 저장.env 파일 또는 Docker secrets 사용
데이터에 네임드 볼륨 미사용네임드 볼륨은 down 후에도 유지
재시작 정책 누락`restart: unless-stopped` 추가
리소스 제한 미설정`deploy.resources.limits` 사용

FAQ

docker-compose와 docker compose의 차이는?

docker-compose(하이픈)는 레거시 Python 도구. docker compose(공백)는 새로운 Go 플러그인(V2)입니다.

데이터를 영속화하려면?

네임드 볼륨을 사용합니다. docker compose down 후에도 유지됩니다.

컨테이너 간 통신은?

같은 compose 파일의 서비스는 기본 네트워크를 공유하며 서비스 이름으로 접근합니다.

프로덕션에서 사용 가능한가요?

네, 하지만 대규모 배포에는 Kubernetes를 고려하세요.

𝕏 Twitterin LinkedIn
도움이 되었나요?

최신 소식 받기

주간 개발 팁과 새 도구 알림을 받으세요.

스팸 없음. 언제든 구독 해지 가능.

Try These Related Tools

🐳Docker Compose GeneratorYMLYAML Validator & FormatterY{}JSON ↔ YAML Converter

Related Articles

Nginx 설정 예시: 리버스 프록시, SSL, 정적 사이트

프로덕션용 Nginx 설정 예시: 리버스 프록시, SSL/TLS, 정적 파일, 로드 밸런싱.

Docker Compose YAML 검증: 흔한 10가지 구문 오류 및 수정 방법

Docker Compose YAML 오류로 시간 낭비하지 마세요. 가장 흔한 10가지 구문 오류 식별 및 수정 방법.

Docker Compose 생성기 -- docker-compose.yml 온라인으로 구축

docker-compose.yml 파일을 온라인으로 생성하는 완벽 가이드. 파일 구조, 서비스, 네트워크, 볼륨, 환경 변수, 헬스 체크, depends_on, 프로파일, 오버라이드 파일, 일반 패턴, 프로덕션 베스트 프랙티스.