본문 바로가기
협업툴,가상환경 정리/docker_정리

도커 볼륨 vs 바인드 마운트

by 알 수 없는 사용자 2022. 9. 21.

참고 :

https://www.dltlabs.com/blog/bind-mounts-volumes-indocker-133067

 

Bind Mounts & Volumes in Docker

We share the fundamentals of Docker and tell you how Bind Mounts and Volumes work.

www.dltlabs.com

 

 

 


 

 

볼륨 마운트 가 뭐냐 라고 하면

도커 컨테이너중 하나의 저장 공간을 HOST와 공유 하는 것이다.

 

그럼 왜쓰냐 ?

1. 도커 컨테이너간에 data 통신 ( HOST에 마운트된 하나의 볼륨 공간을 여러 컨테이너가 바라보고, 저장되는 데이터로 통신 ) 

2. 도커 컨테이너의 생명 주기랑 관계 없이 데이터를 영구적으로 저장 하고 싶을 때

3. 도커 내부에서 일어나는 log 기록들을 보려면 명령어 치고~ 뭐하고~ 해야 되는데 그럴 때 마운트된 볼륨공간에 저장하면 log 체크하기 편하다.

4. 역으로 HOST에서 data(or code)를 수정하고 마운트된 볼륨공간에 넣은 다음, 그 수정된 data를 도커 컨테이너에 반영 하려고 쓰기도 함. ( 이유 : 코드나 data를 바꿀 때마다 컨테이너지우고~ 이미지지우고~ 이미지굽고~ 컨테이너띄우고~ 디버깅하기 시간이 엄청 오래걸림 불편함 )  <-- 바인드 마운트

 

 


도커 볼륨 VS 도커 바인드 마운트

도커 호스트 = 도커 컨테이너를 띄우는 host 를 의미

도커 컨테이너 = 말그대로 host에 띄우는 도커 컨테이너를 의미

 

도커 볼륨

도커 바인드 마운트

공통점 1. 도커 컨테이너의 data 를 저장하기 위한 목적
2. 도커 컨테이너 간의 data 송수신이 가능해짐
사용 목적성 Docker 컨테이너나 Docker CLI를 통해서만 액세스 가능한 볼륨이 필요할 때 1. Docker 저장소에 대한 추가적인 제어가 필요할 때
2. Docker 이외의 다른 프로세스(또는 도커Host)가 저장소 계층에 액세스 하거나 수정하도록 허용하려는 경우
동작
(내느낌)
1. data 백업용임.
ex) A라는 컨테이너를 만들고 'myVolume'이라는 볼륨을 연동 시킨 뒤 "/etc/back_up/abc.py"을 만들어놓고, B라는 컨테이너를 만들고 'myVolume' 을 연동 하면 "/etc/back_up/abc.py" 라는 파일이 로딩됨 
1. 디렉토리 연동용임.
ex) A라는 컨테이너를 만들고 도커Host 의 "/etc/shared_files" 라는 디렉토리에 바인드 마운트를 하고, 도커Host의 "/etc/shared_files" 라는 디렉토리에 파일을 생성 수정 삭제 등등 작업을 하면 A컨테이너에 그대로 업로드가 된다.
반대로 A컨테이너나 컨테이너CLI, 또는 다른 연동된 컨테이너에서 "/etc/shared_files" 디렉토리에 작업을 하면 도커 Host에서도 동일하게 확인할 수 있다.
이럴 때
사용
도커 컨테이너 데이터 보존을 목적으로할 때
도커 컨테이너에 대한 백업본이 필요할 때
도커 컨테이너 끼리 data를 share해야 할 때
도커 컨테이너 저장소를 도커 HOST에서 직접 제어해야 할 때
Docker 스토리지 확인하는 방법 1. "cd /var/lib/docker/volumes/" 내부에서 확인
2. "docker volume ls" 명령어로 확인 
바인딩된 도커 HOST or Docker 컨테이너 의 디렉토리를 확인하면 된다.
ps 나는 바인드 마운트가 좋아 보이는데 볼륨을 쓸 수 있으면 볼륨쓰는 걸 권장한다고 한다.
장점 으로 백업이나 이미그레이션 하기 쉽고, docker API로 볼륨 관리가 가능하고, 리눅스 윈도우 컨테이너 둘다 잘 작동하고, data공유가 더 안전하고, 훨씬 성능이 좋고 이러저러 많다고 함.

 


도커 바인드 마운트

1. 도커 HOST 디렉토리랑 도커 컨테이너 디렉토리 끼리 연동 및 생성

docker run -d --name bind-mount -v /home/liam/testroom/docker/binding_mount_ex_1:/app/example nginx:1.16.0

docker  run  -d --name [이름           ] -v [ 바인딩할 도커 host 디렉토리 경로                            ]:[컨테이너 경로] [도커이미지]

하고

 

2. 작동하는지 확인

도커 HOST 의 "/home/liam/testroom/docker/binding_mount_ex_1" 경로에서 아무 파일이나 만들고

 

3. 작동하는지 확인

docker exec -it bind-mount /bin/bash

명령어로 들어가서 "/app/example" 경로에 보면 도커 host에서 생성한 파일들이 고대로 들어간거 확인 가능.

 

4. 작동하는지 확인

반대로 docker CLI 에서 "/app/example" 경로에 파일 만들면,

도커 HOST의 "/home/liam/testroom/docker/binding_mount_ex_1" 경로에 생김

 


도커 볼륨 

1. 도커 볼륨 생성

docker volume create test_volume

 

2. 도커 볼륨에 컨테이너 연동 및 생성
docker run -d --name volume-container -v test_volume:/app/example nginx:1.16.0

docker  run  -d --name [컨테이너 이름      ] -v [host경로     ]:[컨테이너경로] [이미지 이름]

 

3. 작동하는지 확인

docker exec -it volume-container /bin/bash

로 docker CLI 창 들어가서 아무 디렉토리나 들어간다음 touch mkdir 등등 파일 생성하고

 

4. 작동하는지 확인

docker run -d --name volume-container-2 -v test_volume:/app/example nginx:1.16.0

다른이름의 컨테이너 생성 하면서 같은 Volume 을 연동시켜준다

 

5. 작동하는지 확인

docker exec -it volume-container-2 /bin/bash

로 docker CLI 창 들어가서 "volume-container" 에서 생성했던 파일들이 똑같이 있는지 확인하면 똑같이 있씀.

 

ps> 컨테이너를 지워도 volume이 살아 있으면 data는 유지 됨.

 

 


 

 

 

 

 

 

 

댓글