Dockerfile에서 VOLUME의 목적은 무엇입니까?


106

Docker의 볼륨에 대해 더 깊이 이해하려고 노력하고 있으며 다음과 같은 차이점 / 사용 사례를 파악하는 데 어려움을 겪고 있습니다.

  • docker volume create명령
  • 그만큼 docker run -v /path:/host_path
  • 파일 의 VOLUME항목Dockerfile

특히 VOLUME항목을 -v플래그 와 결합하면 어떤 일이 발생하는지 이해하지 못합니다 .


답변:


70

볼륨은 다음에 저장된 영구 데이터입니다. /var/lib/docker/volumes/...

  • Dockerfile에서 선언 할 수 있습니다. 즉, 컨테이너가 이미지에서 시작될 때마다 옵션 이 없더라도 볼륨이 생성됩니다 ( empty ) -v.

  • 런타임에 선언 할 수 있습니다 docker run -v [host-dir:]container-dir.
    두 개 ( VOLUME+ docker run -v)를 결합하면 호스트 폴더의 내용을 컨테이너에 의해 유지되는 볼륨에 마운트 할 수 있습니다./var/lib/docker/volumes/...

  • docker volume create 는 Dockerfile을 정의하고 이미지를 빌드하고 컨테이너를 실행할 필요없이 볼륨을 생성 합니다. 다른 컨테이너가 해당 볼륨을 빠르게 마운트 할 수 있도록하는 데 사용됩니다.

볼륨에 일부 콘텐츠를 유지했지만 그 이후 컨테이너를 삭제 한 경우 (기본적으로 docker rm -v를 사용하지 않는 한 관련 볼륨을 삭제하지 않음) 해당 볼륨을 새 컨테이너에 다시 연결할 수 있습니다 (선언 같은 볼륨).

" Docker-컨테이너에 연결되지 않은 볼륨에 액세스하는 방법 "을 참조하십시오 .
docker volume create를 사용하면 명명 된 볼륨을 컨테이너에 쉽게 다시 연결할 수 있습니다.

docker volume create --name aname
docker run -v aname:/apath --name acontainer
...
# modify data in /apath
...
docker rm acontainer

# let's mount aname volume again
docker run -v aname:/apath --name acontainer
ls /apath
# you find your data back!

2
Dockerfilewith VOLUME-v /path:/host_path/플래그 를 사용한다고 가정 해 보겠습니다 . 의 내용 VOLUME/host_path/? 의 내용으로 대체됩니다 .
radium226

@VonC 덕분에 나는 그것을 얻을 것이라고 생각합니다 :) 그리고 a docker volume create --name my_volume뒤에 a docker run --volume-from my_volume를 수행하면 마운트 지점이 어디에 있는지 어떻게 알 수 있습니까?
radium226

@ radium226 마운트 지점이 없습니다 (기본 빈 / var / lib / docker / volume 옆에 호스트에서 마운트 된 것이 없음을 의미 함). 볼륨의 경로는 my_volume 메타 데이터에 있습니다. stackoverflow.com/a/31997267/6309
VonC

호스트 측에 마운트 지점이 없다는 것을 알고 있습니다. 그러나로 라 우치 된 실행중인 컨테이너 내 docker run ...에서 my_volume볼륨에 저장된 파일에 어떻게 쓸 수 있습니까? 나는 ... 경로를 모른다? 아무것도 정의하지 않았기 때문에 실행중인 컨테이너 내부의 볼륨의 내 목소리가 확실하지 않기 때문에 충분히 명확하길 바랍니다 :-/
radium226

1
@ radium226은 명명 된 볼륨을 docker volume create --name aname생성합니다 . 런타임에 컨테이너 경로를 할당 합니다 : : 이제 해당 컨테이너에 볼륨이 연결되어 / apath 폴더에 마운트됩니다. 나는 그것을 명확히하기 위해 답을 다시 썼다. docker run -v aname:/apath
VonC

11

VOLUMEvolumes-from런타임 매개 변수 와 결합하면 명령이 흥미로워집니다 .

다음 Dockerfile이 주어지면 :

FROM busybox
VOLUME /myvolume

다음을 사용하여 이미지를 만듭니다.

docker build -t my-bb .

다음을 사용하여 컨테이너를 회전합니다.

docker run --rm -it --name my-first-bb my-bb

가장 먼저 주목할 점은이 이미지에라는 폴더가 있다는 것 myvolume입니다. 그러나 컨테이너를 종료하면 볼륨도 제거되므로 특히 흥미롭지 않습니다.

이 폴더에 빈 파일을 생성하므로 컨테이너에서 다음을 실행합니다.

cd myvolume
touch hello.txt

이제 새 컨테이너를 회전하되 다음과 동일한 볼륨을 공유합니다 my-first-bb.

docker run --rm -it --volumes-from my-first-bb --name my-second-bb my-bb

당신은 그 볼 my-second-bb파일이 들어 hello.txt있는 myvolume폴더를.

두 컨테이너를 모두 종료하면 볼륨도 제거됩니다.


볼륨은 익명 볼륨 이고 --rm옵션으로 컨테이너를 시작 했기 때문에 삭제됩니다 . 나는 그것을 언급하는 것이 효과가 있다고 생각합니다. 당신이 컨테이너를 시작하지 않은 경우 --rm, 당신은 여전히 컨테이너를 제거하고 수 익명의 볼륨 과 함께 docker rm -v my-container.
AymDev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.