본문 바로가기
Q&A해결2024년 8월 14일1분 읽기

Docker Compose 볼륨 마운트 질문

인
인프라공부
조회 602댓글 4

Docker Compose에서 볼륨 마운트를 하고 있는데 데이터가 자꾸 사라집니다.

# docker-compose.yml
services:
  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: mypassword
    volumes:
      - ./data:/var/lib/postgresql/data
  
  app:
    build: .
    volumes:
      - .:/app
      - /app/node_modules

db 서비스를 docker compose down 후 다시 up 하면 데이터가 사라지는 경우가 있습니다. 그리고 app 서비스에서 /app/node_modules를 왜 별도로 마운트하는지 이해가 안 됩니다.

댓글 4

김김영삼2년 전

두 가지 질문 모두 답변드릴게요.


1. 데이터 사라지는 문제


docker compose down은 컨테이너만 삭제하므로 바인드 마운트(./data) 데이터는 유지됩니다. 하지만 docker compose down -v를 사용하면 볼륨까지 삭제됩니다!


더 안전한 방법은 named volume을 사용하는 것입니다:


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

volumes:
pgdata: # named volume - down -v 안 하면 안전

2. /app/node_modules 별도 마운트 이유


.:/app이 호스트의 모든 파일을 컨테이너에 마운트합니다. 이때 호스트의 node_modules(또는 없는 경우)가 컨테이너의 것을 덮어씁니다. 익명 볼륨으로 분리하면 컨테이너 빌드 시 설치된 node_modules가 유지됩니다.

인인프라공부(guest)김영삼2년 전
아 -v 옵션 때문이었군요! 그런데 named volume과 바인드 마운트는 언제 어떤 걸 써야 하나요?
김김영삼인프라공부2년 전

간단히 정리하면:



  • 바인드 마운트 (./data:/container/path): 소스 코드처럼 호스트에서 직접 편집해야 하는 경우

  • Named volume (pgdata:/container/path): DB 데이터처럼 Docker가 관리하는 영구 데이터

  • 익명 볼륨 (/container/path): node_modules처럼 컨테이너 내부에서만 사용하는 데이터


DB 데이터는 반드시 named volume을 권장합니다!

인인프라공부(guest)김영삼2년 전
정리가 깔끔하네요! named volume으로 바꾸니까 데이터도 안전하게 유지됩니다. 감사합니다!
Ctrl+Enter로 등록