반응형

Docker를 이용해 개발하거나 서비스를 배포할 때 가장 흔히 겪는 문제 중 하나는 컨테이너가 삭제되면 데이터도 함께 사라지는 문제입니다. 이번 글에서는 이러한 문제를 **Docker 볼륨(Docker Volume)**을 통해 어떻게 해결할 수 있는지 개념부터 실습까지 단계별로 알아보겠습니다.
Docker 컨테이너의 데이터 유실 문제
보통 Docker는 컨테이너 안에 파일 시스템을 생성합니다. 이 상태에서 컨테이너에 데이터를 저장하면 다음과 같은 문제가 생깁니다:
$ docker run -it --name temp-container ubuntu
# echo "hello docker" > /data/test.txt
# exit
$ docker rm temp-container
👉 컨테이너를 삭제하면 /data/test.txt는 함께 삭제되어 복구할 수 없습니다. 즉, 컨테이너의 라이프사이클과 데이터의 라이프사이클이 동일하다는 게 문제입니다.
Docker Volume이란?
**볼륨(Volume)**은 Docker가 데이터를 저장하는 방식 중 하나로, 컨테이너 외부에 데이터를 저장합니다.
- 컨테이너 삭제와 무관하게 데이터가 유지됨
- 여러 컨테이너 간 데이터 공유 가능
- 성능 및 백업에 유리
Docker Volume 생성 및 사용
✅ 볼륨 생성
$ docker volume create my-volume
볼륨 목록 확인:
$ docker volume ls
✅ 볼륨을 컨테이너에 연결하기
$ docker run -d \
--name nginx-container \
-v my-volume:/usr/share/nginx/html \
nginx
위 명령은 my-volume을 nginx 컨테이너의 /usr/share/nginx/html 경로에 마운트합니다. : 이후의 경로는 Nginx의 기본 웹 루트입니다.
✅ 컨테이너 내부에서 데이터 생성
$ docker exec -it nginx-container bash
# echo "<h1>Hello from Docker Volume!</h1>" > /usr/share/nginx/html/index.html
# exit
이제 웹 브라우저에서 컨테이너의 포트를 확인하면 해당 메시지를 볼 수 있습니다.
✅ 컨테이너 삭제 후 재생성해보기
$ docker rm -f nginx-container
$ docker run -d \
--name nginx-container \
-v my-volume:/usr/share/nginx/html \
-p 8080:80 \
nginx
➡ http://localhost:8080에 접속하면 데이터가 그대로 유지된 것을 확인할 수 있습니다. 🎉
Bind Mount vs Volume 차이점
구분 | Bind Mount | Volume |
위치 | 호스트의 임의 경로 | Docker가 관리하는 경로 (/var/lib/docker/volumes) |
권한 | 호스트가 직접 제어 | Docker가 권한 관리 |
백업 및 이식성 | 낮음 | 높음 |
사용 추천 | 로컬 개발 | 운영 환경, 컨테이너간 공유, 백업 용이성 필요 시 |
실전 예제: MySQL 데이터 보존
$ docker volume create mysql-data
$ docker run -d \
--name mysql-container \
-e MYSQL_ROOT_PASSWORD=root1234 \
-v mysql-data:/var/lib/mysql \
mysql:8
데이터베이스 생성 및 테스트:
$ docker exec -it mysql-container mysql -u root -p root1234
mysql> CREATE DATABASE test_db;
mysql> exit
이제 컨테이너를 삭제하고 재생성해도 test_db는 유지됩니다.
불필요한 볼륨 정리
사용하지 않는 볼륨은 디스크 용량을 차지하므로 주기적으로 정리해주는 것이 좋습니다.
$ docker volume prune
모든 볼륨 삭제:
$ docker volume rm my-volume
주의: 연결 중인 컨테이너가 있는 경우 삭제되지 않습니다.

- 컨테이너만 사용하면 데이터는 쉽게 유실된다.
- Docker Volume을 사용하면 컨테이너와 독립적인 데이터 저장소를 구성할 수 있다.
- 운영 환경에서는 무조건 Volume을 사용하자!
🔗 참고 자료
반응형
'Docker' 카테고리의 다른 글
도커(Docker) compose 사용법 (1) | 2025.05.19 |
---|---|
도커(Docker) 이미지 직접 생성하기(Dockerfile) (1) | 2025.05.19 |
도커 Dockerfile 이란?: FROM 명령어부터 시작 (3) | 2025.05.16 |
도커(Docker) 명령어 및 포트 매핑 (2) | 2025.05.13 |
도커(Docker)와 컨테이너(Container) (1) | 2024.12.23 |