본문 바로가기
DevOps/Docker

3. Docker Volume

by 비어원 2022. 4. 24.
728x90

도커 볼륨

도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용이 되어 컨테이너 변경사항만 별도로 컨테이너 계층에 저장하여 각 컨테이너 정보를 보존한다. 하지만 컨테이너를 삭제하게 되면 컨테이너 계층에 저장된 정보들이 모두 날아간다. 예를 들어 이전에 설치했던 mysql 컨테이너를 삭제하게 된다면 mysql에 저장된 데이터베이스 정보도 모두 삭제된다는 것이다. 컨테이너를 삭제하면 데이터를 복구할 수 없기 때문에 삭제를 신중하게 해야한다.

 

mysql 컨테이너와 같이 영속성 데이터를 저장하는 컨테이너를 실수로 삭제해버리면 데이터를 복구할 수 없는 등 치명적인 결과를 낳을 수 있는데, 이를 방지하기 위해 도커에서는 볼륨을 통해 데이터를 영속 데이터로 저장할 수 있다.

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

 

호스트와 볼륨 공유

호스트와 볼륨을 공유하여 Mysql 컨테이너를 생성해보자.

$ docker run -d \
--name wordpressdb_hostvolume \
-e MYSQL_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
-v /home/wordpress_db:/var/lib/mysql \
mysql:5.7
  • -v 옵션을 추가하여 호스트의 /home/wordpress_db 디렉터리와 컨테이너의 /var/lib/mysql 디렉터리를 공유한다. (-v {host-dir}:{container-dir})
  • 여러개의 -v 옵션을 사용하여 여러 파일 또는 디렉터리를 호스트와 공유할 수 있다.

데이터베이스의 정보가 저장되는 곳을 호스트와 볼륨을 공유하여 컨테이너가 삭제되었을 때도 데이터베이스의 정보가 남도록 구성할 수 있다. 실제로 컨테이너를 삭제해도 데이터베이스 정보가 /host/wordpress_db 에 남아있고, 같은 옵션과 명령어로 컨테이너를 다시 시작해도 정상적으로 mysql이 작동할 것이다.

호스트와 볼륨 공유는 정확히 말하자면 호스트의 디렉터리를 컨테이너의 디렉터리에 마운트하여 사용된다. 그래서 여러 개의 컨테이너가 하나의 호스트 디렉터리를 공유(마운트)하도록 구성할 수도 있다.

 

 

볼륨 컨테이너

볼륨을 사용하는 다른 방법은 -v 옵션으로 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유하는 것이다. 컨테이너를 생성할 때 --volumes-from 옵션을 설정하면 -v 옵션을 적용한 컨테이너의 볼륨 디렉터리를 공유할 수 있다.

일단 공유할 볼륨을 제공할 컨테이너를 하나 생성하자.

$ docker run -it \
--name volume_override \
-v /mnt/test:/home/test \
alicek106/volume_test

root@fd17e60a8414:/# ls /home/test
root@fd17e60a8414:/# echo aaa > /home/test/data.txt
root@fd17e60a8414:/# ls /home/test
data.txt

컨테이너를 생성한 후 shell에 들어가서 호스트와 공유하는 디렉토리인 /home/test 에 하나의 파일을 생성하였다.

그 다음 위에서 생성한 volume_override 컨테이너에서 볼륨을 공유받아 사용하는 또 다른 컨테이너를 하나 생성해보자.

$ docker run -it \
--name volumes_from_container \
--volumes-from volume_override \
ubuntu:14.04

root@da4849abddb8:/# ls /home/test
data.txt

 

 

생성 후 /home/test 디렉터리를 확인하면 volume_override 컨테이너와 같은 파일이 존재한다는 것을 알 수 있다.

여러 개의 컨테이너가 동일한 컨테이너에 --volumes-from 옵션을 사용함으로써 볼륨을 공유하여 사용할 수도 있다. 이를 활용하여 호스트에서 볼륨만 공유하고 별도의 역할을 하지 않는 일명 볼륨 컨테이너 로 활용하는 것도 가능하다.

 

 

도커 볼륨

마지막으로 볼륨을 활용하는 또 다른 방법은 docker volume 명령어를 사용하는 것이다. docker volume create 명령어로 볼륨을 생성할 수 있다. 이렇게 만들어진 볼륨은 도커가 관리한다.

$ docker volume create --name myvolume

docker volume ls 명령어를 통해 볼륨을 조회할 수 있다.

$ docker volume ls
DRIVER    VOLUME NAME
local     myvolume

볼륨을 생성할 때 플러그인 드라이버를 설정하여 여러 종류의 스토리지 백엔드를 사용할 수 있지만 기본은 local 이다. 이 볼륨은 로컬호스트에서 볼륨을 생성하여 도커 엔진에 의해 생성되고 삭제된다.

이렇게 생성된 볼륨을 사용하는 컨테이너를 생성해보자. 마찬가지로 -v 옵션을 사용하는데 조금 다른 방식으로 사용한다.

$ docker run -it \
--name myvolume-1 \
-v myvolume:/home/test \
ubuntu:14.04

root@4371d7979a79:/# echo test > /home/test/data.txt
root@4371d7979a79:/# ls /home/test
data.txt

마찬가지로 볼륨에 데이터를 넣고 같은 볼륨을 공유하는 다른 컨테이너를 생성하여 이 데이터가 존재하는지 확인해보자.

$ docker run -it \
--name myvolume-2 \
-v myvolume:/home/test \
ubuntu:14.04

root@44652ed26e28:/# ls /home/test
data.txt

당연히 같은 파일이 존재하는 것을 알 수 있다.

 

도커가 관리하는 볼륨은 어디에 저장되는가?

docker volume 으로 생성된 볼륨이 실제로 어디에 저장되는지 확인하기 위해서는 docker inspect 명령어를 사용하면 된다. 이 명령어는 컨테이너, 이미지, 볼륨 등 도커의 모든 구성 단위의 정보를 확인할 때 사용되며 정보를 확인할 때 --type 옵션에 image, volume 등을 입력하는 것이 좋다.

$ docker inspect --type volume myvolume
[
    {
        "CreatedAt": "2022-03-07T00:00:50+09:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
        "Name": "myvolume",
        "Options": {},
        "Scope": "local"
    }
]
  • Mountpoint 에 볼륨이 실제로 저장되는 위치가 있다. 사실 mountpoint를 알 필요는 없다.
  • Driver는 볼륨이 사용하는 드라이버이다.
  • Label은 볼륨을 구분하는 라벨을 나타낸다.

 

묵시적으로 볼륨 생성 및 사용

docker volume create 명령어를 사용하지 않아도 -v 옵션을 입력할 때 이를 수행하도록 설정할 수 있다. 다음과 같이 컨테이너에서 공유할 디렉터리의 위치를 -v 옵션에 입력하면 해당 디렉터리에 대한 볼륨을 자동으로 생성한다.

$ docker run -it \
--name myvolume-auto \
-v /home/test \
ubuntu:14.04

일단 새로 생성된 볼륨을 확인하기 위해 docker container inspect 명령어를 사용하자.

$ docker container inspect myvolume-auto
[
    {
        ...
        "Mounts": [
            {
                "Type": "volume",
                "Name": "8f66428829067d1ebf6386c8021268cd4bd6d48da702a3420421e9c4a95b743c",
                "Source": "/var/lib/docker/volumes/8f66428829067d1ebf6386c8021268cd4bd6d48da702a3420421e9c4a95b743c/_data",
                "Destination": "/home/test",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
        ...
    }
]

Sources에 /var/lib/docker/volumes/ 뒤에 있는 문자열의 볼륨 이름이다.

$ docker volume ls
DRIVER    VOLUME NAME
local     8f66428829067d1ebf6386c8021268cd4bd6d48da702a3420421e9c4a95b743c

볼륨 조회 결과 생성된 볼륨의 이름은 사람이 알아보기 힘든 해시값으로 저장된다. 여기서 만약 myvolume-auto 컨테이너를 삭제하면 볼륨은 삭제되지 않는다. 하지만 묵시적으로 볼륨을 생성할 경우, 컨테이너를 삭제하고 재생성하려고 할 때 어떤 볼륨을 사용했는지 알기가 힘들기 때문에 이 방법은 추천하지 않는다. (꼭 볼륨 이름을 명시하여 사용하자.)

 

마무리

지금까지 도커 컨테이너와 볼륨에 대하여 알아보았다. 다음 시간에는 도커 네트워크에 대하여 알아보자.

728x90

'DevOps > Docker' 카테고리의 다른 글

6. Dockerfile  (0) 2022.05.14
5. Docker Image  (0) 2022.05.14
4. Docker Network  (0) 2022.05.14
2. Docker Container  (0) 2022.04.24
1. Docker 소개 및 설치  (0) 2022.04.24

댓글