이전글



도커볼륨
이전글들에서 컨테이너에서 만들어지는 데이터들을 컨테이너가 아닌 호스트나 다른 컨테이너를 통해서 저장 및 공유하는 방법을 알아보았습니다. 이번글 역시 컨테이너에 데이터를 저장하는 것이 아닌 도커 자체에서 관리하는 도커 볼륨이라는 저장소에 저장하는 방법을 알아보도록 하겠습니다.

도커는 도커 자체에 제공하는 데이터 저장공간이 있으며 이를 도커 볼륨이라고 하는데, 이곳에 컨테이너의 데이터들을 저장하게 되면 컨테이너를 제거하거나 문제가 발생한 경우에도 데이터를 보존할 수 있습니다.


도커볼륨 생성하기
먼저 도커 볼륨을 관리하는 명령어로는 docker volume이 있으며, 도커볼륨을 생성할때는 docker volume create 명령을 사용합니다.
# docker volume create --name newvolume                                                    
newvolume
cs


생성된 볼륨을 확인할때는 docker volume ls 명령을 사용합니다. 도커 볼륨을 생성할때 쓰이는 DRIVE는 직접 설정해 여러 저장소 구성을 만들 수 있지만 기본적으로는 제공되는 local DRIVE를 사용합니다. 로컬 드라이브는 이름 그대로 볼륨이 로컬 호스트에 구성됩니다.
# docker volume ls                                                                        
DRIVER              VOLUME NAME
local               newvolume
cs



컨테이너 생성시 도커 볼륨을 사용하기
볼륨이 잘 생성되었다면 docker run -v [도커볼륨명]:[컨테이너 디렉터리 경로] 를 옵션으로 주어 도커볼륨을 컨테이너의 특정 디렉터리에 마운트하여 생성합니다.
# docker run -i -t --name ubuntu1 \                                                        
> -v newvolume:/home/ \
> ubuntu:14.04
cs


ubuntu1 컨테이너가 생성되면서 컨테이너에 접속된 상태입니다. 이전에 생성했던 도커볼륨을 /home/ 에 마운트 했는데, 이곳에 파일 하나를 생성합니다.
# echo 'test!!' >> /home/test.txt                                                        
# cat /home/test.txt
test!!
cs


도커 볼륨에 데이터가 잘 저장 되었는지 확인하기 위해 호스트로 나가서 또 다른 컨테이너를 생성합니다. 호스트로 나갈때는 컨테이너가 정지되지 않기 위해 Ctrl + P 다음 Ctrl + Q 를 연달아 눌러 빠져나갑니다.

도커 볼륨은 다른 컨테이너에서 또 다시 공유할 수 있습니다.
# docker run -i -t --name ubuntu2 \                                                        
> -v newvolume:/home/ \
> ubuntu:14.04
cs


이번에는 새로 생성한 ubuntu2 컨테이너에 접속된 상태입니다. ubuntu1 컨테이너에서 생성했던 text.txt 파일을 출력합니다. 오! 역시 공유가 잘 되었습니다.
# cat /home/test.txt                                                                    
test!!
cs

이로써 도커볼륨은 호스트에 떠있는 도커 엔진이 관리하고 있다는 점과 도커볼륨은 여러 컨테이너에서 공유될 수 있다는 사실을 알게 되었습니다.

 




호스트상의 도커볼륨 실제 위치
도커볼륨은 도커 엔진에 의해 관리되므로 실제 어느곳에 저장되는지 알 필요는 없지만 그래도 알고 싶은 경우에는 docker inspect 명령어를 사용하여 알 수 있습니다. docker inspect 명령어는 container, image, volume 등의 도커를 구성하고 있는 단위들의 정보를 확인할 때 사용하는 명령어입니다.


--type 옵션에 volume을 지정해 volume 정보를 보고싶다는 것을 명시합니다.
# docker inspect --type volume newvolume                                                
[
    {
        "CreatedAt": "2018-06-26T01:25:11+09:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/newvolume/_data",
        "Name": "newvolume",
        "Options": {},
        "Scope": "local"
    }
]
cs


Mountpoint가 도커 볼륨의 물리적인 위치입니다. 호스트에서 해당 위치를 확인해보면 이전에 컨테이너에서 생성했던 파일을 볼 수 있습니다.
# ls /var/lib/docker/volumes/newvolume/_data                                            
test.txt
cs




컨테이너 생성과 동시에 도커볼륨 생성하기
만약 컨테이너 생성과 동시에 도커볼륨을 생성하여 사용하는 경우에는 -v [경로] 형태로 옵션을 주면 됩니다.
# docker run -i -t --name ubuntu1 \                                                        
> -v /home/ \
> ubuntu:14.04
cs


이렇게 하면 도커볼륨을 자동으로 생성하는데, 도커볼륨의 이름은 16진수의 임의의 값으로 정해집니다.
# docker volume ls
DRIVER              VOLUME NAME
local               37e012302cea43023d6a6ac4a26358e6d91a1a3f2eed703426ba9d0e94cd277c    
cs


자동으로 생성된 도커볼륨에 대한 정보는 docker container inspect [컨테이너명] 을 통해 알 수 있습니다. 이 명령어를 실행하면 컨테이너에 대한 모든 정보가 JSON 형식으로 출력됩니다.
# docker container inspect ubuntu1 | grep 'Source'                                        
cs


그중에 Source 속성은 컨테이너가 사용중인 자동으로 생성된 도커볼륨의 경로입니다. grep을 활용하여 심플하게 정보를 얻습니다.
# docker container inspect ubuntu1 | grep 'Source'
"Source": "/var/lib/docker/volumes/37e012302cea43023d6a6ac4a26358e6d91a1a3f2eed703426ba9d0e94cd277c/_data",
cs




사용되지 않는 도커볼륨 삭제하기
컨테이너를 삭제해도 도커볼륨은 삭제되지 않습니다. 만약 컨테이너를 지운 이후 도커볼륨 또한 필요가 없어 불필요해진 도커 볼륨을 제거하고 싶은 경우에는 docker volume prune 명령어를 사용합니다. 명령어를 실행하면 경고가 나타나는데 y를 입력하면 사용되지 않는 도커볼륨이 제거됩니다.


블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!