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
.
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:
VOLUME /var/lib/mysql
.some-volume
Puis,
docker run --volumes-from some-volume docker-image-name:tag
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.
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
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>
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
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.