MMeshOps
Docker와 Docker Compose: 개발 환경을 하나로 통일하는 도구
7예상 10입문

데이터를 영구적으로 저장하기: 볼륨(Volume)

컨테이너가 삭제되어도 데이터베이스나 파일이 날아가지 않도록, 호스트 디스크에 데이터를 안전하게 저장하는 볼륨 마운트를 알아봅니다.

도커 컨테이너를 사용해 데이터베이스(PostgreSQL, MySQL 등)를 구축하고 열심히 데이터를 넣었다고 상상해 봅시다. 하지만 며칠 뒤 컨테이너를 삭제하고 다시 띄웠더니 모든 데이터가 감쪽같이 사라져 버렸습니다. 왜 이런 일이 발생할까요?

도커 컨테이너는 기본적으로 휘발성(Ephemeral)을 가집니다. 컨테이너를 삭제하면 그 안에 저장된 모든 변경사항과 데이터도 함께 증발해 버립니다. 이번 에피소드에서는 컨테이너가 파괴되어도 데이터를 안전하게 보존할 수 있게 해주는 도커 볼륨(Volume)에 대해 알아봅니다.

컨테이너의 휘발성과 데이터 보존의 필요성

컨테이너 내부의 파일 시스템은 이미지를 기반으로 임시로 생성된 것입니다. 컨테이너 내부에서 파일을 만들거나 데이터를 수정하면, 이는 일시적인 쓰기 계층(Writable Layer)에 저장됩니다.

컨테이너가 죽으면 데이터도 죽는다

컨테이너가 중지(stop)될 때는 데이터가 남아있지만, 컨테이너를 아예 삭제(rm)하면 이 임시 쓰기 계층도 통째로 날아갑니다. 만약 데이터베이스 컨테이너에 고객 정보를 저장해 두었다면, 컨테이너 재생성 시 백지 상태로 돌아가게 됩니다. 이를 방지하기 위해서는 컨테이너 내부의 특정 폴더를 내 컴퓨터(호스트)의 안전한 저장 공간과 연결해 두어야 합니다.

데이터 보존 방식의 차이

컨테이너 내부에만 데이터 저장

컨테이너 삭제 시 데이터 영구 소실

도커 볼륨을 사용하여 마운트

컨테이너를 삭제해도 호스트에 데이터가 안전하게 유지됨

볼륨(Volume)과 바인드 마운트(Bind Mount)

도커에서 데이터를 영구적으로 저장하는 방법은 크게 두 가지로 나뉩니다. 두 방식 모두 개념은 "호스트 컴퓨터의 폴더를 컨테이너 안의 폴더처럼 속여서 연결하는 것"입니다. 이를 마운트(Mount)라고 부릅니다.

바인드 마운트 (Bind Mount)

내 컴퓨터(호스트)의 특정 경로(예: 내 문서 폴더, 바탕화면 등)를 직접 지정하여 컨테이너의 특정 경로와 연결하는 방식입니다.

  • 주로 소스 코드를 컨테이너에 밀어넣을 때 많이 사용합니다.
  • 호스트에서 코드를 수정하면, 컨테이너 안에서도 즉시 수정된 내용이 반영됩니다.
  • 바이브코딩 시 프론트엔드 실시간 미리보기를 띄울 때 필수적입니다.

도커 볼륨 (Named Volume)

경로를 내 마음대로 지정하지 않고, 도커 엔진이 알아서 안전한 곳에 폴더를 만들고 관리하도록 맡기는 방식입니다.

  • 이름만 지정해주면 도커가 알아서 호스트 어딘가에 데이터를 안전하게 숨겨둡니다.
  • 주로 데이터베이스의 실제 데이터(Data Files)를 저장할 때 사용합니다.
  • 내 컴퓨터의 파일 시스템 구조에 구애받지 않아 여러 환경에서 일관되게 동작합니다.

바인드 마운트 vs 도커 볼륨

비교 항목바인드 마운트(Bind Mount)도커 볼륨(Volume)
관리 주체사용자가 직접 호스트 경로 지정도커가 호스트의 특정 영역에서 알아서 관리
주요 사용처소스 코드 실시간 동기화 (개발 환경)데이터베이스 영구 저장소 보존
호스트 OS 의존성높음 (경로 표기법이 OS마다 다를 수 있음)낮음 (어디서나 이름만으로 동일하게 동작)

볼륨 마운트 설정 방법

포트 매핑에 `-p` 옵션을 썼던 것처럼, 볼륨을 연결할 때는 `-v` (volume) 옵션을 사용합니다.

`-v 호스트_경로:컨테이너_경로` 공식

이 공식 역시 콜론(:)을 기준으로 왼쪽이 호스트(또는 볼륨 이름), 오른쪽이 컨테이너 내부 경로입니다.

PostgreSQL 데이터베이스 데이터 영구 저장하기

PostgreSQL은 기본적으로 컨테이너 내부의 `/var/lib/postgresql/data` 경로에 데이터베이스 파일들을 저장합니다. 이 경로를 `my-db-data`라는 이름의 도커 볼륨에 연결해 봅시다.

docker run -d \
  --name my-postgres \
  -e POSTGRES_PASSWORD=secret \
  -v my-db-data:/var/lib/postgresql/data \
  postgres:15

이렇게 실행하면 도커는 `my-db-data`라는 볼륨을 먼저 만듭니다(없을 경우). 그리고 컨테이너 내부의 DB가 저 경로에 데이터를 쓸 때마다, 실제로는 도커가 관리하는 `my-db-data` 공간에 데이터가 기록됩니다. 이제 이 컨테이너를 삭제하고 다시 띄우더라도, 위와 똑같은 명령어를 실행하면 이전 데이터가 그대로 복구됩니다.

볼륨 사용 시 주의사항

권장

  • 데이터베이스 컨테이너를 띄울 때는 반드시 볼륨(-v) 옵션을 설정하세요.
  • 중요한 설정 파일도 볼륨으로 빼두면 관리가 편해집니다.

주의

  • 소스 코드를 로컬에서 수정하며 개발할 때 Named Volume을 쓰지 마세요 (바인드 마운트가 적합합니다).
  • 컨테이너 안에 중요한 데이터가 있는데 볼륨 연결을 잊었다면, 삭제 전 반드시 백업을 고려하세요.

개념 퀴즈

퀴즈 답을 맞춰야 학습 완료가 됩니다.

다음 중 로컬에서 코드를 수정했을 때, 즉시 컨테이너 안에 반영되도록 내 컴퓨터의 특정 폴더를 연결하는 기능은 무엇일까요?

3줄 요약

  1. 1도커 컨테이너는 삭제되면 내부 데이터도 함께 지워지는 휘발성 구조를 가집니다.
  2. 2데이터베이스나 중요한 파일을 영구 저장하려면 도커 볼륨(Volume)을 마운트해야 합니다.
  3. 3소스 코드 동기화는 바인드 마운트를, 데이터베이스 저장은 네임드 볼륨을 사용하는 것이 일반적입니다.