Backend

[ Docker ] 영구 데이터 관리 - Volumes, Bind mount

구티맨 2020. 8. 4. 14:46

도커 컨테이너에 파일을 저장하게 되면, 컨테이너 레이어에 저장이 되어 컨테이너가 내려가게 되면 지워지는 임시 저장소이다.

 

Docker에서 컨테이너가 호스트 머신에 파일을 저장하기 위해서는 두가지 방법을 제공한다.

( Linux 에서 Docker를 구동하면, tmpfs mount 도 사용할 수 있다. )

 

아래 그림은 각 mount에 대해, 차이점을 설명하고 있다.

volumes

Volumes 은 도커 컨테이너에 의해 생성, 사용되는 호스트 파일 시스템에 저장이 된다.

 

따라서, 파일을 많이 생성하더라도 컨테이너 이미지의 사이즈가 커지지 않는다.

 

아래와 같이 볼륨을 생성해서 보면, 도커에 의해 관리되는 위치는 /var/lib/docker/volumes/ 이다.

( 도커가 아닌 프로세스에서는 이 파일시스템을 수정해서는 안된다. )

$ sudo docker volume create hello
hello
$ sudo docker volume create apiVol
apiVol
$ sudo docker volume ls
DRIVER              VOLUME NAME
local               apiVol
local               hello
$ sudo docker volume inspect apiVol
[
    {
        "CreatedAt": "2020-08-04T14:22:11+09:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/apiVol/_data",
        "Name": "apiVol",
        "Options": {},
        "Scope": "local"
    }
]

 

볼륨을 생성하고, 컨테이너에 마운트를 하면 컨테이너는 볼륨에 작성을 하게 된다.

 

그리고 볼륨 하나는 여러 컨테이너에 동시에 마운트 될 수 있다.

 

특정 볼륨을 사용하는 실행 중인 컨테이너가 없더라도 볼륨은 도커에서 사용 가능하고, 자동으로 삭제되지 않는다.

( 볼륨 데이터는 컨테이너의 라이프사이클 밖에 존재한다 )

 

아래 명령으로 사용되지 않는 볼륨을 삭제할 수 있다.

$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N]
만약에 컨테이너가 임시 상태 데이터를 생성한다면, tmpfs mount 사용을 추천한다. 컨테이너의 writable layer에 데이터를 쓰지 않고 메모리에다가 쓰기 때문에 컨테이너의 퍼포먼스를 향상 시켜준다.

장점

  • bind mounts에 비해, 백업과 마이그레이션이 쉽다.
  • 도커 CLI 명령어나 API 로 볼륨을 관리할 수 있다.
  • 윈도우와 리눅스 컨테이너에 모두 동작한다.
  • 여러 컨테이너간에 더 안전하게 공유된다.
  • 원격 호스트나 크라우드에 저장할 수 있게 해주고, 암호화를 할수 있고, 다른 기능을 추가할 수 있다.

Good Use cases

  • 여러 컨테이너 간에 데이터를 공유할 때
  • 도커 호스트가 주어진 폴더나 파일 구조를 보장하지 않을 때
  • 컨테이너 데이터를 원격 호스트나 클라우드에 저장하고 싶을 때
  • 백업, 복원을 하거나 다른 도커 호스트로 데이터를 마이그레이션 해야 할 때

Bind mounts

볼륨과 다르게 호스트 파일 시스템 어디에서나 데이터를 저장할 수 있고, 도커가 아닌 프로세스도 이 파일을 수정할 수 있다.

 

docker 사이트에 글을 읽어보면, Bind mounts 보다는 Volumes을 사용하기를 추천하고 있다.

 

특별히 Bind mounts 가 필요한 경우가 아니라면, 개념 정도만 알아두고 Volumes을 사용하도록 하자.

Good Use cases

  • 호스트 머신의 설정 파일을 컨테이너에 공유 할 때
  • 도커 호스트의 파일과 디렉터리 구조가 컨테이너가 요구하는 bind mounts 와 보장될 때
# docker run -v 호스트Dir:컨테이너Dir app
docker run -v /user/data:/data app

참조

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