Docker Compose volumes: named volume, bind mount, tmpfs

compose.yaml의 volumes 키 아래 named volume, bind mount, tmpfs 세 가지 유형과 external 볼륨, 장형식 선언 방법을 실전 예제로 정리합니다.

· 4 min read · PALDYN Team

지난 글에서 buildimage의 차이를 살펴봤다. 이번에는 compose.yaml에서 볼륨을 다루는 방법을 세 가지 유형으로 나눠 정리한다.

세 가지 볼륨 유형

볼륨 유형 비교

Named Volume — 데이터 영속성

services:
  db:
    image: postgres:16
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:   # 최상위에 선언 필수

pgdata/var/lib/docker/volumes/프로젝트명_pgdata에 저장된다. docker compose down으로 컨테이너를 제거해도 볼륨은 남는다. 데이터를 삭제하려면 docker compose down -v를 써야 한다.

Bind Mount — 호스트 경로 직접 마운트

services:
  api:
    volumes:
      - ./src:/app/src          # 소스 코드 hot reload
      - ./config:/app/config:ro # 설정 파일 읽기 전용

호스트의 실제 경로를 컨테이너 안으로 마운트한다. 코드 변경이 즉시 컨테이너에 반영되어 개발 환경에서 많이 쓴다. 프로덕션에서는 파일 권한, 경로 의존성 문제로 비권장이다.

tmpfs — 메모리 기반 임시 스토리지

services:
  api:
    tmpfs:
      - /app/tmp          # 단축형

    # 장형식 (더 많은 옵션)
    volumes:
      - type: tmpfs
        target: /app/sessions
        tmpfs:
          size: 134217728   # 128MB 제한

컨테이너 종료 시 데이터가 사라진다. 세션 파일, 캐시, 임시 업로드 처리 등에 쓴다.

장형식 볼륨 선언

단축형(source:target)보다 옵션이 많을 때는 장형식을 쓴다.

services:
  api:
    volumes:
      - type: bind
        source: ./src
        target: /app/src
        read_only: false
        bind:
          create_host_path: true   # 호스트 경로 없으면 자동 생성

볼륨 고급 옵션

볼륨 공유: 여러 서비스에서 같은 볼륨 사용

services:
  writer:
    image: myapp-writer
    volumes:
      - shared-data:/data

  reader:
    image: myapp-reader
    volumes:
      - shared-data:/data:ro   # 읽기 전용으로 공유

volumes:
  shared-data:

여러 컨테이너가 같은 named volume을 마운트할 수 있다. 동시 쓰기 충돌에 주의한다.

external: 기존 볼륨 참조

Compose가 볼륨을 생성하지 않고 이미 존재하는 볼륨을 참조할 때 쓴다.

volumes:
  prod-db:
    external: true            # 이미 존재해야 함
    name: myapp_prod_pgdata   # 실제 볼륨 이름 (optional)

external: true인 볼륨이 없으면 docker compose up 시 오류가 발생한다. 스테이징·프로덕션 환경에서 미리 생성된 볼륨을 안전하게 참조할 때 유용하다.

node_modules 분리 패턴

호스트의 node_modules가 컨테이너 안으로 들어오지 않도록 하는 표준 패턴이다.

services:
  app:
    build: .
    volumes:
      - ./src:/app/src                    # 소스 코드 마운트
      - node_modules:/app/node_modules    # 컨테이너 안 node_modules 보존

volumes:
  node_modules:

호스트의 node_modules(macOS, Windows 바이너리)가 리눅스 컨테이너와 충돌하는 문제를 막는다.

볼륨 관련 명령

# 현재 프로젝트의 볼륨 목록
docker compose ls

# 볼륨 내용 확인 (임시 컨테이너)
docker run --rm -v pgdata:/data alpine ls /data

# 볼륨 백업
docker run --rm \
  -v pgdata:/source \
  -v $(pwd):/backup \
  alpine tar czf /backup/pgdata.tar.gz -C /source .

# 볼륨 삭제 (데이터 영구 삭제 주의)
docker compose down -v
docker volume rm myapp_pgdata

정리

  • Named volume은 Docker가 관리, 데이터 영속성 보장, down -v로만 삭제된다.
  • Bind mount는 호스트 경로 직접 마운트, 개발 hot reload에 적합하다.
  • tmpfs는 메모리 기반 임시 저장소, 컨테이너 종료 시 데이터가 사라진다.
  • external: true로 기존 볼륨을 Compose에서 참조할 수 있다.
  • node_modules 분리는 크로스 플랫폼 개발 환경의 표준 패턴이다.

지난 글: Docker Compose build vs image

다음 글: Docker Compose networks


읽어주셔서 감사합니다. 😊