Jaki jest cel VOLUME w Dockerfile

106

Staram się pogłębić zrozumienie objętości Dockera i trudno mi zrozumieć różnice / przypadek użycia:

  • docker volume createkomenda
  • Plik docker run -v /path:/host_path
  • VOLUMEWpis w Dockerfilepliku

Szczególnie nie rozumiem, co się stanie, jeśli połączysz VOLUMEwpis z -vflagą.

rad 226
źródło

Odpowiedzi:

70

Wolumin to trwałe dane przechowywane w /var/lib/docker/volumes/...

  • Możesz zadeklarować go w pliku Dockerfile, co oznacza, że ​​za każdym razem, gdy kontener jest uruchamiany z obrazu, wolumin jest tworzony ( pusty ), nawet jeśli nie masz żadnej -vopcji.

  • Możesz to zadeklarować w czasie wykonywania docker run -v [host-dir:]container-dir.
    Połączenie dwóch ( VOLUME+ docker run -v) oznacza, że ​​możesz zamontować zawartość folderu hosta w woluminie utrwalonym przez kontener w/var/lib/docker/volumes/...

  • Docker volume create tworzy wolumin bez konieczności definiowania pliku Dockerfile i tworzenia obrazu oraz uruchamiania kontenera. Służy do szybkiego umożliwienia innym pojemnikom zamontowania wspomnianej objętości.

Jeśli zachowałeś jakąś zawartość w wolumenie, ale od tego czasu usunąłeś kontener (który domyślnie nie usuwa związanego z nim woluminu, chyba że używasz docker rm -v), możesz ponownie dołączyć ten wolumin do nowego kontenera (deklarując ta sama objętość).

Zobacz „ Docker - jak uzyskać dostęp do woluminu niepodłączonego do kontenera? ”.
Dzięki funkcji tworzenia wolumenu platformy Docker można łatwo ponownie dołączyć nazwany wolumin do kontenera.

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!
VonC
źródło
2
Powiedzmy, że używasz Dockerfilewith VOLUMEi -v /path:/host_path/flagi. Treść VOLUMEtestamentu zostanie nadpisana treścią /host_path/?
rad 226
Dzięki tobie @VonC, myślę, że rozumiem :) A jeśli zrobisz a, docker volume create --name my_volumea następnie a docker run --volume-from my_volume, skąd wiesz, gdzie będzie punkt montowania?
rad 226
@ radium226 brak punktu montowania (co oznacza, że ​​nic nie jest montowane z hosta, poza natywnym pustym / var / lib / docker / volume). Ścieżka do woluminu znajduje się w metadanych my_volume: stackoverflow.com/a/31997267/6309
VonC
Rozumiem, że po stronie hosta nie ma punktu montowania. Ale w ramach uruchomionego kontenera, którym się śmiał docker run ..., jak mogę pisać do pliku przechowywanego na my_volumewoluminie? Nie znam ... ścieżki? wolumenu w moim uruchomionym kontenerze, ponieważ nic nie zdefiniowałem? Mam nadzieję, że jestem wystarczająco jasny, ponieważ zdecydowanie nie jestem pewien swojego głosu: - /
radium 226
1
@ radium226 docker volume create --name anametworzy nazwany wolumin: przypisujesz ścieżkę do kontenera w czasie wykonywania docker run -v aname:/apath:: ten kontener ma teraz dołączony do niego wolumin, zamontowany w jego folderze / apath. Przepisałem odpowiedź, aby było to jasne.
VonC
11

VOLUMEinstrukcja staje się interesująca, gdy połączysz ją z volumes-fromparametrem runtime.

Biorąc pod uwagę następujący plik Dockerfile:

FROM busybox
VOLUME /myvolume

Zbuduj obraz za pomocą:

docker build -t my-bb .

I zakręć pojemnik z:

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

Pierwszą rzeczą, na którą należy zwrócić uwagę, jest folder o nazwie na tym obrazie myvolume. Ale nie jest to szczególnie interesujące, ponieważ kiedy wyjdziemy z pojemnika, objętość również zostanie usunięta.

Utwórz pusty plik w tym folderze, więc uruchom w kontenerze następujące polecenie:

cd myvolume
touch hello.txt

Teraz podkręć nowy pojemnik, ale podziel tę samą objętość z my-first-bb:

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

Zobaczysz, że my-second-bbzawiera plik hello.txtw myvolumefolderze.

Po wyjściu z obu pojemników twoja objętość również zostanie usunięta.

Koray Tugay
źródło
Woluminy zostaną usunięte, ponieważ są to woluminy anonimowe ORAZ kontenery zostały uruchomione z --rmopcją. Myślę, że wspomnienie o tym może zadziałać. Jeśli nie rozpocząłeś kontenera za pomocą --rm, nadal możesz usunąć kontener i jego anonimowe woluminy za pomocą docker rm -v my-container.
AymDev