본문 바로가기
프로그래밍/도커

도커 볼륨/마운트 설명과 차이점.

by Hwan2 2023. 3. 12.
반응형

Docker를 실행하게 되면 프로세스 위에 Container가 돌아가게 됩니다.

이런 Conatainer들은 Docker image를 기반으로 만들어지고 실행됩니다.

 

이러한 Container들은 Image layer위에 write형식으로 데이터들을 저장하게 됩니다.

그리고 이러한 것들을 sha256 digest 형태로 저장하고 관리하게 됩니다.

저 layer는 Overlay2 드라이버로 저장되며, /var/lib/docker/image/overlay2/layerdb/sha256

경로에 저장되게 됩니다. 여기에 Container에 작성되고 저장된 모든 데이터와 파일들이 담겨있습니다.

 

단, Container가 지워지면 기존에 write형식으로 저장되었던 layer도 지워지게 됨으로,

Image로 해당 Container를 만들어두지 않는다면 복구가 불가능 합니다.

 

이러한 복구가 안되는 상황을 극복할 수 있는 방법이 Docker Volume, Docker Bind mount 입니다.

 

1. Docker Volume

Docker Volume은 Docker에 의해 만들어지고 관리되는 하나의 Volume입니다. 주로 Host의 /var/lib/docker/volumes/ 경로에 저장되며, Container에 마운트하지 않아도 미리 생성이 가능합니다.

https://docs.docker.com/storage/volumes/

사진으로 표현하자면 이렇게 됩니다.

 

도커 볼륨을 생성하는 방법은 다음과 같습니다.

$ docker volume create hwani

$ docker volume inspect hwani
[
    {
        "CreatedAt": "2023-03-12T10:45:38Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/hwani/_data",
        "Name": "hwani",
        "Options": {},
        "Scope": "local"
    }
]

해당 볼륨을 -v option이나 --mount option으로 마운트 시킬 수 있습니다.

-v option.

$ docker run -d ubuntu -v hwani:/opt/workspace

$ docker inspect dac823315021 --format '{{json .Mounts}}' | jq
[
  {
    "Type": "volume",
    "Name": "hwani",
    "Source": "/var/lib/docker/volumes/hwani/_data",
    "Destination": "/opt/workspace",
    "Driver": "local",
    "Mode": "z",
    "RW": true,
    "Propagation": ""
  }
]
  • -v : Docker volume option입니다.
  • hwani는 Share할 Docker volume 이름입니다.
  • /opt/workspace는 Share할 Container의 경로입니다.
  • 이 둘을 연결할 때  를 사용합니다.

이렇게 되면 Container에 저장된 파일들이 Host의 hwani 볼륨에 들어가게 됩니다.

보통 DB같은 데이터들을 저장할 때 많이 사용됩니다. 

 

-volumes-from option

$ docker run -it --name ubuntu1 -v hwani:/opt/workspace ubuntu

$ docker run -it --volumes-from ubuntu1 ubuntu

해당 옵션은 Container 에서 사용하고 있는 volume을 다른 Container가 같이 Share할 수 있습니다. 

 

이렇게 docker volume create를 사용하여 볼륨을 만드는 것이 Docker Volume이라고 합니다.

 

2. Docker Bind mount

Docker volume을 사용하지 않고 Host의 디렉토리에 직접 Access하는 것을 말합니다.

Host의 디렉토리와 서로 공유함으로써 Container가 지워지더라고 Host에 남게되어 데이터를 보존할 수 있습니다.

https://docs.docker.com/storage/bind-mounts/

사용 방법은 다음과 같습니다.

$ docker run -v ~/test:/opt/workspace ubuntu

$ docker inspect 6171 --format '{{json .Mounts}}' | jq
[
  {
    "Type": "bind",
    "Source": "/Users/kyounghwan.choi/test",
    "Destination": "/opt/dir",
    "Mode": "",
    "RW": true,
    "Propagation": "rprivate"
  }
]

이렇게 함으로써 Local directory 에 Bind할 수 있습니다.

 

이것 또한 --volumes-from option을 사용할 수 있습니다.

 

3. Docker Volume vs Bind mount

이 둘의 기능적인 측면으로만 놓고 봤을 땐, 별 차이가 없습니다.

해당 Host directory위치에 파일을 생성할 수 있고, 공유할 수 있고, 수정할 수 있습니다.

 

하지만 이 둘의 차이는 분명히 존재 합니다.

 

차이점은 다음과 같습니다.

  • Docker volume으로 만들면 Docker가 관리하는 Directory내에 생성됩니다.
  • Docker cli or api를 통해서 volume은 관리가 가능 합니다. ex) docker volume prune
  • Mount는 사용자의 소유자와 권한 때문에 실행 및 수정에 문제가 있을 수 있습니다.
    즉, 보안에 취약합니다.
    반면 Volume은 여러가지 형태로 볼륨을 만들 수 있고, 관리할 수 있습니다.
# named bind mount
$ docker volume create --driver local \
      --opt type=none \
      --opt device=/home/user/test \
      --opt o=bind \
      test_vol

# nfs
$ docker volume create --driver local \
      --opt type=nfs \
      --opt o=nfsvers=4,addr=nfs.example.com,rw \
      --opt device=:/path/to/dir \
      foo

# overlay
$ docker volume create --driver local --opt type=overlay \
    --opt o=lowerdir=${PWD}/ro-data,upperdir=${PWD}/upper1,workdir=${PWD}/work1 \
    --opt device=overlay overlay1

 

이러한 점들 때문에 Bind mount보단 Volume형식을 좀 더 선호하며, 권장하고 있습니다.

 

Reference

https://serverfault.com/questions/996785/docker-volumes-vs-mount-binds-what-are-the-use-cases

 

docker - volumes vs mount binds. what are the use cases?

After reading and playing around with docker for a short while, I am considering using it in my production environment. However I am still trying to understand the difference between mount binds and

serverfault.com

https://docs.docker.com/storage/volumes/

 

Volumes

 

docs.docker.com

https://blog.logrocket.com/docker-volumes-vs-bind-mounts/

 

Docker volumes vs. bind mounts - LogRocket Blog

Learn to use both volumes and bind mounts to persist your Docker data and avoid data loss after your Docker container is destroyed.

blog.logrocket.com

https://stackoverflow.com/questions/34357252/docker-data-volume-vs-mounted-host-directory

 

docker data volume vs mounted host directory

We can have a data volume in docker: $ docker run -v /path/to/data/in/container --name test_container debian $ docker inspect test_container ... Mounts": [ { "Name": "fac362...80535", ...

stackoverflow.com

 

반응형

댓글


스킨편집 -> html 편집에서