ana bilgisayarda docker bağlama birimleri


135

Bir docker kapsayıcısı arasında klasörleri kullanarak birimleri başarıyla paylaşabildim

docker run -v /host/path:/container/path ...

Ama sorum şu ki VOLUME, bununla Dockerfile'daki komutu kullanmak arasındaki fark nedir?

VOLUME /path

VOLUMEKomut içeren bir görüntü kullanıyorum ve bunu sunucumla nasıl paylaşacağımı öğrenmek istiyorum. Ben kullanarak yapmış -vyukarıdaki komutu, ama ikisi de gerekirse ben bilmiyordum -vve VOLUME.

Yanıtlar:


155

VOLUMEKomutu ana diskte bu dizinde iç oluşturulan veya düzenlenen herhangi bir dosya sizin kabın içine bir dizin monte ve depolayacak konteyner dosya yapısı dışında sendika dosya sistemini atlayarak.

Buradaki fikir, birimlerinizin docker konteynerleriniz arasında paylaşılabilmesi ve onlara başvuran bir konteyner (çalışan veya durdurulmuş) olduğu sürece ortalıkta kalmalarıdır.

--volumes-fromBir konteyneri çalıştırdığınızda komutu kullanarak diğer konteynerlerin mevcut birimleri bağlamasını (bunları konteynerler arasında etkili bir şekilde paylaşarak) sağlayabilirsiniz .

Arasındaki temel fark VOLUMEve -v: şudur -vsizin liman işçisi kabın içine işletim sisteminden mevcut dosyaları monte edecek ve VOLUMEedecek yeni, boş hacim oluşturmak için ana bilgisayarda ve konteynerin içinde monte.

Misal:

  1. Bir VOLUME /var/lib/mysql.
  2. Docker görüntüsünü oluşturup etiketleyin some-volume
  3. Konteyneri çalıştırırsın

Ve sonra,

  1. Bu birimi kullanmak istediğiniz başka bir docker imajınız var
  2. Docker konteynerini aşağıdakilerle çalıştırırsınız: docker run --volumes-from some-volume docker-image-name:tag
  3. Artık, birimin some-volumebağlı olduğu bir docker kapsayıcınız var ./var/lib/mysql

Not: Kullanılması --volumes-from, birimi birimin konumunda bulunan her şeyin üzerine monte edecektir. Yani, içinde bir şeyler varsa /var/lib/mysql, cildin içeriği ile değiştirilecektir.


12
VOLUME'da zaten belirtilmiş bir dizinde -v kullanırsam ne olur?
Jeff Katlı

6
--volumes-fromAtınız olacak VOLUMEsize belirttiğiniz şey üstünden -v. İlginç bir şekilde, kapsayıcıyı ayrıcalıklı modda ( docker run --privileged) çalıştırmaya benziyor ve umounting /var/lib/mysql, -vbir VOLUME.
Chris McKinnel

2
Bir konteyner onlara başvurduğu sürece ciltlerin tutulduğunu söylüyorsunuz ve bunu başka yerlerde gördüm. docs.docker.com/userguide/dockervolumes , "Veri birimleri, kapsayıcının yaşam döngüsünden bağımsız olarak verileri sürdürmek için tasarlanmıştır. Bu nedenle Docker, bir kabı kaldırdığınızda birimleri hiçbir zaman otomatik olarak silmez ve artık olmayan" çöp toplama "birimlerini de silmez bir kapsayıcı tarafından başvurulan. " Bu ifadelerden biri yanlış olmalı.
mc0e

1
Birimdeki dosyalar, bir kapsayıcı artık ona başvurmadığında diskte tutulur, ancak birimin kendisi artık kullanılamaz (bir birimi bir kapsayıcıya manuel olarak nasıl bağlayacağınızı tam olarak bilmiyorsanız, ancak o zaman bile yapmam. bunun mümkün olup olmadığını bilmiyorum). Artık kullanılamaz dediğimde, onu kullanmak için --volumes-from kullanamazsınız demek istiyorum. Yukarıda "çöp toplama" dedikleri zaman, diskinizdeki disk bölümündeki dosyaları silmek anlamına gelir.
Chris McKinnel

1
-V kullanılarak kullanılabilirler, ancak --volumes-from ile kullanılamaz. Volumes-from, hacim verilerini almak için bir konteyner adı alır (TÜM hacim noktalarını aldığına inanıyorum). Bununla birlikte kılavuz, -v'nin kendisi için -v şeklinde adlandırılmış bir hacim sağlayabileceğinizi belirtir named-volume:/path/in/container. Adsız ciltlere adlar için karmalar verilir ve bu karmalar, sahipsiz birimlere erişmek için bir ana bilgisayar yolu yerine sağlanabilir. :) volume lsBunların hepsini göstermeyebileceğinin farkında olun - siz docker volume ls -f dangling=truede deneyin .
Jasmine Hegman

44

Kendi cevabımı ekleyeyim, çünkü diğerlerinin Docker'ın amacını kaçırdığına inanıyorum.

VOLUMEDockerfile'da kullanmak Right Way ™ 'dir, çünkü Docker'a belirli bir dizinin kalıcı veriler içerdiğini bildirmiş olursunuz. Docker, bu veriler için bir birim oluşturur ve onu kullanan tüm kapsayıcıları kaldırsanız bile onu asla silmez.

Ayrıca, birleşim dosya sistemini atlar, böylece birim aslında onu paylaşan tüm kapsayıcılarda doğru yere bağlanan (okuma-yazma veya salt okunur) gerçek bir dizindir.

Şimdi, bu verilere ana bilgisayardan erişmek için, yalnızca kapsayıcınızı incelemeniz gerekir:

# docker inspect myapp
[{
    .
    .
    .
    "Volumes": {
        "/var/www": "/var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6...",
        "/var/cache/nginx": "/var/lib/docker/vfs/dir/62499e6b31cb3f7f59bf00d8a16b48d2...",
        "/var/log/nginx": "/var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87..."
    },
    "VolumesRW": {
        "/var/www": false,
        "/var/cache/nginx": true,
        "/var/log/nginx": true
    }
}]

Genelde yaptığım şey , / srv gibi bazı standart yerlerde sembolik bağlantılar oluşturmaktır , böylece birimlere kolayca erişebilir ve içerdikleri verileri yönetebilirim (yalnızca ilgilendiğiniz birimler için):

ln -s /var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6... /srv/myapp-www
ln -s /var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87... /srv/myapp-log

Docker ana bilgisayarı bir VM'de çalışıyorsa ne olur? Örneğin, mac üzerinde boot2docker. O zaman bu ciltler yalnızca uzaktan kullanılabilir. Ayrıca, Dockerfile'da açıkladığınız gibi birimleri kullanırken, görüntünün içeriği birime kopyalanacaktır. Ancak, yerel bir dizine bağlanırken, bu kopyalama gerçekleşmez. Bunun neden böyle olduğunu biliyor musunuz? Yerel olarak bağlanmış bir birime sahip olmanın ama yine de görüntüdeki dosyalarla 'yeni başlamanın' bir yolu var mı?
LostSalad

4
docker-compose ile bunu tam olarak yapabilirsiniz, bir birimi ana işletim sisteminin belirli bir konumuna monte edebilirsiniz . Sembolik bağlantı gerekmez ...
Hugo Koopmans

@Tobia: örnek docker-compose dokümanlara bakın docs.docker.com/compose/compose-file/…
Hugo Koopmans

11

VOLUME, Dockerfilediğer kaplar tarafından kullanılacak hacmi ortaya çıkarmak için kullanılır. Örnek, şu şekilde oluşturun Dockerfile:

Ubuntu'DAN: 14.04

RUN mkdir /myvol  
RUN echo "hello world" > /myvol/greeting  
VOLUME /myvol

görüntüyü oluşturun:

$ docker build -t testing_volume .

Konteyneri çalıştırın, konteynır1 deyin:

$ docker run -it <image-id of above image> bash

Şimdi volumes-from seçeneğiyle (say-container2) başka bir konteyner çalıştırın

$ docker run -it --volumes-from <id-of-above-container> ubuntu:14.04 bash

Container1 /myvoldizinindeki tüm verileri aynı yerde container2'ye alacaksınız .

-vseçeneği, kapsayıcının dizinini ana bilgisayara bağlamak için kullanılan konteynerin çalışma zamanında verilir. Kullanımı basittir, sadece -vargüman ile seçenek sağlayın <host-path>:<container-path>. Tüm komut şu şekilde olabilir:$ docker run -v <host-path>:<container-path> <image-id>


8

Temelde VOLUMEve -vseçenek neredeyse eşittir. Bunlar, 'kapsayıcınıza belirli dizini bağla' anlamına gelir. Örneğin VOLUME /datave -v /datatamamen aynı anlamdadır. Olan VOLUME /dataveya -v /dataseçeneğiyle görüntüyü çalıştırırsanız , /datadizin kapsayıcınıza bağlanır. Bu dizin, kapsayıcınıza ait değil.

/dataKonteynere bazı dosyalar eklediğinizi ve ardından konteyneri yeni görüntüye teslim ettiğinizi hayal edin . Veri dizininde dosya yok çünkü bağlanmış /datadizin orijinal kaba ait.

$ docker run -it -v /data --name volume ubuntu:14.04 bash
root@2b5e0f2d37cd:/# cd /data
root@2b5e0f2d37cd:/data# touch 1 2 3 4 5 6 7 8 9
root@2b5e0f2d37cd:/data# cd /tmp
root@2b5e0f2d37cd:/tmp# touch 1 2 3 4 5 6 7 8 9
root@2b5e0f2d37cd:/tmp# exit
exit

$ docker commit volume nacyot/volume  
835cfe3d8d159622507ba3256bb1c0b0d6e7c1419ae32751ad0f925c40378945
nacyot $ docker run -it nacyot/volume
root@dbe335c7e64d:/# cd /data
root@dbe335c7e64d:/data# ls
root@dbe335c7e64d:/data# cd /tmp
root@dbe335c7e64d:/tmp# ls
1  2  3  4  5  6  7  8  9
root@dbe335c7e64d:/tmp# 
root@dbe335c7e64d:/tmp# 

Bu bağlanmış dizin /data, uygulamanıza ait olmayan verileri depolamak için kullanılır. Ve kullanarak konteynere ait olmayan veri dizinini önceden tanımlayabilirsiniz VOLUME.

VolumeVe -vseçenek arasındaki fark , -vseçeneği kapsayıcı başlatırken dinamik olarak kullanabilmenizdir . Bu, bazı dizini dinamik olarak bağlayabileceğiniz anlamına gelir. Diğer bir fark ise, ana bilgisayar dizininizi kapsayıcınıza bağlayabilmenizdir.-v


8

Bu, Docker belgelerinin kendisinden, basit ve açık bir şekilde yardımcı olabilir:

"Ana bilgisayar dizini, doğası gereği ana bilgisayara bağımlıdır. Bu nedenle, Dockerfile'dan bir ana bilgisayar dizinini bağlayamazsınız, VOLUME komutu, yerleşik görüntülerin taşınabilir olması gerektiğinden bir ana bilgisayar dizinini geçmeyi desteklemez. dizini tüm potansiyel ana bilgisayarlarda kullanılamaz. "

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.