본문으로 바로가기
TaeyoungKim.dev

Docker --rm 뒤에도 데이터를 남기려면? named volume 확인 방법

클라우드작성 약 3분 읽기TaeyoungKim
LinkedInX

docker run --rm으로 DB 컨테이너를 실행하고 종료한 뒤 데이터를 다시 찾는다면, 파일을 어디에 저장했는지 먼저 봐야 한다. --rm은 종료된 컨테이너를 지운다. 컨테이너의 쓰기 계층에만 있던 데이터까지 유지된다고 기대해서는 안 된다. 남겨야 할 파일은 named volume 같은 별도 저장소에 둔다.

named volume은 Docker가 관리하는 영구 저장소다

도식의 핵심은 컨테이너 수명과 볼륨 수명이 분리된다는 점이다. 컨테이너를 지운 뒤 새 컨테이너가 같은 볼륨을 연결해 데이터를 읽는 흐름을 명령으로 확인해 보자.

bash
docker volume create demo-data
docker run --rm -v demo-data:/data alpine:3.20 sh -c 'printf "hello\n" > /data/note.txt'
docker run --rm -v demo-data:/data:ro alpine:3.20 cat /data/note.txt

마지막 명령에서 hello가 출력되면 첫 컨테이너가 종료돼도 볼륨의 파일이 남은 것이다. --rm은 컨테이너만 정리하며 demo-data 볼륨은 지우지 않는다. 개발·단일 호스트 환경에서 편리하지만, 이것만으로 백업과 재해 복구가 해결되는 것은 아니다. 볼륨이 어느 디스크에 있고 어떻게 백업·복원되는지 운영 경계를 정해야 한다. 같은 볼륨을 다른 컨테이너에도 연결할 수 있지만, 두 컨테이너가 동시에 쓴다면 데이터 정합성은 애플리케이션이 따로 보장해야 한다.

bind mount는 호스트 경로를 직접 연결한다

로컬 소스 코드를 컨테이너에서 바로 읽게 하는 개발 흐름에는 bind mount가 편하다. 하지만 호스트 운영체제별 경로·권한 차이와, 컨테이너가 호스트 파일을 넓게 수정할 수 있는 위험을 함께 고려해야 한다.

bind mount에서 파일이 안 보이면 컨테이너 안 경로만 보지 말고 호스트 경로가 기대한 디렉터리인지 확인한다. 상대 경로는 명령을 실행한 위치에 따라 달라질 수 있고, 호스트 파일의 소유자와 권한도 그대로 영향을 준다. 운영 데이터에 bind mount를 쓴다면 컨테이너가 쓰지 않아도 되는 경로는 읽기 전용으로 연결하고, 상위 디렉터리 전체를 넓게 노출하지 않는다.

데이터가 보이지 않을 때 세 경계를 나눠 확인한다

첫 실습에서 hello가 나오지 않는다면 곧바로 볼륨을 지우고 다시 만들지 않는다. 먼저 실행한 두 명령의 볼륨 이름이 모두 demo-data인지, 컨테이너 안 마운트 지점이 /data로 같은지, 애플리케이션이 실제로 /data/note.txt를 읽는지 확인한다.

bash
docker volume inspect demo-data
docker run --rm -v demo-data:/data:ro alpine:3.20 ls -la /data
docker run --rm -v demo-data:/data:ro alpine:3.20 cat /data/note.txt

inspect는 Docker가 알고 있는 볼륨을 확인하고, 뒤의 두 명령은 같은 볼륨을 읽기 전용으로 붙여 디렉터리와 파일을 차례로 본다. 볼륨은 있는데 파일이 없다면 쓰기 단계의 경로를, 파일은 있는데 애플리케이션만 못 읽는다면 실행 사용자와 권한을 점검한다. 이 확인은 영속성을 보여 줄 뿐 백업 성공을 증명하지는 않는다.

볼륨 유지와 백업·복구는 별도 작업이다

볼륨이 남는다는 사실은 같은 Docker 호스트에서 수명이 분리됐다는 뜻이다. 호스트 디스크 손상이나 잘못된 정리 명령까지 막아 주지는 않는다. 복구용 사본은 별도 위치에 만들고, 사본을 새 볼륨에 복원한 뒤 애플리케이션이 정상 기동하는지 주기적으로 확인한다.

공유 볼륨에서는 소유권·권한과 동시 쓰기 규칙도 정해야 한다. docker volume prune처럼 사용하지 않는 볼륨을 정리하는 명령은 삭제 후보를 확인하고 실행하며, 중요한 데이터의 보존 정책을 컨테이너 정리 절차와 분리한다.

핵심 요약

컨테이너는 교체 가능하고 데이터는 교체되면 안 된다. named volume은 Docker가 관리하는 영구 경로, bind mount는 호스트 경로 연결에 적합하다. 어떤 방식을 쓰든 백업·복구·권한을 별도 설계하고 중요한 데이터가 컨테이너 쓰기 계층에만 남지 않게 하자.

작성자

TaeyoungKim

기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

#Docker#Volume#Data Persistence

함께 읽으면 좋은 글