web-dev-qa-db-fra.com

Volume de montage du docker sur l'hôte

J'ai réussi à partager des dossiers entre un conteneur de menu fixe avec des volumes à l'aide de

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

Mais ma question est quelle est la différence entre cela et l’utilisation de la commande VOLUME dans le fichier Docker

VOLUME /path

J'utilise une image qui a une commande VOLUME et j'aimerais savoir comment la partager avec mon hôte. Je l'ai fait en utilisant la commande -v ci-dessus, mais je ne savais pas si j'avais besoin à la fois de -v et de VOLUME.

116
Jeff Storey

La commande VOLUME monte un répertoire dans votre conteneur et stocke tous les fichiers créés ou modifiés à l'intérieur de ce répertoire sur le disque de votre hôte en dehors de la structure de fichier du conteneur, en contournant le système de fichiers Union.

L'idée est que vos volumes peuvent être partagés entre vos conteneurs de menu fixe et qu'ils resteront tant qu'un conteneur (en cours d'exécution ou arrêté) les référencera.

Vous pouvez faire en sorte que d'autres conteneurs montent des volumes existants (en les partageant efficacement entre conteneurs) à l'aide de la commande --volumes-from lorsque vous exécutez un conteneur.

La différence fondamentale entre VOLUME et -v est la suivante: -v monte les fichiers existants de votre système d'exploitation dans votre conteneur de menu fixe et VOLUME va créer un nouveau fichier, volume vide sur votre hôte et montez-le dans votre conteneur.

Exemple:

  1. Vous avez un fichier Docker qui définit un VOLUME /var/lib/mysql.
  2. Vous construisez l’image de menu fixe et vous la marquez some-volume
  3. Vous exécutez le conteneur

Puis,

  1. Vous avez une autre image de menu fixe que vous souhaitez utiliser ce volume
  2. Vous exécutez le conteneur de menu fixe avec les éléments suivants: docker run --volumes-from some-volume docker-image-name:tag
  3. Vous avez maintenant un conteneur de menu fixe en cours d'exécution qui aura le volume de some-volume monté dans /var/lib/mysql

Remarque: L'utilisation de --volumes-from monte le volume sur tout ce qui existe à l'emplacement du volume. C'est-à-dire que si vous aviez des éléments dans /var/lib/mysql, ils seront remplacés par le contenu du volume.

142
Chris McKinnel

Permettez-moi d'ajouter ma propre réponse, car je crois que les autres manquent le but de Docker.

Utiliser VOLUME dans le fichier Docker est la solution idéale, car vous indiquez à Docker qu’un certain répertoire contient des données permanentes. Docker créera un volume pour ces données et ne le supprimera jamais, même si vous supprimez tous les conteneurs qui l'utilisent.

Il contourne également le système de fichiers union, de sorte que le volume est en fait un répertoire réel qui est monté (en lecture-écriture ou en lecture seule) au bon endroit dans tous les conteneurs qui le partagent.

Maintenant, pour accéder à ces données à partir de l'hôte, il vous suffit d'inspecter votre conteneur:

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

Ce que je fais habituellement, c’est crée des liens symboliques à un emplacement standard tel que/srv, afin que je puisse facilement accéder aux volumes et gérer les données qu’ils contiennent (uniquement pour les volumes qui vous intéressent):

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

VOLUME est utilisé dans Dockerfile pour exposer le volume devant être utilisé par d'autres conteneurs. Exemple, créez Dockerfile comme:

D'Ubuntu: 14.04

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

construire l'image:

$ docker build -t testing_volume .

Exécutez le conteneur, dites container1:

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

Maintenant, lancez un autre conteneur avec l'option volumes-de comme (say-container2)

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

Vous obtiendrez toutes les données du répertoire container1 /myvol dans le conteneur2 au même endroit.

L'option -v est donnée au moment de l'exécution du conteneur utilisé pour monter le répertoire du conteneur sur l'hôte. Son utilisation est simple, il suffit de fournir l’option -v avec un argument tel que <Host-path>:<container-path>. La commande entière peut être comme $ docker run -v <Host-path>:<container-path> <image-id>

9
Yogesh Jilhawar

En gros, les options VOLUME et -v sont presque égales. Cela signifie "monter un répertoire spécifique sur votre conteneur". Par exemple, VOLUME /data et -v /data ont exactement la même signification. Si vous exécutez l'image avec l'option VOLUME /data ou avec l'option -v /data, le répertoire /data est monté dans votre conteneur. Ce répertoire n'appartient pas à votre conteneur.

Imaginez que vous ajoutez des fichiers à /data sur le conteneur, puis validez le conteneur dans une nouvelle image. Il n'y a pas de fichiers dans le répertoire de données car le répertoire monté /data appartient au conteneur d'origine.

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

Ce répertoire monté comme /data sert à stocker des données n'appartenant pas à votre application. Et vous pouvez prédéfinir le répertoire de données n'appartenant pas au conteneur en utilisant VOLUME.

Une différence entre les options Volume et -v est que vous pouvez utiliser l'option -v de manière dynamique lors du démarrage du conteneur. Cela signifie que vous pouvez monter un répertoire de manière dynamique. Et une autre différence est que vous pouvez monter votre répertoire hôte sur votre conteneur en utilisant -v

7
nacyot

Ceci est tiré de la documentation de Docker elle-même, pourrait être utile, simple et clair:

"Le répertoire de l'hôte dépend, de par sa nature, de l'hôte. Pour cette raison, vous ne pouvez pas monter un répertoire de l'hôte à partir de Dockerfile, l'instruction VOLUME ne permet pas de passer un répertoire de l'hôte, car les images construites doivent être portables. Un hôte Le répertoire ne serait pas disponible sur tous les hôtes potentiels.

6
Vennesa