👉 이 게시글은 도커 / 쿠버네티스 온라인 부트캠프 with 카카오엔터프라이즈 강의를 바탕으로 작성되었습니다.
RAM에 저장된 데이터와는 다르게 휘발성이 없다. 영구적으로 데이터를 유지하는 것(영속성)이 볼륨의 특징이다.
API의 요청에 따라 수행된 쿼리가 DBMS에서 작동하는 상황을 가정해보자. 쿼리가 정상적으로 작동했다면 데이터가 생성, 변경, 삭제되는 작업이 수행될 것이다. 그렇다면 이러한 작업에 의해 변경된 데이터들을 보관해야 할 필요성이 생긴다. 그런데 저장공간이 따로 설정되어 있지 않고 API 컨테이너와 DBMS 컨테이너만 구동되는 상황이라면 어떻게 될까? 컨테이너가 삭제가 된다면 기존의 작업 내용은 모두 삭제된다. 이러한 상황을 방지하기 위해 나온 개념이 도커 볼륨이다.
Bind Mount는 컨테이너 내부에서 작업했던 데이터를 영구적으로, 또는 일정 기간동안 보관하기 위해 호스트의 공간에 마운트하는 것을 의미한다. 즉, 호스트 공간의 일부를 컨테이너에서 USB 메모리나 하드디스크처럼 사용하는 것이다.
다음 명령어를 통해 실제로 기존의 파일이 공유가 잘 되는지 확인해보도록 하자.
$ mkdir /home/jkseo/bindmount-test
$ cd /home/jkseo/bindmount-test
$ touch bindmount.txt
bindmount-test
폴더에 bindmount.txt
라는 파일을 생성한 뒤 해당 경로를 컨테이너의 볼륨으로 사용할 것이다. 이제 -v
옵션을 사용하여 아래와 같이 호스트 경로와 컨테이너 경로를 입력하여 컨테이너를 생성해보자.
$ docker container run -d -it --name bindmount -v /home/jkseo/bindmount-test:/bindmount-test ubuntu:18.04
$ docker container run -v <호스트 경로>:<컨테이너 경로> <이미지명:태그>
이제 지정한 경로가 생성한 컨테이너의 볼륨으로 할당이 됐는지 확인해보자.
$ docker container attach bindmount
백그라운드 프로세스로 실행된 컨테이너에 attach 명령어를 통해 접속해보자.
컨테이너 내부에 bindmount-test
폴더가 존재하는 것을 확인할 수 있다. 이제 해당 디렉토리로 이동하여 내부 파일을 변경한 후, 그 내용이 호스트에서도 반영이 되는지 확인해보도록 하자.
bindmount.txt
파일에 문자열을 입력하였다. 이제 다시 호스트로 돌아가서 입력된 문자열이 할당된 디렉토리에 반영이 되었는지 확인해보자.
컨테이너 내부에서 변경한 내용이 호스트에 그대로 적용된 것을 확인할 수 있다. 즉, 컨테이너가 삭제되더라도 데이터가 호스트의 영역에 보존되기 때문에 유실되는 것을 방지할 수 있다.
Volume은 Bind Mount 이후에 나온 개념으로, 파일 시스템 전체를 임의로 할당할 수 없고 위와 같이 지정된 경로(/var/lib/docker/volumes/<볼륨명>
)에만 컨테이너에 마운트가 가능하다. 볼륨과 컨테이너의 경로를 할당하여 컨테이너를 실행시켜보도록 하자.
$ docker container run -d -it --name volume -v volume1:/volume-test ubuntu:18.04
$ docker container run -v <볼륨명>:<컨테이너 경로> <이미지명:태그>
호스트에서 지정된 경로에 volume1
이 생성되었는지 확인해보도록 하자.
$ cd /var/lib/docker/volumes
$ sudo ls -al
volume1
이 제대로 할당된 것을 확인할 수 있다.
이전과 마찬가지로 해당 컨테이너에 접속하여 파일을 생성한 뒤, 해당 내용이 호스트에도 반영이 되는지 확인해보자.
컨테이너에서 volume.txt
파일에 volume
이라는 문자열을 입력한 후, 호스트로 다시 돌아간다.
볼륨을 통해 저장된 데이터는 /var/lib/docker/volumes<볼륨명>/_data
에 저장된다. 해당 폴더 내부에 들어가면 컨테이너에서 생성했던 volume.txt
파일과 더불어 내용까지 그대로 반영된 것을 확인할 수 있다.