Docker

[Docker] 볼륨(Volume)과 바인드 마운트(bind mount)란?

언킴 2022. 3. 3. 14:50
반응형

도커 컨테이너에 사용된 파일들은 컨테이너가 삭제될 때 함께 삭제된다. 도커에서 많은 애플리케이션을 저장해서 계속적으로 사용할 수 있도록 해주는 옵션이 바로 볼륨과 바인드 마운트(bind mount)이다. 

 

 

 

바인드 마운트(Bind mount)

바인드 마운트는 호스트 시스템의 어느 곳에나 저장할 수 있고, non-Docker 프로세스나 도커 컨테이너 내에서 언제든지 수정이 가능하다. 또한, 바인드 마운트를 사용하면 호스트 시스템의 파일 또는 디렉터리가 컨테이너에 마운트되며, 파일 또는 디렉토리는 호스트의 전체 경로로 지정된다. 바인드 마운트의 성능은 매우 우수하지만 호스트 파일 시스템에 의존해서 사용되기 때문에 볼륨에 비해 상대적으로 기능이 제한적이다. 

 

내 호스트 파일 시스템 내에 mongodb라는 폴더가 있다고 가정해보자. 그렇다면 아래의 코드를 입력해서 컨테이너 내부의 /data/db 라는 디렉토리를 생성하고 마운트할 수 있을 것이다. 

 

$ docker run -d -v -it --name testing $pwd:/data/db <IMAGENAME>

$ docker run -d -v -it --name testing ${pwd}:/data/db <IMAGENAME>

$ docker run -d -v -it --name testing ./mongodb:/data/db <IMAGENAME>

내 호스트 파일 시스템 내에 mongodb라는 폴더가 있다고 가정해보자. 우리는 testing 컨테이너의 /data/db/ 에 mongodb라는 디렉터리를 마운트하고 싶다고 하면 위 코드를 입력해서 컨테이너 내부의 /data/db 라는 디렉토리를 생성하고 마운트할 수 있을 것이다. 

 

만약 우리가 마운트하고자 하는 컨테이너의 디렉터리 안에 파일이 존재한 상태로 마운트를 하게 된다면 기존에 존재한 내용은 전부 가려지게 된다. 

 

 

볼륨(Volume)

위에서 우리는 볼륨보다 바인드 마운트는 기능적인 부분에서 제한적이라고 언급했다. 그렇다면 볼륨이란 무엇일까? 일단 우리가 생성한 도커 내에 볼륨이 존재하는지 확인해보자. 

 

$ docker volume ls
DRIVER    VOLUME NAME

 

현재 생성된 볼륨은 아무것도 없는 것을 확인할 수 있다. 만약 볼륨을 생성하게 된다면 /var/lib/docker/volume/~ 에 볼륨이 생성된 것을 확인할 수 있고, 해당 디렉터리는 호스트 파일 시스템의 일부에 도커에서 관리하는 영역에 저장되는 것이다. 볼륨은 여러 컨테이너에 동시에 탑재할 수 있고, 실행 중인 컨테이너가 볼륨을 사용하지 않더라도 볼륨은 계속 도커에서 사용할 수 있다. 

 

도커 공식 문서에서는 볼륨이 바인트 마운트보다 좋은 장점을 아래와 같이 기재했다. 

1. 백업하거나 이동(migration)시키기 쉽다. 

2. docker CLI 명령어나 docker API로 볼륨을 관리할 수 있다. 

3. 볼륨은 리눅스, 윈도우 컨테이너에서 모두 작동한다. 

4. 컨테이너 간 볼륨을 안전하게 공유할 수 있다. 

5. 볼륨 드라이버를 사용하면 볼륨의 내용을 암호화하거나 다른 기능을 추가할 수 있다. 

6. 새로운 볼륨은 컨테이너로 내용을 미리 채울 수 있다. 

7. Docker Desktop의 볼륨은 Mac, Windows 호스트의 바인드 마운트보다 성능이 훨씬 높다. 

 

 

 

볼륨 지정 및 실행

보통 우리가 새로운 패키지나 코드를 사용할 때에는 일반적으로 깃$^\mathsf{Git}$에 접속해 소스 코드를 가지고와서 사용해보곤 한다. 혹은 우리가 만든 코드를 실험해보기 위해서는 cifar10 혹은 mnist 등의 데이터를 디렉터리에 내려받아 사용한다. 이럴때 해당 컨테이너에 볼륨 지정을 통해 디렉터리를 마운트해서 해당 디렉터리의 데이터를 사용할 수 있게 만든다. 

 

$ -v {host-volume}:{container-volume}[:ro]

docker run -it gpus all -v ~/PythonPrograming/pytorch-tutorial

옵션 값은 -v를 사용하고, 콜론 앞 주소는 호스트의 디렉터리를 의미하고, 콜론 뒤에 오는 부분은 컨테이너에 있는 디렉터리를 지정해준다. 컨테이너의 디렉터리는 컨테이너를 실행했을 경우 메인이 되는 폴더를 지정해주는데, 파이토치의 경우 workspace로 지정해주면 된다. (텐서플로의 경우 tf로 지정한다)

 

$ git clone https://github.com/yunjey/pytorch-tutorial.git

윈도우의 경우 git clone을 사용하기 위해서는 git bash를 깔아준 후 bash shell에서 gin clone을 해주어야 한다. 우리가 저장하고 싶은 Host 디렉토리에 cd로 접근한 후 git clone을 통해 pytorch-tutorial을 클론(clone)해보자.

 

$ ls -al
total 13
drwxr-xr-x 1 Bigdata21 197121 0 Mar  3 12:57 ./
drwxr-xr-x 1 Bigdata21 197121 0 Mar  3 12:57 ../
-rw-r--r-- 1 Bigdata21 197121 2 Mar  2 01:02 Dockerfile
drwxr-xr-x 1 Bigdata21 197121 0 Mar  2 00:20 git-from-dockerfile/
drwxr-xr-x 1 Bigdata21 197121 0 Mar  3 12:55 pytorch-tutorial/

pytorch-tutorial이 제대로 불러온 것을 확인할 수 있다. 그렇다면 호스트의 디렉터리와 컨테이너의 디렉터리를 연결시켜보자. 호스트 디렉터리는 pytorch-tutorial이 위치해 있는 디렉터리를 의미하고 컨테이너의 디렉터리는 workspace를 의미한다(파이토치이기 때문에!). 

 

# window일 경우 

$ docker run -it --name testing -v C:\Users\[USER_NAME]\...\:/workspace pytorch/pytorch:1.7.1-cuda11.0-cudnn8-runtime

# mac일 경우
$ docker run -it --name testing -v ~/[Directory]:/workspace pytorch/pytorch:1.7.1-cuda11.0-cudnn8-runtime

 

지정을 해서 가지고 온 후 직접 파일에 접근해서 main.py를 실행해보자. 

 

$ root@45c8934b8c1e: cd Docker/pytorch-tutorial/tutorials/01-basics/linear_regression/

 

실행할 때 module 설치가 안되었다고 하면 pip install 을 통해 설치하면 main.py 파일이 실행될 것이다. 

 

# python main.py

Epoch [5/60], Loss: 1.7295
Epoch [10/60], Loss: 0.8794
Epoch [15/60], Loss: 0.5348
Epoch [20/60], Loss: 0.3950
Epoch [25/60], Loss: 0.3381
Epoch [30/60], Loss: 0.3149
Epoch [35/60], Loss: 0.3053
Epoch [40/60], Loss: 0.3012
Epoch [45/60], Loss: 0.2994
Epoch [50/60], Loss: 0.2984
Epoch [55/60], Loss: 0.2978
Epoch [60/60], Loss: 0.2974



# ls 
main.py model.ckpt

model.ckpt는 checkpoint 파일을 의미한다. 그후 exit를 통해 파일을 나온 뒤 해당 결로에 접근해보자. 그럼 model.ckpt이 삭제되지 않고 존재하는 것을 확인할 수 있다. 컨테이너를 쓰지 않더라도 경로에 제대로 적재되었다. 

 

# dir

2022-03-03  오후 02:55    <DIR>          .
2022-03-03  오후 02:55    <DIR>          ..
2022-03-03  오후 12:55             1,607 main.py
2022-03-03  오후 03:22             1,153 model.ckpt
               2개 파일               2,760 바이트
               2개 디렉터리  802,069,688,320 바이트 남음

cmd창에서는 dir를 통해 파일을 확인할 수 있다.