CS/Docker

[Docker] db-data 볼륨과 데이터 저장

leejunkim 2025. 8. 25. 15:14

과제를 하는 도중에 docker compose down을 하고 docker compose up --build를 다시 실행해봤더니, 이전에 생성됐던 데이터들이 postgres db에 아직 저장이 되어있었다.

 

그 이유는 docker-compose down 명령어는 컨테이너는 삭제하지만 데이터 볼륨은 일부러 남겨두기 때문이다.

  • 도커 컨테이너 (db): 컴퓨터 본체와 같다 -> 언제든지 껐다 켤 수 있고, 심지어 새 컴퓨터로 교체할 수도 있다
  • 도커 볼륨 (db-data): 외장 하드 드라이브와 같다 -> 중요한 파일(DB 데이터)을 여기에 저장한다.

docker-compose down 명령어를 실행하면 컴퓨터를 끄지만 연결에 두었던 외장하드는 그대로 남아있는 것과 비슷하다고 보면 된다.

application.yml

services:
  db:
    # ...
    volumes:
      # 마운팅 (mounting)
      - db-data:/var/lib/postgresql/data

# ...

volumes:
  db-data: { }
  • volumes: { db-data: {} }
    • db-data라는 이름의 도커 볼륨 (docker volume)을 생성하겠다고 도커에게 알리는 부분
      • 도커 볼륨은 내 컴퓨터에 있지만, 일반적인 폴더처럼 접근할 수 있는 곳이 아니라 도커가 직접 관리하는 특별한 공간에 저장된다.
      • 'DB 데이터용'이라는 이름표를 붙인 외장 하드를 하나 준비만 해둔 상태고, 아직 어떤 컨테이너와도 연결되지 않았음
  •  db-data:/var/lib/postgresql/data
    • 마운팅 -> db 컨테이너 내부의 데이터베이스 파일이 저장되는 /var/lib/postgresql/data 폴더를 아까 선언한 db-data (도커 볼륨)에 연결
    • db-data (왼)
      • 도커 볼륨
    • /var/lib/postgresql/data (오)
      • 볼륨이 연결될 컨테이너 내부의 절대 경로
      • PostgreSQL 프로그램은 항상 이 경로에 데이터를 저장하고 읽도록 설정되어 있음

전체 흐름

  1. db 컨테이너가 실행됨
  2. 도커는 compose.yml의 지시에 따라 db-data 볼륨을 컨테이너 내부의 /var/lib/postgresql/data 디렉터리에 연결한다.
  3. 이제부터 db 컨테이너 안의 PostgreSQL이 컨테이너 내부의 /var/lib/postgresql/data 경로에 무언가를 쓰면, 그 데이터는 실제로는 컨테이너 바깥의 독립된 저장 공간인 db-data 볼륨에 기록된다.

이 구조 덕분에, 나중에 docker-compose down으로 db 컨테이너(컴퓨터 본체)를 삭제해도 데이터가 저장된 db-data 볼륨(외장 하드)은 그대로 남아있게 된다.

만약에 데이터도 지우고 싶으면?

docker-compose down -v

 

만약 테스트 등을 위해 데이터까지 완전히 초기화하고 싶다면, down 명령어에 -v 옵션을 추가하면 된다.

  • " 컨테이너를 내릴 때, 연결된 볼륨(Volume)까지 전부 삭제해 주세요"라고 하는 것과 같다.
  • 이렇게 실행한 뒤 다시 docker compose up를 하면 새로운 빈 볼륨이 만들어지고 모든 데이터가 초기화된 상태로 어플리케이션이 시작된다.

도커 볼륨을 확인하고 싶다면?

  • 아까 언급했듯이, 도커 볼륨은 내 컴퓨터에 있지만, 일반적인 폴더처럼 접근할 수 있는 곳이 아니라 도커가 직접 관리하는 특별한 공간에 저장된다.
  • 일반적인 파일 탐색기로 보기 어려우므로, docker volume inspect 명령어를 사용해서 볼 수 있다.
    • docker volume ls-> 여기서 이름 확인
    • docker volume inspect myproject_db-data
    • 나오는 결과 중에서 "Mountpoint항목을 찾으면 된다.

 

이런식으로 위에 "Mountpoint"라는 경로를 찾으면 된다.

하지만 안에 있는 파일을 직접 수정하거나 삭제하면 안된다 -> 파일을 잘못 건드리면 데이터베이스가 깨지거나 앱이 실행되지 않을 수 있다! 데이터 관리는 항상 애플리케이션이나 데이터베이스 도구를 통해 하는 것이 안전하다.