본문 바로가기
제품/K8, Docker

볼륨을 이용한 컨테이너 데이터 유지하기

by 헬로웬디 2024. 9. 18.

기본적으로 컨테이너가 생성한 모든 파일은 쓰기 가능한 컨테이너 레이어에 저장됩니다. 이로 인해 컨테이너가 삭제되면 해당 데이터도 같이 삭제되므로, 데이터를 영구적으로 저장할 수 없습니다. 예를 들어 데이터베이스 컨테이너를 중지하고 다시 시작했다면, 이전에 모든 데이터가 사라진 빈 데이터베이스를 마주하게 됩니다. 그럼 우리는 데이터를 어떻게 유지할 수 있을까요

 

Docker는 볼륨(Volumes)과 바인드 마운트(Bind Mounts) 두 가지 옵션을 제공하는데, 이 옵션을 사용하면 컨테이너가 중지된 후에도 파일을 유지할 수 있습니다볼륨은 Docker 컨테이너에서 생성되고 사용되는 데이터를 지속적으로 저장하는 데 선호되는 메커니즘입니다. 바인드 마운트는 호스트 머신의 디렉토리 구조와 운영 체제에 의존하는 반면, 볼륨은 Docker에 의해 완전히 관리됩니다. 볼륨은 바인드 마운트에 비해 여러 가지 장점이 있는데 볼륨에 대해서 알아볼께요

 

컨테이너 볼륨 생성하기

Docker 볼륨은 호스트 시스템의 파일 시스템을 Docker 컨테이너의 파일 시스템에 매핑하는 Docker의 기능입니다컨테이너 내부에서 외부로 향하는 바로 가기나 심볼릭 링크를 제공하는 것처럼 생각할 수 있습니다.

 

우선 myVolume라는 볼륨을 생성해볼께요. 볼륨명을 지정하지 않으면 익명의 볼륨이 생성됩니다.

# 익명의 볼륨 생성
sudo docker volume create

# myVolume 이름의 볼륨 생성 
sudo docker volume create myVolume

 

Docker 볼륨이 생성되면, Docker /var/lib/docker/volumes/{볼륨이름}의 폴더를 생성합니다. 위에서 생성한 aadd~ 로 시작하는 익명의 볼륨과 myVolume라는 볼륨을 볼수 있습니다.

 

 

컨테이너 볼륨 보기

볼륨 리스트를 보려면 다음 명령을 사용하세요. 익명 볼륨 포함한 모든 볼륨이 나열됩니다.

sudo docker volume list

 

 

볼륨에 대한 자세한 정보를 볼 수 있습니다. Mountpoint에서 컨테이너로 mount(또는 attached) 된 호스트 시스템의 위치를 확인할 수 있습니다.

sudo docker volume inspect myVolume

 

컨테이너 볼륨 삭제하기

볼륨을 삭제해볼게요.

sudo docker volume rm myVolume

 

어떤 컨테이너에서도 참조되지 않는 미사용 볼륨을 제거하려면 prune을 사용합니다. 기본적으로 익명 볼륨만 제거되는데, --all 플래그를 사용하면 익명 볼륨과 명명된 볼륨 모두를 제거할 수 있습니다.

sudo docker volume prune
sudo docker volume prune --all

 

볼륨과 함께 컨테이너 시작하기

볼륨과 함께 컨테이너를 시작해볼께요. docker run --volume 명령어를 사용하여 볼륨명:컨테이너 내의 마운트 지점을 맵핑함하여 컨테이너를 시작합니다. 다음 명령어로 컨테이너를 시작하면, myVolume는 컨테이너 내의 /var/lib/postgresql/data에 매핑됩니다. 컨테이너 실행 중에 /var/lib/postgresql/data 폴더에 작성한 모든 파일은 컨테이너 외부의 myVolume에 저장됩니다. 만약 컨테이너를 삭제하더라도, 동일한 볼륨을 사용하여 새로운 컨테이를 시작하면 여전히 파일을 볼 수 있습니다.

docker run --volume myVolume:/var/lib/postgresql/data

 

만약 볼륨명(myVolume)을 따로 지정하지 않으면, Docker는 자동으로 볼륨을 생성합니다. 

docker run --volume /var/lib/postgresql/data


호스트 시스템의 /var/lib/postgres/data를 컨테이너의 /var/lib/postgresql/data로 바로 맵핑할 수도 있습니다.

docker run --volume /var/lib/postgres/data:/var/lib/postgresql/data

 

 

실습

간단한 실습으로 확인해볼께요.

# 1.nginx를 위한 볼륨을 생성합니다. 
docker volume create nginx_volume_inhost 

# 2. Docker Hub에서 Nginx 컨테이너를 실행할 때, 볼륨을 매핑합니다.
docker run --name nginx-container --volume nginx_volume_inhost:/usr/share/nginx/html -p 80:80 -d nginx

# 3. 컨테이너의 bash를 실행하고 /usr/share/nginx/html 로 이동해서 index.html을 수정합니다.
docker exec -it nginx-container /bin/sh
> vim /usr/share/nginx/html/index.html

# 4. 위 컨테이너를 삭제하고 새 컨테이너를 생성합니다. 
docker stop nginx-container && docker rm nginx-container
docker run --name nginx-container_new --volume nginx_volume_inhost:/usr/share/nginx/html -p 80:80 -d nginx

# 5. nginx에 접속해서 index.html을 확인합니다.
curl http://localhost

 

두 번째 생성한 nginx에서 수정된 index.html을 확인할 수 있습니다.

'제품 > K8, Docker' 카테고리의 다른 글

[k8] Node Affinity  (0) 2025.10.04
[k8] Taints와 Tolerations  (0) 2025.09.28
[k8] kubeadm을 이용한 Kubernetes 클러스터 구축하기  (0) 2025.08.16
[k8] 영구 볼륨  (0) 2025.08.01
Docker 커맨트 정리  (0) 2024.09.23