formulous

주니어 개발자의 개발 지식 공유 블로그입니다.

Docker

[docker] 볼륨(volume) 의 개념에 대해 알아보고 활용해봅시다.

formulous 2023. 1. 30. 14:31

 

안녕하세요.

 

오늘은 docker에서 또 하나의 중요한 개념인 볼륨(volume)에 대해 알아보겠습니다.

 

 

docker는 원하는 이미지를 바탕으로 하나의 가상화 환경을 손쉽게 구축할 수 있는 대표적인 툴이죠.

 

docker는 개별적인 가상화 환경인 컨테이너에서 작업을 진행하기에 작업하는 모든 데이터는 컨테이너 내부에만 존재하게 되는데요.

 

여기서 데이터 유지에 대한 문제점이 발생하게 됩니다.

 

 

컨테이너를 삭제하게 되면 작업했던 데이터가 모두 삭제되어 버린다는 것인데요.

 

컨테이너는 삭제되어도 데이터는 유지하고 싶은 경우에는 어떻게 해야 할까요?

 

이럴 때 사용하는 것이 바로 볼륨(volume)입니다.

 

 

볼륨은 한마디로 컨테이너 내부의 데이터를 외부로 링크를 걸어주는 기능인데요.

 

볼륨을 걸어준 데이터의 경우 컨테이너 내부에서 수정되는 즉시 볼륨이 걸려있는 외부의 데이터도 같이 수정되게 됩니다.

 

그리고 그 데이터는 컨테이너가 삭제되어도 외부에 남게 되죠.

 

docker를 통해 직접 실습해 보며 해당 기능을 살펴볼까요?

 

 

첫 번째로, 볼륨을 생성해 보겠습니다.

 

볼륨은 아래 명령어로 생성할 수 있습니다.

 

 

docker volume create [생성할 볼륨 이름]

 

 

그리고 아래와 같이 ls 명령어를 통해 생성한 볼륨들의 목록을 확인할 수도 있죠.

 

 

docker volume ls

 

볼륨 데이터는 기본적으로 /var/lib/docker/volumes/ 디렉터리에 저장되게 됩니다.

 

아래와 같이 inspect 명령어를 통해 볼륨이 저장된 위치 등등 생성한 볼륨의 정보에 대해 확인해 볼 수도 있습니다.

 

 

 

이렇게 볼륨을 생성해 주고 해당 디렉터리로 가보면 빈 디렉터리임을 확인할 수 있습니다.

 

볼륨을 생성해 주었으면 컨테이너 내부 데이터와 링크를 걸어주어야 데이터 관리를 할 수 있겠죠?

 

 

생성한 볼륨에 대한 링크는 컨테이너 생성 시에 아래와 같이 연결해 줄 수 있습니다.

 

docker run -v [볼륨 이름]:[컨테이너 내부 디렉토리 경로] --name [컨테이너 이름] [이미지 이름]

 

여기서 -v 옵션이 바로 볼륨 링크를 걸어줄 수 있는 옵션인데요.

 

볼륨 이름 대신에 컨테이너 외부에 존재하는 디렉터리 경로를 입력하게 되면 해당하는 디렉터리와 링크를 걸어줄 수도 있습니다.

 

하지만 해당 방법으로 볼륨 링크를 걸어줄 때에는 입력해 준 컨테이너 외부 디렉터리의 데이터로 컨테이너 내부의 데이터가 덮어써지게 됩니다.

 

링크 걸어준 컨테이너 외부 디렉터리가 빈 디렉토리라면 컨테이너 내부 디렉터리의 내용이 삭제되고 빈 디렉터리가 되는 것이죠. (주의!)

 

이제 실제 컨테이너에서 볼륨 처리를 하고 그에 맞게 데이터가 관리되는 예시를 보도록 하겠습니다.

 

 

제가 미리 빌드해 놓은 test 이미지로 test_cont라는 테스트용 컨테이너를 생성해 보도록 하겠습니다.

 

test_cont 생성

 

위의 명령어를 살펴볼까요?

 

docker run --privileged -d -v volume_test:/vol --name test_cont test

 

우선 run 명령어는 컨테이너를 생성 및 실행하는 명령어입니다.

 

간단히 옵션들을 살펴보자면 --privileged는 좀 더 많은 실행 권한을 얻을 수 있는 옵션이고, -d 옵션은 컨테이너를 백그라운드로 실행하겠다는 의미입니다.

 

볼륨에 대한 포스팅이니만큼 오늘 알아볼 것은 그 뒤의 -v 볼륨 옵션인데요.

 

volume_test라는 이름의 볼륨에 컨테이너 내부의 /vol 디렉터리와 링크를 걸어주었습니다.

 

컨테이너 이름은 test_cont, 베이스 이미지로 제가 빌드한 test 이미지를 사용했습니다.

 

container 조회

 

조회 결과 위와 같이 컨테이너가 잘 생성되었고 실행되고 있다는 것을 확인할 수 있죠.

 

이제 컨테이너에 접속하여 volume 데이터에 대한 조작을 해보겠습니다.

 

 

docker exec -it test_cont /bin/bash

 

위 명령어로 test_cont 컨테이너에 접속하여 링크를 걸어준 vol 디렉터리에 test_dir 디렉터리를 만들고 test 파일을 만들었습니다.

 

 

이제 외부 volume에도 똑같이 데이터가 생성됐는지 확인해야겠죠??

 

 

docker volume inspect 명령어로 볼륨의 저장 경로를 확인하고, 해당 경로로 가서 파일 목록을 표출했습니다.

 

test 파일과 test_dir 디렉터리가 정상 저장된 것을 확인할 수 있습니다!

 

 

또한 docker rm 명령어로 test_cont 컨테이너를 삭제한 이후에도 volume 내부의 데이터는 그대로 남아있음을 확인할 수 있습니다.

 

오늘은 볼륨을 활용한 컨테이너 내부 데이터를 외부에서 관리하는 방법에 대해 알아보았습니다.

 

유용하게 쓰일 개념이니 잘 알아두시길 바랍니다.

 

감사합니다.