2015-02-14 15 views
13

Facciamo un esempio.Dockerfile: comprensione dell'istruzione VOLUME

Il seguente è l'istruzione VOLUME per l'immagine del nginx:

VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"] 

Ecco le mie domande:

  1. Quando si avvia il contenitore, si queste directory presentarsi sul mio host? E quando fermerò il mio contenitore, le directory rimarranno?

  2. Se alcune (o tutte) di queste directory esistono già nel mio host, cosa succederà? Ad esempio, supponiamo che l'immagine venga fornita con un file di configurazione predefinito nella directory /etc/nginx del contenitore e che disponga anche di un file di configurazione entro /etc/nginx sul mio host. Quando inizia il contenitore, quale di questi file avrà la priorità?

  3. Qual è la differenza principale tra -v /host/dir:container/dir e VOLUME?

Riferimenti:

risposta

16

volumi di un contenitore sono solo le directory su ° e host indipendentemente dal metodo con cui sono creati. Se non si specifica una directory sull'host, Docker creerà una nuova directory per il volume, normalmente sotto /var/lib/docker/vfs.

Tuttavia il volume è stato creato, è facile da trovare dove si trova sull'host utilizzando il comando docker inspect es:

$ ID=$(docker run -d -v /data debian echo "Data container") 
$ docker inspect -f {{.Mounts}} $ID 
[{0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951 /var/lib/docker/volumes/0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951/_data /data local true }] 

Possiamo vedere che Docker ha creato una directory per il volume a /var/lib/docker/volumes/0d7adb21591798357ac1e140735150192903daf3de775105c18149552a26f951/_data.

È possibile modificare/aggiungere/eliminare file in questa directory dall'host, ma è possibile che sia necessario utilizzare sudo per le autorizzazioni.

Docker cancellerà solo le directory del volume in due circostanze:

  • Se l'opzione --rm è dato a docker run, verranno eliminati tutti i volumi quando il contenitore esce
  • Se un contenitore viene eliminato con docker rm -v CONTAINER, qualsiasi i volumi saranno rimossi.

In entrambi i casi, i volumi verranno eliminati solo se nessun altro contenitore si riferisce ad essi. I volumi associati a directory host specifiche (la sintassi -v HOST_DIR:CON_DIR) non vengono mai eliminati da Docker. Tuttavia, se si rimuove il contenitore per un volume, lo schema di denominazione significa che sarà difficile capire quale directory contiene il volume.

domande Quindi, specifiche:

  1. Sì e sì, con avvertimenti di cui sopra.
  2. Ogni Docker gestito il volume ottiene una nuova directory sull'host
  3. L'istruzione VOLUME è identica a -v senza specificare la directory host. Quando viene specificata la dir host, Docker non crea alcuna directory per il volume, non copierà i file dall'immagine e non eliminerà mai il volume (docker rm -v CONTAINER non eliminerà i volumi mappati alle directory host specificate dall'utente).

Maggiori informazioni qui:

http://container-solutions.com/2014/12/understanding-volumes-docker/

+1

Ben fatto! Oltre al tuo articolo ho trovato la discussione sui volumi a [Container42] (http://container42.com/2014/11/03/docker-indepth-volumes/) da cpuguy83 (Developer at Docker) e la discussione molto dettagliata da [Mark Lamourine] (http://cloud-mechanic.blogspot.de/2014/10/storage-concepts-in-docker.html) come incredibile valore. –

+0

Buona risposta, molto utile. Solo l'output di 'docker inspect' è cambiato dopo la finestra mobile 1.8. Ora puoi trovare le informazioni sui volumi tramite '$ docker inspect -f '{{.Config.Volumes}}' $ ID' e' $ docker inspect -f '{{..}}' $ ID' – gengmao

+0

@gengmao Aggiornato , Grazie. –