[Docker] volume

Artiper
|2024. 6. 10. 20:06

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

 

Volumes

Volume이란 Docker 컨테이너에서 생성하고 사용하는 데이터를 지속하기 위해 선호되는 메커니즘이다. 이외 다르게 bind mount는 디렉토리 구조와 호스트 머신의 OS에 따라 달라지지만, volume은 완전히 도커에서 관리된다. 볼륨은 bind mounts보다 몇 가지 장점이 존재한다.

  • bind mount보다 백업 또는 마이그레이션이 더 쉽다.
  • Docker CLI 명령 또는 Docker API를 통해 관리 가능하다.
  • Linux, Windows 모든 컨테이너에서 동작한다
  • 여러 컨테이너들 사이에서 볼륨을 좀 더 안전하게 공유가능하다.
  • 볼륨 드라이버를 사용하면 원격 호스트 또는 클라우드 제공업체에 볼륨을 저장, 암호화, 기타 기능을 추가할 수 있다.
  • 새로운 볼륨은 컨테이너에 의해 콘텐츠가 미리 채워질 수 있다.
  • Docker Desktop의 볼륨은 Mac 및 Windows 호스트의 bind mount보다 훨씬 높은 성능을 제공한다.

또한 Volume은 컨테이너의 writable layer에 데이터를 유지하는 것보다 더 나은 선택인데, 이는 volume은 컨테이너의 사이즈를 증가시키지 않고 컨테이너의 라이프 사이클의 바깥에 존재하기 때문이다.

만약 지속될 데이터가 아닌 임시데이터들을 컨테이너에서 생성하게 된다면 tmpfs mout 사용을 고려해보라고 한다.

 

 

-v 또는 --mount 플래그 선택하기

일반적으로 --mount는 더 명시적이고 장황하다. 큰 차이점은 -v 구문은 모든 옵션을 한 필드에 결합하지만, --mount 구문은 옵션을 분리한다. 다음은 각 플래그의 syntax를 비교한 것이다.

 

만약 볼륨 드라이버 옵션 지정이 필요하다면, --mount를 사용해야 한다.

  • -v, --volume: 세 가지의 필드로 구성되어있으며 ':' 콜론 문자로 분리되어있다. 필드는 올바른 순서로 정렬되어야 하며 각 필드의 의미는 명확하지 않다.
    • 명명된 볼륨의 경우 첫 번째 필드는 볼륨의 이름이고 특정 호스트 시스템에서 고유하다. 익명 볼륨은 첫 번째 필드는 생략된다.
    • 두 번째 필드는 컨테이너에 마운트 될 파일 또는 디렉토리의 경로이다.
    • 세 번째 필드는 선택 사항이며 쉼표로 구분된 옵션 목록이다. 
  • --mount: 여러 개의 key-value 쌍으로 이루어져 있으며, ','콤마로 분리되어 있고 각각 <key>=<value> 튜플로 구성되어 있다. --mount는 -v 또는 --volume보다 뭐가 많아 보이지만 키의 순서는 중요하지 않으며 플래그의 값을 좀 더 이해하기 쉽다.
    • mount의 종류에는 bind, volume, tmpfs가 있다. 해당 공식문서에서는 volume에 대한 설명이므로 volume에 대해서만 설명이 된다.
    • destination은 파일 또는 디렉토리가 컨테이너에서 마운트되는 위치의 경로를 값으로 사용하며 destination, dst, target으로 지정할 수 있다.
    • readonly 옵션이 있으면 바인드 마운트가 컨테이너에 읽기 전용으로 마운트된다.  readonly, ro 옵션으로 지정가능하다.
    • 볼륨 옵션은 두 번 이상 지정할 수 있으며 key-value 쌍을 사용한다.

 

볼륨 생성하고 관리하기

볼륨 생성

docker volume create my-vol

볼륨 확인

docker volume ls

local               my-vol

볼륨 상세정보 확인하기

docker inspect my-vol
[
    {
        "CreatedAt": "2024-06-10T23:08:26+09:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": null,
        "Scope": "local"
    }
]

 

볼륨 삭제하기

docker volume rm my-vol

 

볼륨이 있는 컨테이너 시작 예제

존재하지 않는 볼륨으로 컨테이너를 시작하면, Docker는 volume을 자동으로 생성한다. 다음 예제는 컨테이너의 /app/ 경로에 myvol2 볼륨을 마운트하는 예제이다. -v, --mount 둘 다 같은 결과를 생성한다.

docker run -d \
  --name devtest \
  -v myvol2:/app \
  nginx:latest
docker run -d \
  --name devtest \
  --mount source=myvol2,target=/app \
  nginx:latest

 

 

 

 

https://devops.tutorials24x7.com/blog/how-to-change-docker-data-path-on-windows-10

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

https://stackoverflow.com/questions/43181654/locating-data-volumes-in-docker-desktop-windows