도커는 각 컨테이너마다 저장소를 가지고 있습니다. 하지만 컨테이너 내부에 저장되는 이 데이터는 컨테이너가 삭제될 경우 함께 사라집니다. 이러한 문제를 데이터 영속성이라고 하는데 이 데이터 영속성을 보장하기 위해 여러 방법을 지원하는데, 그 중 하나가 이 도커 볼륨입니다.
Bind Mount : 호스트 환경의 특정 경로를 컨테이너 내부 볼륨 경로와 연결하여 마운트합니다.
Volume : 도커 볼륨은 도커 컨테이너에서 도커 내부에 도커 엔진이 관리하는 볼륨을 생성하는 것입니다. 생성되니 볼륨은 호스트 디렉터리인 /var/lib/docker/volumes 경로에 저장되며, 도커를 사용하여 관리가 용이합니다.
따라서 데이터 볼륨은 컨테이너끼리 데이터를 공유할 수 있습니다.
docker volume create 명령어를 통해 도커 엔진이 관리하는 볼륨을 생성할 수 있습니다. 이 생성된 볼륨은 앞에서 말햇듯이 호스트 디렉터리인 /var/lib/docker/volumes/루트에 저장됩니다. 가장 권장되는 방법입니다.
docker volume create [이름]
docker volume ls
docker run -v [volume]:/[경로] --name [컨테이너 이름]
v옵션을 통한 호스트 볼륨 공유는 호스트의 디렉터리를 건테이너의 디렉터리에 마운트합니다.
docker volume rm
볼륨이 마운트 되어있는 컨테이너가 있을 때에는 해당 볼륨이 제거되지않습니다.
그럴 때는 해당 볼륨이 마운트되어 있는 모든 컨테이너들을 먼저 삭제하고, 볼륨을 삭제해야합니다.
docker volume inspect [이름]
docker volume prune
바인드 마운트를 사용하면 특정 경로를 컨테이너로 바로 마운트 할 수 있습니다.
컨테이너 안에 있는 디렉토리를 host의 디렉토리와 연결하는 작업입니다.
Host Directory와 마운트 하다보니 컨테이너에서 호스트의 파일 시스템에 접근하여 컨테이너에 지정된 파일이 아닌 다른 파일을 삭제/추가/수정할 수 있습니다.
docker run -v [호스트경로]:/[경로] --name [컨테이너이름] busybox
컨테이너 디렉토리가 호스트의 디렉토리와 동기화되는게 아니라 완전히 같은 디렉토리로 취급됩니다.
볼륨과 바인드 마운트의 가장 큰 차이점은 Docker가 해당 마운트 포인트를 관리하느냐 안하느냐입니다.
볼륨을 사용할 떄는 우리가 볼륨을 생성하고 삭제해야하지만, 해당 볼륨은 Docker상에서 이미지나 컨테이너 네트워크와 비슷한 방식으로 관리가 되는 이점이 있습니다. 그래서 대부분 볼륨을 사용하는게 유리하지만 컨테이너화된 로컬 개발 환경을 구성할 때는 바인드 마운트가 더 유리할 수도 있습니다.
로컬에서 개발 할때 일반적으로 현재 작업 디렉터리에 프로젝트 저장소를 git clone으로 받아놓고 코드를 변경합니다. 따라서 바인드 마운트를 이용해서 해당 디렉터리를 컨테이너의 특정 경로를 이용해서 해당 디렉터리를 컨테이너 특정 경로에 마운트해주면 코드를 변경할 때 마다 변경 사항을 실시간으로 컨테이너를 통해 확인할 수 있습니다.
리눅스에서 도커를 실행하는 경우에만 사용할 수 있는 기능입니다. 볼륨을 호스트의 파일이 아닌, 메모리에 저장하는 방식을 사용합니다.
https://anweh.tistory.com/79
https://www.daleseo.com/docker-volumes-bind-mounts/
https://junstar92.tistory.com/162
https://medium.com/dtevangelist/docker-%EA%B8%B0%EB%B3%B8-5-8-volume%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-data-%EA%B4%80%EB%A6%AC-9a9ac1db978c
https://boying-blog.tistory.com/31