본문 바로가기

개발/Docker

docker volume ( 도커 볼륨 )

도커 볼륨

도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용이 되며 컨테이너의 변경 사항만 별도로 저장합니다. mysql의 경우 데이터베이스 등의 정보는 컨테이너가 갖고 있는 것입니다. 

 

그렇기때문에, mysql 컨테이너를 삭제하면 컨테이너 계층에 저장돼있던 데이터베이스의 정보도 삭제된다는 점입니다. 이를 방지 하기 위해 컨테이너의 데이터를 영속적(persistent) 데이터로 활용할 수 있는 방법이 몇 가지 있습니다. 그중 가장 활용하기 쉬운 방법이 바로 볼륨을 활용하는 것입니다.

호스트와 볼륨을 공유할 수도 있고, 볼륨 컨테이너를 활용할 수도 있으며, 도커가 관리하는 볼륨을 생성할 수도 있습니다.

 

호스트 볼륨 공유

우선 mysql , 워드프레스 웹서버 컨테이너를 생성합니다.

docker run -d \
--name wordpressdb_hostvolume \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
-v /home/wordpress_db:/var/lib/mysql \
mysql:5.7
docker run -d \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress_hostvolume \
--link wordpressdb_hostvolume:mysql \
-p 80 \
wordpress

이전 예제와의 차이점은, mysql 에 -v 옵션을 추가했고, 그 값을 /home/wordpress_db:/var/lib/mysql 로 설정한 것입니다. 이는, 호스트의 /home/wordpress_db 와, 컨테이너의 /var/lib/mysql 디렉터리를 공유한다는 뜻입니다. 여기서 /var/lib/mysql는, MySQL이 데이터베이스를 저장하는 기본 디렉터리입니다.

 

그렇다면, 호스트에 이미 디렉터리와 파일이 존재하고 컨테이너에도 존재할 때 두 디렉터리를 공유하면 어떻게 될까요?

정확히 말하면 -v 옵션을 통한 호스트 볼륨 공유는 호스트의 디렉터리를 컨테이너의 디렉터리에 마운트합니다.

 

볼륨 컨테이너

볼륨을 사용하는 두 번째 방법은 -v 옵션으로 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유하는 것입니다.

컨테이너를 생성할 때 --volumes-from 옵션을 설정하면 -v, --volume 옵션을 적용한 컨테이너의 볼륨 디렉터리를 공유할 수 있습니다. 그러나 이는 직접 볼륨을 공유하는 것이 아닌 -v 옵션을 적용한 컨테이너를 통해 공유하는 것입니다. 

docker run -i -t \
--name volumes_from_container \
--volumes-from volume_overide \
ubuntu:14.04

volume_overide 컨테이너는 /home/testdir_2 디렉터리를 호스트와 공유하고 있다고하면 ( 미리 생성되어있음 ), 이 컨테이너를 볼륨 컨테이너로서 volumes_from_container 컨테이너에 다시 공유하는 것입니다.

쉽게 생각하면, 볼륨 컨테이너를 통해서 데이터를 간접적으로 공유받는 방식입니다.

 

도커 볼륨

세 번째 방법은 docker volume 명령어를 사용하는 것입니다. 앞선 방식도 나쁘지는 않지만, 도커 자체에서 제공하는 볼륨 기능을 활용해 데이터를 보존할 수도 있습니다.

 

볼륨을 다루는 명령어는 docker volume으로 시작하며, docker volume create 명령어로 볼륨을 생성합니다.

docker volume create --name myvolume

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

docker volume ls
# docker containter ls <-> docker ps -a 는 컨테이너

 

이렇게 생성된 볼륨은 다음 명령어를 통해 컨테이너를 생성할때 사용할 수 있습니다.

docker run -i -t --name myvolume_1 \
-v myvolume:/root/  \
ubuntu:14.04

# echo hello, volume! >> /root/volume

volume 이라는 파일을 /root에 생성합니다. 다른 컨테이너에서 myvolume을 사용하였을 때, volume 파일이 존재하는지 확인해봅니다.

 

docker run -i -t --name myvolume_2 \
-v myvolume:/root/  \
ubuntu:14.04

# cat /root/volume

같은 파일인 volume이 존재하는 것을 확인할 수 있습니다.

 

docker inspect 명령어를 사용하면 myvolume 볼륨이 실제로 어디에 저장되는지 알 수 있습니다. 

docker inspect 명령어는 컨테이너, 이미지, 볼륨 등 도커의 모든 구성 단위의 정보를 확인할 때 사용되며, 정보를 확인할 종류를 명시하기 위해 --type 옵션에 image, volume 등을 입력하는 것이 좋습니다.

 

정보를 확인할 종류를 명시하기 위해 --type 옵션에, image, volume 등을 입력하는 것이 좋습니다. 

docker inspect --type volume myvolume

docker inspect volume

mountpoint는 해당 볼륨이 실제로 호스트의 어디에 저장되었는지를 의미하지만, 사용자 입장에서는 알 필요는 없습니다.

 

docker volume create 명령을 별도로 입력하지 않아도 -v 옵션을 입력할 때 이를 수행하도록 설정할 수 있습니다. 

docker run -i -t --name volume_auto \
-v /root \
ubuntu:14.04

docker volume ls 명령어로 확인하면 16진수 무작위 이름의 볼륨이 자동으로 생성된 것을 확인할 수 있습니다.

생성된 volume_auto 컨테이너가 위의 볼륨을 사용하는지 확인하려면, docker container inspect 명령어를 이용하는 것입니다.

여기에는, 볼륨 마운트에 대한 정보도 포함되어 있습니다.

source에서 확인할 수 있습니다.

 

도커 볼륨을 사용하고 있는 컨테이너를 삭제해도 볼륨이 자동으로 삭제되지는 않습니다. 사용되지 않는 볼륨을 한꺼번에 삭제하려면 docker volume prune 명령어를 사용합니다.

 

 

이렇게, 도커 볼륨을 통한 데이터 저장에 대해서 알아보았습니다.