Docker를 처음 사용할 때 가장 많이 겪는 문제 중 하나는 컨테이너를 삭제하면 데이터도 함께 사라진다는 점입니다.
예를 들어 MySQL 컨테이너에 중요한 데이터를 저장했는데 컨테이너를 삭제하자 데이터베이스까지 모두 삭제되는 경우가 있습니다.
이 문제를 해결하기 위해 Docker에서는 Volume 기능을 제공합니다.
이번 글에서는 Docker Volume의 개념부터 Bind Mount와 Named Volume의 차이, 데이터 영구 저장 방법, 실무 활용 예제까지 자세히 알아보겠습니다.
Docker Volume이란?
Docker Volume은 컨테이너와 독립적으로 데이터를 저장하는 기능입니다.
컨테이너가 삭제되어도 Volume은 유지되므로 데이터를 계속 사용할 수 있습니다.
구조는 다음과 같습니다.
Application
↓
Container
↓
Docker Volume
↓
Host Storage
Volume은 컨테이너의 생명주기와 별도로 관리됩니다.
Volume이 필요한 이유
컨테이너 내부에 저장한 데이터는 기본적으로 영구적이지 않습니다.
예를 들어
docker run mysql
를 실행하여 데이터를 저장한 후 컨테이너를 삭제하면 데이터도 함께 삭제됩니다.
하지만 Volume을 사용하면
Container 삭제
↓
Volume 유지
↓
새 Container 연결
↓
기존 데이터 사용
이 가능합니다.
Docker의 저장 방식
Docker는 크게 세 가지 방식으로 데이터를 저장할 수 있습니다.
- Container Writable Layer
- Bind Mount
- Named Volume
실무에서는 대부분 Bind Mount와 Named Volume을 사용합니다.
Container Writable Layer
기본적으로 컨테이너 내부 파일은 Writable Layer에 저장됩니다.
Container
↓
Writable Layer
하지만 컨테이너 삭제 시 함께 삭제됩니다.
따라서 중요한 데이터 저장에는 적합하지 않습니다.
Bind Mount란?
Bind Mount는 호스트의 특정 디렉터리를 컨테이너와 연결하는 방식입니다.
예를 들어
docker run -v /home/user/data:/app/data nginx
의미는 다음과 같습니다.
Host
/home/user/data
↓
Container
/app/data
호스트에서 파일을 수정하면 컨테이너에서도 즉시 반영됩니다.
Bind Mount의 장점
다음과 같은 장점이 있습니다.
- 실시간 파일 수정
- 개발 환경에 적합
- 호스트에서 직접 접근 가능
- 별도 Volume 생성 불필요
웹 개발이나 소스 코드 테스트 시 자주 사용됩니다.
Bind Mount의 단점
단점도 있습니다.
- 운영체제 경로 의존
- 권한 문제 발생 가능
- 서버 이동 시 경로 변경 필요
운영 환경에서는 Named Volume을 선호하는 경우가 많습니다.
Named Volume이란?
Named Volume은 Docker가 자체적으로 관리하는 저장 공간입니다.
예를 들어
docker volume create mysql-data
를 실행한 후
docker run -v mysql-data:/var/lib/mysql mysql
를 실행하면
Docker
↓
mysql-data
↓
MySQL Data
형태로 저장됩니다.
Named Volume의 장점
Named Volume은 다음과 같은 장점이 있습니다.
- Docker가 자동 관리
- 운영 환경에 적합
- 백업이 쉬움
- 컨테이너 삭제 후에도 유지
- 여러 컨테이너에서 공유 가능
실무에서는 데이터베이스 저장소로 많이 사용됩니다.
Volume 생성
Named Volume 생성
docker volume create myvolume
확인
docker volume ls
예시
DRIVER
local
VOLUME NAME
myvolume
Volume 상세 정보
docker volume inspect myvolume
확인 가능한 정보
- Mount Point
- Driver
- Name
- Labels
JSON 형식으로 출력됩니다.
Volume 사용
컨테이너 실행 시 연결합니다.
docker run -d \
-v myvolume:/data \
ubuntu
컨테이너 내부 /data는 Volume과 연결됩니다.
Volume 삭제
사용하지 않는 Volume 삭제
docker volume rm myvolume
현재 사용 중인 Volume은 삭제되지 않습니다.
사용하지 않는 Volume 정리
불필요한 Volume을 한 번에 삭제합니다.
docker volume prune
주의
사용하지 않는 모든 Volume이 삭제됩니다.
Docker Compose에서 Volume 사용
Compose에서는 다음과 같이 작성합니다.
services:
mysql:
image: mysql:8.4
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
Compose가 자동으로 Volume을 생성합니다.
MySQL 데이터 영구 저장
대표적인 실무 예제입니다.
docker run -d \
--name mysql \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=password \
mysql:8.4
MySQL 컨테이너를 삭제해도 Volume은 유지됩니다.
새 컨테이너를 연결하면 기존 데이터베이스를 그대로 사용할 수 있습니다.
Nginx 웹 파일 연결
Bind Mount 예제입니다.
docker run -d \
-p 80:80 \
-v $(pwd)/html:/usr/share/nginx/html \
nginx
현재 디렉터리의 html 폴더가 웹 루트와 연결됩니다.
파일을 수정하면 웹페이지도 즉시 변경됩니다.
Volume 저장 위치
Linux에서는 일반적으로 다음 위치에 저장됩니다.
/var/lib/docker/volumes/
Docker가 자동으로 관리합니다.
직접 수정하는 것은 권장되지 않습니다.
Volume 백업
Volume 내용을 백업할 수 있습니다.
예를 들어
docker run --rm \
-v myvolume:/data \
-v $(pwd):/backup \
ubuntu \
tar czf /backup/myvolume.tar.gz /data
백업 파일을 생성하여 다른 서버에서도 사용할 수 있습니다.
Bind Mount와 Named Volume 비교
| 항목 | Bind Mount | Named Volume |
|---|---|---|
| 저장 위치 | 사용자가 지정 | Docker 관리 |
| 운영체제 의존성 | 있음 | 없음 |
| 개발 환경 | 매우 적합 | 적합 |
| 운영 환경 | 보통 | 매우 적합 |
| 데이터 관리 | 직접 | Docker 자동 관리 |
실무에서 자주 사용하는 명령어
Volume 생성
docker volume create myvolume
Volume 목록
docker volume ls
Volume 정보
docker volume inspect myvolume
Volume 삭제
docker volume rm myvolume
사용하지 않는 Volume 삭제
docker volume prune
Volume 연결
docker run -v myvolume:/data ubuntu
Bind Mount 연결
docker run -v /host/data:/app/data ubuntu
실무 사례
온라인 쇼핑몰 서비스를 운영한다고 가정해 보겠습니다.
MySQL 컨테이너를 실행하면서 상품 정보와 주문 데이터를 저장해야 합니다.
운영자는 mysql-data라는 Named Volume을 생성한 뒤 MySQL 컨테이너에 연결합니다.
이후 컨테이너를 업데이트하거나 새 버전으로 교체하더라도 Volume은 그대로 유지되므로 데이터는 안전하게 보존됩니다.
반면 웹 애플리케이션의 소스 코드는 Bind Mount를 사용하여 개발자가 로컬에서 파일을 수정하면 컨테이너에 즉시 반영되도록 구성합니다.
이처럼 운영 환경에서는 Named Volume, 개발 환경에서는 Bind Mount를 적절히 조합하는 것이 일반적인 방법입니다.
자주 묻는 질문
Volume과 Container는 어떤 관계인가요?
Volume은 컨테이너와 독립적으로 존재합니다. 컨테이너를 삭제해도 Volume은 그대로 유지되며, 새로운 컨테이너에서 다시 사용할 수 있습니다.
Bind Mount와 Named Volume 중 어느 것을 사용하는 것이 좋나요?
개발 환경에서는 실시간 파일 변경이 가능한 Bind Mount가 편리합니다. 운영 환경에서는 Docker가 관리하는 Named Volume이 더 안정적이고 관리하기 쉽습니다.
Volume을 삭제하면 데이터도 함께 삭제되나요?
네. Volume을 삭제하면 해당 Volume에 저장된 데이터도 함께 삭제됩니다. 중요한 데이터는 삭제 전에 반드시 백업해야 합니다.
마무리
Docker Volume은 컨테이너와 데이터를 분리하여 안전하게 보관할 수 있는 핵심 기능입니다. 특히 데이터베이스와 같이 중요한 정보를 다루는 서비스에서는 반드시 Volume을 사용해야 하며, 개발 환경에서는 Bind Mount, 운영 환경에서는 Named Volume을 적절히 활용하는 것이 좋은 설계 방법입니다.