도커 컨테이너 삭제 후 데이터 유지 방법: Persistent Storage 설정 기초
컨테이너 가상화 기술인 도커(Docker)를 도입하여 애플리케이션을 구동할 때 가장 주의해야 하는 개념 중 하나는 컨테이너의 휘발성(Stateless) 특성입니다. 기본 설정 상태의 도커 컨테이너는 격리된 독립 환경을 제공하지만, 컨테이너를 정지하고 완전히 삭제(docker rm)하는 순간 내부에서 생성되거나 수정되었던 모든 파일과 데이터베이스 기록도 함께 소멸합니다.
이러한 특성 때문에 데이터베이스 서버, 파일 서버, 사용자 업로드 데이터 등은 컨테이너의 생명주기와 상관없이 안전하게 보존될 수 있는 지속성 저장소(Persistent Storage) 환경을 구축해야 합니다. 데이터 영속성 메커니즘을 올바르게 이해하고 적용하면 컨테이너를 언제든지 삭제하고 새로 생성하더라도 기존 데이터는 손실 없이 그대로 유지됩니다.
본 글에서는 도커 환경에서 컨테이너 삭제 후에도 데이터를 영구적으로 유지하는 데이터 영속성의 개념부터, 이를 구현하는 대표적인 두 가지 방식인 볼륨(Volume)과 바인드 마운트(Bind Mount)의 설정법 및 주의사항까지 상세히 알아 보겠습니다.
1. 도커 컨테이너의 데이터 휘발성과 Persistent Storage의 개념
도커 컨테이너 내부의 데이터가 왜 사라지는지, 그리고 이를 방지하기 위한 영구 저장소의 작동 원리를 이해하는 단계입니다.
[이미지: 도커 컨테이너 내부 샌드박스 영역과 외부 호스트 저장장치 간의 Persistent Storage 데이터 연결 구조도]
도커의 저장 방식과 Persistent Storage의 주요 개념은 다음과 같습니다.
- 컨테이너 레이어의 휘발성: 도커 이미지는 읽기 전용(Read-Only) 레이어로 구성되어 있으며, 컨테이너가 실행될 때 그 위에 읽고 쓰기가 가능한 컨테이너 레이어(Container Layer)가 추가됩니다. 컨테이너가 삭제되면 이 읽고 쓰기 레이어도 함께 삭제되므로 데이터가 사라집니다.
- 지속성 저장소(Persistent Storage)의 역할: 컨테이너 내부의 특정한 파일 경로를 호스트 컴퓨터(물리 PC)의 파일 시스템 영역에 마운트(Mount)하여 데이터를 호스트에 저장하는 기술입니다.
- 시스템 이점: 컨테이너 소프트웨어를 최신 버전으로 업데이트하거나 컨테이너에 오류가 발생하여 재시작/재생성해야 하는 상황에서도 호스트 PC에 저장된 원본 데이터는 안전하게 보존됩니다.
2. 도커 볼륨(Docker Volume)을 활용한 영구 데이터 저장법
도커 볼륨 방식은 도커 엔진이 호스트 컴퓨터 내부의 특정 관리 영역(var/lib/docker/volumes/)을 직접 할당하여 제어하는 가장 표준적이고 권장되는 저장 방식입니다.
도커 볼륨의 장점
- 도커 CLI 명령어로 관리되므로 호스트 파일 시스템 구조에 직접적인 영향을 받지 않습니다.
- 다른 컨테이너 간의 데이터 공유가 쉽고 안전하며, 데이터 입출력(I/O) 성능이 매우 안정적입니다.
실전 설정 및 관리 과정
- 도커 볼륨 생성
- 터미널에서 데이터 보존에 사용할 이름을 지정하여 볼륨을 생성합니다.
- 명령어: docker volume create my-app-data
- 볼륨을 연결하여 컨테이너 실행 (-v 또는 --mount 옵션)
- 생성된 볼륨을 컨테이너 내부의 데이터 저장 경로와 연결하여 구동합니다.
- 명령어: docker run -d --name my-db -v my-app-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=secret mysql:8.0
- 컨테이너 삭제 후 데이터 검증
- docker stop my-db 및 docker rm my-db 명령어로 컨테이너를 완전 삭제합니다.
- 새로운 컨테이너를 동일한 볼륨 이름(my-app-data)으로 마운트하여 다시 구동하면 이전 데이터가 그대로 남아있는 것을 확인할 수 있습니다.
3. 바인드 마운트(Bind Mount)를 활용한 호스트 경로 직접 연동법
바인드 마운트 방식은 호스트 컴퓨터의 특정 디렉터리 절대 경로를 컨테이너 내부 경로와 직접 1:1로 매핑하여 연결하는 방식입니다.
[이미지: 호스트 컴퓨터의 특정 폴더 경로가 도커 실행 시 컨테이너 내부 디렉터리로 직접 바인딩되어 데이터가 동기화되는 화면]
바인드 마운트의 특징 및 활용법
- 개발 환경 최적화: 호스트 PC의 소스 코드를 수정하면 별도의 이미지 빌드 없이 컨테이너 내부에도 파일 수정 사항이 실시간으로 적용되므로 개발용 소스 코드 공유에 적합합니다.
- 호스트 파일 접근: 호스트 환경의 설정 파일(예: nginx.conf, app.config)을 컨테이너 내부로 직접 전달할 때 매우 유용합니다.
실전 바인드 마운트 명령어 예시
- 호스트 컴퓨터의 /home/user/webdata 폴더를 컨테이너 내부 웹 디렉터리와 연동하여 실행합니다.
- 명령어: docker run -d -p 80:80 --name my-web -v /home/user/webdata:/usr/share/nginx/html nginx
자주 묻는 질문 (FAQ)
Q1. docker rm 명령어로 컨테이너를 삭제하면 연결해 두었던 도커 볼륨(Volume)도 같이 지워지나요?
A1. 아니요, 지워지지 않습니다. 도커 볼륨은 컨테이너의 생명주기와 완전히 독립되어 관리되므로 docker rm 명령어로 컨테이너를 지워도 볼륨 데이터는 안전하게 보존됩니다. 볼륨 데이터까지 완전히 삭제하려면 docker volume rm [볼륨이름] 명령어를 직접 입력해야 합니다.
Q2. 바인드 마운트를 실행할 때 호스트 폴더가 비어있으면 컨테이너 안의 파일은 어떻게 되나요?
A2. 바인드 마운트는 호스트의 폴더 상태를 컨테이너 내부로 강하게 덮어쓰게 됩니다. 따라서 호스트 디렉터리가 비어있는 상태에서 바인드 마운트를 설정하면 컨테이너 내부 해당 경로에 있던 기존 파일들이 숨겨지거나 보이지 않을 수 있습니다. 컨테이너 내부의 초기 파일들을 보존하면서 영구 저장소를 만들고자 할 때는 바인드 마운트 대신 도커 볼륨 방식을 사용해야 합니다.
Q3. 하나의 도커 볼륨을 여러 개의 컨테이너가 동시에 마운트해서 공유할 수 있나요?
A3. 네, 가능합니다. 하나의 도커 볼륨을 두 개 이상의 컨테이너에 동시에 마운트하여 데이터를 공유하도록 설정할 수 있습니다. 다만 여러 컨테이너가 동일한 파일에 동시에 쓰기(Write) 작업을 진행할 경우 데이터 충돌이 발생할 수 있으므로 애플리케이션 차원의 동기화 처리가 필요합니다.
결론
도커 컨테이너를 운영할 때 컨테이너 삭제로 인한 뜻밖의 데이터 손실을 방지하기 위해서는 프로젝트의 요구사항에 맞는 Persistent Storage(지속성 저장소) 설정을 필수적으로 적용해야 합니다.
데이터베이스 저장소나 영구 로그 관리 등 안전성이 최우선인 프로덕션 운영 환경에서는 도커 엔진이 직접 관리하는 도커 볼륨(Volume) 방식을 사용하는 것이 표준입니다. 반면 로컬 소스 코드 수정 및 설정 파일 주입 등 실시간 공유가 필요한 개발 환경에서는 바인드 마운트(Bind Mount) 방식을 선택하는 것이 효율적입니다.
본 가이드의 개념과 명령어를 바탕으로 안전하고 지속 가능한 나만의 도커 데이터 저장 구조를 세팅해 보시기 바랍니다.