volumi di montaggio della finestra mobile sull'host


135

Sono stato in grado di condividere con successo le cartelle tra un contenitore finestra mobile con i volumi utilizzando

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

Ma la mia domanda è quale sia la differenza tra questo e l'utilizzo del VOLUMEcomando nel Dockerfile

VOLUME /path

Sto usando un'immagine che ha un VOLUMEcomando e vorrei sapere come condividerla con il mio host. L'ho fatto usando il -vcomando sopra, ma non sapevo se avevo bisogno sia di -ve VOLUME.

Risposte:


155

Il VOLUMEcomando monterà una directory all'interno del contenitore e memorizzerà tutti i file creati o modificati all'interno di tale directory sul disco host al di fuori della struttura del file contenitore , ignorando il file system del sindacato.

L'idea è che i tuoi volumi possano essere condivisi tra i contenitori della finestra mobile e rimarranno in circolazione fintanto che esiste un contenitore (in esecuzione o arrestato) che li fa riferimento.

È possibile fare in modo che altri contenitori montino i volumi esistenti (condividendoli effettivamente tra i contenitori) utilizzando il --volumes-fromcomando quando si esegue un contenitore.

La differenza fondamentale tra VOLUMEed -vè questa: -vmonterà file esistenti dal sistema operativo all'interno del contenitore di finestra mobile e VOLUMEsi crea un nuovo, volume vuoto sul proprio host e montarlo all'interno del contenitore.

Esempio:

  1. Hai un Dockerfile che definisce a VOLUME /var/lib/mysql.
  2. Costruisci l'immagine docker e taggala some-volume
  3. Esegui il contenitore

E poi,

  1. Hai un'altra immagine docker che desideri utilizzare questo volume
  2. Si esegue il contenitore finestra mobile con il seguente: docker run --volumes-from some-volume docker-image-name:tag
  3. Ora hai un contenitore docker in esecuzione che avrà il volume some-volumemontato in/var/lib/mysql

Nota: l'utilizzo --volumes-fromconsente di montare il volume su tutto ciò che esiste nella posizione del volume. Cioè, se avessi delle cose dentro /var/lib/mysql, saranno sostituite con il contenuto del volume.


12
Cosa succede se utilizzo -v su una directory che è già stata specificata in VOLUME?
Jeff Storey,

6
--volumes-frommonterà il tuo VOLUMEsopra qualsiasi cosa tu specifichi -v. È interessante notare che sembra che esegua il contenitore in modalità privilegiata ( docker run --privileged) e umounting /var/lib/mysqllascerà solo una directory vuota in modo che il tuo -vmount venga completamente ignorato quando è in conflitto con a VOLUME.
Chris McKinnel,

2
Dici che i volumi sono conservati fintanto che un contenitore li fa riferimento e l'ho visto altrove. docs.docker.com/userguide/dockervolumes afferma che "I volumi di dati sono progettati per rendere persistenti i dati, indipendentemente dal ciclo di vita del contenitore. Docker pertanto non elimina automaticamente i volumi quando si rimuove un contenitore, né" immondizia "volumi che non sono più a cui fa riferimento un contenitore. " Una di queste affermazioni deve essere sbagliata.
MC0e

1
I file che si trovano nel volume vengono mantenuti sul disco quando un contenitore non fa più riferimento a esso, ma il volume stesso non è più utilizzabile (a meno che non si sappia esattamente come collegare manualmente un volume a un contenitore, ma anche allora non lo faccio ' non so se questo è possibile). Quando dico che non è più utilizzabile, intendo che non puoi usare --volumes-from per usarlo. Quando dicono "garbage collection" sopra, significano eliminare i file dal disco che erano nel volume.
Chris McKinnel,

1
Sono utilizzabili usando -v, ma non --volumes-from. Volumes-from prende un nome contenitore per recuperare i dati del volume da (credo che prenda TUTTI i punti del volume). Per -v stesso, tuttavia, il manuale menziona che è possibile fornire un volume denominato a -v nella forma di named-volume:/path/in/container. Ai volumi senza nome vengono dati hash per i nomi e tali hash possono essere forniti invece di un percorso host per accedere ai volumi orfani. :) volume lsPotrebbe non essere possibile mostrarli tutti: prova docker volume ls -f dangling=trueanche tu.
Jasmine Hegman,

44

Vorrei aggiungere la mia risposta, perché credo che agli altri manchi il punto di Docker.

L'uso VOLUMEnel Dockerfile è il modo giusto ™, perché si comunica a Docker che una determinata directory contiene dati permanenti. Docker creerà un volume per tali dati e non lo eliminerà mai, anche se si rimuovono tutti i contenitori che lo utilizzano.

Inoltre, ignora il file system union, in modo che il volume sia effettivamente una directory effettiva che viene montata (lettura-scrittura o sola lettura) nel posto giusto in tutti i contenitori che la condividono.

Ora, per accedere a quei dati dall'host, devi solo ispezionare il tuo contenitore:

# 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
    }
}]

Quello che faccio di solito è creare collegamenti simbolici in un posto standard come / srv , in modo da poter accedere facilmente ai volumi e gestire i dati in essi contenuti (solo per i volumi che ti interessano):

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

Cosa succede se l'host docker è in esecuzione in una macchina virtuale? Ad esempio, boot2docker su mac. Quindi questi volumi sono disponibili solo in remoto. Inoltre, quando si utilizzano i volumi nel Dockerfile come descritto, i contenuti dell'immagine verranno copiati nel volume. Tuttavia, durante il montaggio in una directory locale, questa copia non avviene. Sai perché è così? C'è un modo per avere un volume montato localmente ma 'avviare nuovamente' i file dall'immagine?
LostSalad,

4
con docker-compose puoi esattamente farlo, montare un volume su una posizione specifica del sistema operativo host . Nessun collegamento simbolico necessario ...
Hugo Koopmans,

@Tobia: esempio docker-compose vedi i documenti docs.docker.com/compose/compose-file/…
Hugo Koopmans

11

VOLUME viene utilizzato Dockerfileper esporre il volume che verrà utilizzato da altri contenitori. Esempio, crea Dockerfilecome:

DA ubuntu: 14.04

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

costruisci l'immagine:

$ docker build -t testing_volume .

Esegui il contenitore, ad esempio container1:

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

Ora esegui un altro contenitore con l'opzione volume-from come (say-container2)

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

Riceverai tutti i dati dalla /myvoldirectory container1 in container2 nella stessa posizione.

-vL'opzione viene fornita in fase di esecuzione del contenitore utilizzato per montare la directory del contenitore sull'host. È semplice da usare, basta fornire -vun'opzione con argomento come <host-path>:<container-path>. L'intero comando può essere come$ docker run -v <host-path>:<container-path> <image-id>


8

Fondamentalmente VOLUMEe l' -vopzione sono quasi uguali. Ciò significa "montare una directory specifica sul proprio contenitore". Ad esempio, VOLUME /dataed -v /dataè esattamente lo stesso significato. Se si esegue l'immagine VOLUME /datacon o con -v /dataopzione, la /datadirectory viene montata nel contenitore. Questa directory non appartiene al tuo contenitore.

Immagina di aggiungere alcuni file /datasul contenitore, quindi commettere il contenitore in una nuova immagine. Non ci sono file nella directory dei dati perché la /datadirectory montata appartiene al contenitore originale.

$ 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# 

Questa directory montata come /dataviene utilizzata per archiviare dati che non appartengono alla tua applicazione. E puoi predefinire la directory dei dati che non appartiene al contenitore usando VOLUME.

Una differenza tra Volumee -vopzione è che è possibile utilizzare l' -vopzione in modo dinamico all'avvio del contenitore. Significa che puoi montare alcune directory in modo dinamico. E un'altra differenza è che puoi montare la tua directory host sul tuo contenitore usando-v


8

Questo è dalla stessa documentazione Docker, potrebbe essere di aiuto, semplice e chiaro:

"La directory host è, per sua natura, dipendente dall'host. Per questo motivo, non è possibile montare una directory host da Dockerfile, l'istruzione VOLUME non supporta il passaggio di una directory host, perché le immagini create devono essere portatili. Un host directory non sarebbe disponibile su tutti i potenziali host. ".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.