[Docker] Volume - 컨테이너 데이터 관리

목차

🤔 Docker Volume 이 왜 필요한가?

컨테이너내 데이터는 휘발성입니다.

Docker 와 컨테이너 기술이 막 떠오를때 PC 에 깔아서 개발을 하고 있는데 Docker 내에서 설정한 값들이 재실행할때 마다 초기화 되는 현상들을 겪었습니다. 당시 너무 화가나서 여러 책들을 읽어봤는데 생각해보니 컨테이너의 특성을 제대로 이해하지 못해 생기는 문제였었습니다.

컨테이너는 기본적으로 휘발성 이기 때문에 컨테이너가 종료되거나 삭제되면 내부 데이터도 함께 사라집니다. 쉽게 생각해서 격리돼 있는 컨테이너의 특성상 컨테이너가 생성한 모든 파일들은 결국 컨테이너내에서만 존재하고 컨테이너 삭제시에는 컨테이너와 함께 데이터도 삭제가 되는 것입니다.

Docker 에서는 Docker Volume 을 통해 컨테이너 내에서의 데이터 휘발성 문제를 해결하고 영구적으로 저장할 수 있는 방법을 제공합니다.

✅ Docker Volume 이란?

Docker Volume 은 컨테이너 외부 에 데이터를 저장할 수 있는 공간입니다. 컨테이너와는 별도로 존재하기 때문에, 컨테이너를 삭제하더라도 데이터는 유지되며 데이터 영속성이 보장됩니다.

또한, Docker Volume 은 컨테이너와 호스트 시스템 간에 데이터를 공유하거나 컨테이너 간 데이터를 공유할 때 사용할 수 있습니다.

호스트 PC 에서 Docker Volume 접근

호스트에서 Docker Volume 으로 접근하기 위한 경로는 운영체제 마다 상이합니다. 일단, Linux 환경에서는 Docker Volume 이 기본적으로 /var/lib/docker/volumes 경로 아래에 저장되며, Volume 이름별로 /var/lib/docker/volumes/<volume_name>/_data 에 데이터가 생성돼 해당 경로로 이동하면 접근이 가능합니다. 하지만 윈도우나 맥 환경에서 가상화된 Linux 환경을 띄우고 그 안에서 Docker 를 운영하기 때문에 접근이 어렵습니다.

✅ Docker Volume 사용

1 Volume 생성

Docker Volume은 다음과 같은 명령어로 생성할 수 있습니다. 생성된 Volume은 Docker 호스트의 특정 디렉토리에 저장되며, 이를 통해 데이터가 외부에 안전하게 보관됩니다.

docker volume create my_volume

3.2 컨테이너에 Volume 마운트하기

생성한 Volume을 컨테이너에 마운트하는 방법은 다음과 같습니다.

docker run -d \
--name my_container \
-v my_volume:/app/data \
my_image

3 Volume 리스트 및 삭제

현재 생성된 Volume 목록을 확인하려면 다음 명령어를 사용합니다.

docker volume ls

Docker Volume 을 명시적으로 생성하지 않을 경우 생성된 Volume 목록 확인시 해시된 이름으로 보여져 파악하기가 어렵습니다.

DRIVER    VOLUME NAME
local 49ff6b4a76033b6511cd4ff656a08288e00db0c791d734c8d8f22c61265c570e
local 87b7e5bc9d75151f2ca3fe25cfc38d620434133231e3a59ebd8f99c1f43e08b6
local 092efe87a570de9ec8a80192b753b66a952abeae53f274e09c867074d1d09fc6
local 194d517db62f9a6569e47fce6e99415152c51fdfa1dfaa3a1f275df3cf0396fd
local minikube
local mysql_grafana_data
local mysql_prometheus_data
local redis-insight_redis_insight_volume_data
local redis-insight_redis_volume_data
local redisinsight
local spring-websocket-kafka_redis_insight_volume_data
local spring-websocket-kafka_redis_volume_data

사용하지 않는 Volume은 다음과 같이 삭제할 수 있습니다.

docker volume rm my_volume

전체 사용하지 않는 Volume을 한꺼번에 삭제하려면 prune 명령어를 사용하면 됩니다.

docker volume prune

✅ Docker Volume 사용 예제

컨테이너로 구성된 데이터 베이스의 데이터를 영속적으로 저장하기 위해 Docker Volume 을 이용합니다. 해당 명령어로 MySQL 데이터 베이스를 실행하게 되면 실행되는 컨테이너는 다를지라도 항상 같은 Volume 을 바라보게 됩니다.

docker run -d \
--name mysql \
-e MYSQL_ROOT_PASSWORD=1212!@!@ \
-v mysql_data:/var/lib/mysql \
mysql:latest
Share