본문 바로가기

Container/Docker

17. Docker Volume

앞서 도커 스토리지 부분을 살펴보았고 컨테이너 레이어에 데이터는
 
컨테이너의 실행이 끝나 컨테이너가 삭제되면 사라진다고 하였다.
 
그렇다면 데이터를 보존하려고 한다면 어떻게 해야 할까?
 
컨테이너에 영구 볼륨을 추가해야 한다. 그리고 이것이 도커 볼륨이다.
 
 
Docker Volume 
 
도커 볼륨은  /var/lib/docker/volumes/<volumeName> 라는 디렉토리를 만들고 
 
이를 컨테이너 내부 디렉토리에 마운트 해준다.
 
도커 볼륨을 생성하지 않으면 임시 디렉토리 이름을 도커가 만들고 배치하며 
 
도커 볼륨을 docker volume create 명령으로 만들수도 있다.
 
 
    
Docker Data Volume
    
도커 컨테이너 생성시 -v 옵션에 '컨테이너 디렉토리' 를 제공하는 방식이다.
 
이 경우 도커는 호스트의 /var/lib/docker/volumes/<volume_name>/_data  로 이루어진
 
임시 디렉토리를 만들고 이 디렉토리와 '컨테이너 디렉토리' 를 마운트 한다.
 
근데 이 <volume_name> 이란게 사람이 기억할 수 없는 랜덤 해시값의 조합이라 
 
볼륨의 이름에 가독성이 없지만 docker volume ls 로 생성한 볼륨을 확인할 수 있으며
      
이렇게 생성된 볼륨은 도커 컨테이너가 삭제되어도 남아있게 되어
 
우리의 목적인 데이터 보존에 성공하였다.
 
 docker container run --name web -i -t -v /webapp ubuntu /bin/bash
 
 $ docker container inspect web
        "Mounts": [
            {
                "Type": "volume",
                "Name": "418ee555259f215dd66b34cdbac616b917753f9797e1e113",
                "Source": "/var/lib/docker/volumes/418ee555259f215dd66b34cdbac616b917753f9797e1e113/_data",
                "Destination": "/webapp",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
 
$ docker volume ls
     DRIVER              VOLUME NAME
     local                 418ee555259f215dd66b34cdbac616b917753f9797e1e113
     local                 a9824a42709e5d6e219760b8c6c665a5b43eb98332d628b
     local                 bc2d959080c7eebe7d140748ac760b4722c16d1aaec43015
 
$ docker container stop web
$ docker container rm web
$ docker volume ls
     DRIVER              VOLUME NAME
     local                 418ee555259f215dd66b34cdbac616b917753f9797e1e113
     local                 a9824a42709e5d6e219760b8c6c665a5b43eb98332d628b
     local                 bc2d959080c7eebe7d140748ac760b4722c16d1aaec43015
 
 
Host Docker Data Volume
 
도커 컨테이너 생성시 -v 옵션에 '호스트디렉토리':'컨테이너디렉토리' 를 제공하는 방식이다.
 
이와 같이 디렉토리를 설정하면 도커는 호스트 디렉토리와 컨테이너 디렉토리를 마운트 하며
 
컨테이너에 해당 디렉토리가 없는 경우에는 디렉토리를 생성한다.
    
만약 컨테이너 디렉토리가 있는 경우라면 호스트 디렉토리로 인해 컨테이너 디렉토리가 덮어써진다.
    
즉 컨테이너 디렉토리 내부에 데이터가 날라가기 때문에 주의가 필요하다.
 
 docker container run --name web -i -t -v /src/webapp:/webapp --name web ubuntu /bin/bash
 
 $ docker container inspect web
       "Mounts": [
            {
                "Type": "bind",
                "Source": "/src/webapp",
                "Destination": "/webapp",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
 
 
$ docker volume ls
     DRIVER              VOLUME NAME
     local                 418ee555259f215dd66b34cdbac616b917753f9797e1e113
     local                 a9824a42709e5d6e219760b8c6c665a5b43eb98332d628b75703c86b8bf3067d
     local                 bc2d959080c7eebe7d140748ac760b4722c16d1aaec43015a4a81bcfe9f48afe
 
 
Named Docker Data Volume
 
Docker Data Volume 의 문제점이 폴더 이름이 너무 어렵다는 문제가 있었고
    
Host Docker Data Volume 의 경우에는 docker volume ls 로 조회가 되지 않는 문제가 있다.
    
Named Docker Data Volume 를 사용하면 이런 문제를 해소할 수 있다.
    
이는 사실 Docker Data Volume 이며 /var/lib/docker/volumes/<volume_name>/data_
 
위치에 생성되는 점도 같지만 <volume_name> 을 사람이 미리 만들어 놓고
 
마운트 하기 때문에 가독성이 생긴다.
 
 docker volume create  --name sampleVolume
sampleVolume
 
$ docker volume ls
   DRIVER           VOLUME NAME
   local               418ee555259f215dd66b34cdbac616b917753f9797e1e113
   local               a9824a42709e5d6e219760b8c6c665a5b43eb98332d628b75703c86b8bf3067d
   local               bc2d959080c7eebe7d140748ac760b4722c16d1aaec43015a4a81bcfe9f48afe
   local               sampleVolume
 
docker container run --name web -i -t -v sampleVolume:/webapp --name web ubuntu /bin/bash
 
 $ docker container inspect web
      "Mounts": [
            {
                "Type": "volume",
                "Name": "sampleVolume",
                "Source": "/var/lib/docker/volumes/sampleVolume/_data",
                "Destination": "/webapp",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
요즘에는 --mount 옵션이 생겨서 mount type을 지정할 수 있다. ( -v 옵션은 type 이 bind )
 
그래서 type 을 tmpfs 마운트로 한다면 호스트 시스템의 메모리에만 저장된다.
 
tmpfs 마운트는 보안상의 이유 또는 App 의 비영구 상태 데이터를 저장하지 않고 날려
 
컨테이너의 성능을 보호할 때 사용한다.
 
 docker volume create  --name sampleVolume
sampleVolume 
 
docker container run \
 --mount type=bind, source=sampleVolume, target=/var/lib/mysql \
mysql
 
$ docker run \ 
  --mount type=tmpfs,destination=/app \
  nginx:latest
 
 
Docker Data Volume Container
 
볼륨 컨테이너는 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유하는 것을 말한다.
 
컨테이너 생성시 -volumes-from 옵션을 설정하게 되면 하나의 컨테이너에서 설정한 볼륨들을 공유할 수 있다.
    
    
 
Storage Drivers
 
사실 이와 같은 동작은 마운트 동작은 OS 별 스토리지 드라이버를 따르며 
 
성능도 OS 의 종류에 따라 달라진다.
 
 
 

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

19. Docker Private Registy  (0) 2020.01.14
18. Docker Security  (0) 2020.01.14
16. Docker Storage  (0) 2020.01.14
15. Docker Network DNS  (0) 2020.01.14
14. Docker Network Test  (0) 2020.01.14