본문 바로가기

DevOps/Docker

[Docker] Volume과 Bind mount에 대하여

728x90

 

안녕하세요 오랜만에 도커관련된 글을 씁니다.

 

요즘 도커에 대해 다시 열심히 공부하고있습니다. 어느정도 알았다고 생각했는데 아직 멀은거 같애요.

 

공부하고 있던 것 중 공유하면 좋을 거 같은 내용을 찾다가 이 주제로 선택했습니다.

 

바로 볼륨과 바인드 마운트입니다.

 

도커 컨테이너의 데이터를 보존하기 위해서는 두 가지 방법이 있습니다. 바로 Volume과 Bind mount인데요

 

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

 

Use volumes

Volumes are the preferred mechanism for persisting data generated by and used by Docker containers. While bind mounts are dependent on the directory structure of the host machine, volumes are...

docs.docker.com

여기 공식 docs를 보면서 천천히 이해해봅시다.

 

저같은 경우 최근까지 volume == bindmount의 개념인줄 알았습니다. docker volume은 bind monut의 한 부분인줄 알았거든요.

 

근데 비슷하면서 다른 부분이 있습니다. 공식 Docs의 그림을 봐봅시다.

 

왼쪽이 볼륨 오른쪽이 바인드 마운트인데 이렇게 그림만으로 보면 이해하기가 2퍼센트 부족하다.

 

 

공식 설명을 다시 읽어봅시다.

바인드 마운트는 볼륨에 비해 기능이 제한되어있다. 바인드 마운트를 사용하면 호스트 시스템의 파일 또는 디렉토리가 컨테이너에 마운트 된다. 파일 또는 디렉토리가 호스트 시스템의 전체 또는 상대 경로로 참조된다. 

이게 뭔소리냐 

 

docker run 명령어를 칠 때 -v 또는 --volume으로 볼륨 또는 바인드 마운트를 설정할 수 있는데

 

root@keti-server:/home/keti/server# tree -L 1
.
├── docker-compose.yml
├── influxdb
├── mongo-enter
└── mongodb

현재 파일 구조가 이렇게 있을 때 run 명령어를 

 

docker run -d -v $pwd:/data/db <이미지이름>

# 또는

docker run -d -v ./mongodb:/data/db <이미지이름>

친다면 어떻게 될까?? 

 

이렇게 되는데 Host의 mongodb 디렉토리가 컨테이너 안의 /data/db 디렉토리에 마운트된다. 

* 마운트 된다. 라는 의미에 대해 굉장히 고민을 해봤는데 찾아본결과 특정 디바이스를 사용하기 위해 하드웨어장치와 디렉토리를 연결하는 작업.

 

여기서는 컨테이너 안에 있는 디렉토리와 host의 디렉토리를 연결하는 작업이라고 이해했다.

 

이런식으로 사용하면 어떻게 될까? 현재 나는 mongodb 이미지를 사용했고 몽고디비 컨테이너가 돌아가고있다.

여기에 이제 데이터가 쌓이면 host mongodb디렉토리 안에 데이터가 쌓인다. 물론 내가 여기서 수동으로 host 쪽에서 파일같은걸 집어넣으면 똑같이 컨테이너안에 보인다. 

 

이게 바인드 마운트이고 볼륨은 그럼 뭘까?? 

 

볼륨은 따로 도커 볼륨을 만들어줘야한다. 

 

혹시 컨테이너를 만들 때 디폴트 볼륨도 만들어진다는 사실을 알고있는가?? 

 

cd /var/lib/docker/volumes/

를 들어가면 현재까지 만들어진 볼륨을 확인할 수 있다. 또는 

 

docker volume ls

root@keti-server:/var/lib/docker/volumes# docker volume ls
DRIVER              VOLUME NAME
local               c505ffbbf68cb9a89f2de03eb450750095e4774ff3985e1fd0a4d6d14c9f64a0
local               server_influx_volume
local               server_mongo_volume

docker volume ls 를 입력해도 확인할 수 있다.

 

docker run -d -v server_mongo_volume:/data/db <이미지이름>

 자 이제 아까 host에 있던 디렉토리 부분을 볼륨으로 바꾸고 실행해보자

 

바인드 마운트와 비슷하게 해당 볼륨 안에 내용이 마운트된다.

 

차이점이라면 볼륨은 도커 영역안에서 관리된다는 점이다.

 

또 다른 차이점은 바인드 마운트의 경우 외부(host)에서 컨테이너 안쪽으로 내용을 추가할 수 있지만 볼륨의 경우 그렇지 않다. 

 

볼륨이 바인드 마운트보다 좋은 장점을 docs에선 이렇게 적어놨다. 

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

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

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

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

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

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

 

 

----

오늘은 이쯤 적고 추가로 도커 볼륨관련된 내용을 이 포스트에 업데이트 하겠다.

 

 

반응형