Dockerfile'da VOLUME'un amacı nedir


106

Docker'ın hacmini anlamada daha derine inmeye çalışıyorum ve aşağıdaki farkları / kullanım durumunu anlamakta zorlanıyorum:

  • docker volume createkomuta
  • docker run -v /path:/host_path
  • VOLUMEGiriş Dockerfiledosyası

VOLUMEGirişi -vbayrakla birleştirirseniz ne olacağını özellikle anlamıyorum .


Yanıtlar:


70

Bir birim, içinde depolanan kalıcı bir veridir. /var/lib/docker/volumes/...

  • Ya bir Dockerfile'da bildirebilirsiniz, bu , herhangi bir seçeneğiniz olmasa bile , görüntüden bir konteyner her başlatıldığında, birim oluşturulur ( boş ) anlamına gelir -v.

  • Bunu çalışma zamanında bildirebilirsiniz docker run -v [host-dir:]container-dir.
    ikisini ( VOLUME+ docker run -v) birleştirmek, bir ana bilgisayar klasörünün içeriğini, içinde konteyner tarafından saklanan biriminize bağlayabileceğiniz anlamına gelir./var/lib/docker/volumes/...

  • docker volume create , bir Dockerfile tanımlamaya ve bir imaj oluşturup bir konteyner çalıştırmaya gerek kalmadan bir birim oluşturur. Diğer konteynerlerin söz konusu hacmi monte etmesine hızlı bir şekilde izin vermek için kullanılır.

Bir birimdeki bazı içeriği kalıcı hale getirdiyseniz, ancak o zamandan beri kapsayıcıyı sildiyseniz (docker rm -v kullanmadığınız sürece varsayılan olarak ilişkili birimi silmez), söz konusu birimi yeni bir kaba yeniden ekleyebilirsiniz ( aynı hacim).

Bkz. " Docker - Bir konteynere bağlı olmayan bir birime nasıl erişilir? ".
Docker volume create ile bu, adlandırılmış bir birimi bir kaba yeniden eklemek kolaydır.

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
Bir Dockerfileile VOLUMEve -v /path:/host_path/bayrağı kullandığınızı varsayalım . İçeriği VOLUMEiçeriği ile overrided olacak /host_path/?
radium226

Senin sayende @VonC, sanırım anladım :) Ve eğer a'dan docker volume create --name my_volumesonra bir takip docker run --volume-from my_volumeyaparsanız, bağlama noktasının nerede olacağını nasıl anlarsınız?
radium226

@ radium226 bağlama noktası yok (ana bilgisayardan, yerel boş / var / lib / docker / birimin yanında hiçbir şey monte edilmediği anlamına gelir). Birimin yolu my_volume meta verilerindedir: stackoverflow.com/a/31997267/6309
VonC

Ana bilgisayar tarafında bağlantı noktası olmadığını anlıyorum. Ancak çalışan konteynerin içinde docker run ..., my_volumebirimde depolanan bir dosyaya nasıl yazabilirim ? Bilmiyorum ... yolu? hiçbir şey tanımlamadığım için çalışan kabımın içindeki hacim Umarım yeterince açıkımdır, çünkü mesleğimden kesinlikle emin değilim: - /
radium226

1
@ radium226, adlandırılmış bir birim docker volume create --name anameoluşturur : Çalışma zamanında bir kap yolu atarsınız :: bu kap artık kendisine bağlı, / apath klasörüne bağlanmış bir birim içerir. Bunu açıklığa kavuşturmak için cevabı yeniden yazdım. docker run -v aname:/apath
VonC

11

VOLUMEkomut, volumes-fromçalışma zamanı parametresiyle birleştirdiğinizde ilginç hale gelir .

Aşağıdaki Dockerfile göz önüne alındığında:

FROM busybox
VOLUME /myvolume

Aşağıdakilerle bir görüntü oluşturun:

docker build -t my-bb .

Ve şunlarla bir kabı döndürün:

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

Dikkat etmeniz gereken ilk şey, bu görüntüde adlı bir klasörünüz olacak myvolume. Ancak, konteynırdan çıktığımızda hacim de kaldırılacağı için özellikle ilginç değil.

Bu klasörde boş bir dosya oluşturun, bu nedenle kapsayıcıda aşağıdakileri çalıştırın:

cd myvolume
touch hello.txt

Şimdi yeni bir kap döndürün, ancak aynı hacmi paylaşın my-first-bb:

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

Bunu göreceksiniz my-second-bbdosyayı içeren hello.txtyılında myvolumeklasörde.

Her iki kaptan da çıktığınızda, cildiniz de kaldırılacaktır.


Birimler anonim birimler oldukları ve kapsayıcıları bu --rmseçenekle başlattınız çünkü silinecektir . Sanırım bundan bahsetmek işe yarayabilir. Eğer bir konteyner ile başlar olmadıysa --rm, yine kabı kaldırıp olabilir anonim hacimleri ile docker rm -v my-container.
AymDev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.