Différence entre la déclaration de VOLUME dans Dockerfile et -v comme paramètre docker run
Peut-on m'aider à comprendre la différence entre:
VOLUME
commande dans Dockerfile
(Calque de construction d'image)
Et
-v
paramètre lors de l'émission docker run
-v/xyz/bla
de commande (conteneur de construction de la couche).
-v
le paramètre est pour moi clair, il expose simplement un répertoire de l'hôte au conteneur et vice versa,mais comment VOLUME
dans Dockerfile
se comporte-t-il différemment?
2 réponses
Le paramètre -v
et le mot clé VOLUME
sont presque les mêmes. Vous pouvez utiliser -v
pour avoir le même comportement que VOLUME
.
docker run -v /data
Identique à
VOLUME /data
Mais aussi-v ont plus d'utilisations, l'un d'eux est où map au volume:
docker run -v data:/data # Named volumes
docker run -v /var/data:/data # Host mounted volumes, this is what you refer to -v use, but as you can see there are more uses,
Donc, la question Est: Quelle est l'utilisation de VOLUME
dans un Dockerfile
?
Le système de fichiers conteneur est constitué de couches, donc l'écriture est plus lente et limitée (parce que le nombre fixe de couches) que le système de fichiers ordinaire.
Vous déclarez VOLUME
dans votre Dockerfile
pour indiquer où votre conteneur écrira les données de l'application. Par exemple, un conteneur de base de données, ses données iront dans un volume quel que soit ce que vous mettez dans votre docker run
.
Si vous créez un conteneur docker pour JBoss et que vous souhaitez utiliser un accès rapide au système de fichiers avec libaio
, Vous devez déclarer le répertoire de données comme VOLUME
ou JBoss Plantera au démarrage.
En résumé VOLUME
déclare un volume indépendamment de ce que vous faites dans docker run
. En fait, dans docker run
, vous ne pouvez pas annuler un VOLUME
déclaration faite Dockerfile
.
Cordialement
En un mot
L'instruction VOLUME [PATH]
dans un fichier Dockerfile est équivalente à
$ docker run -v $(docker volume create):[PATH] [IMAGE_NAME]
Explication Détaillée
Le système de fichiers conteneur est constitué de couches, donc l'écriture y est plus lente et limitée (car le nombre fixe de couches) que le système de fichiers ordinaire.
L'utilisation de volumes dans Docker est principalement moins une question de vitesse qu'une question de persistance des données indépendamment du cycle de vie d'un conteneur. volumes de montage d'un un disque plus rapide améliorera évidemment les performances, mais le comportement par défaut de docker pour VOLUME
est de créer un volume nommé sur le système hôte avec peu ou pas d'améliorations de vitesse par rapport à la couche inscriptible du conteneur.
-v
le paramètre est pour moi clair, il expose simplement un répertoire de l'hôte au conteneur et vice versa
Bien que cela soit en partie vrai, -v
peut également être utilisé pour monter volumes nommés dans votre conteneur Docker au lieu d'un répertoire. Ce petit détail est important pour comprendre ce que VOLUME
ne. Un exemple:
$ docker volume create my_volume
$ docker run -v my_volume:[PATH] [IMAGE_NAME]
Ici un volume nommé my_volume
a été créé. Il se comporte comme on peut s'y attendre d'un montage "normal". Toute modification de [PATH]
à l'intérieur du conteneur sera conservée dans ce volume. La différence est que Docker gère l'emplacement du volume, de sorte que vous n'avez pas besoin de vous inquiéter (c'est /var/lib/docker/volumes/my_volume/_data
au cas où vous seriez intéressé). Pourquoi voudriez-vous cela? Vous pourriez avoir une base de données de test. Alors que vous n'avez pas besoin accès direct aux fichiers, vous pouvez enregistrer l'état actuel pour le monter dans d'autres conteneurs de base de données.
L'instruction VOLUME [PATH]
enregistre essentiellement les instructions ci-dessus dans la métainformation de l'image. Donc, chaque fois que vous démarrez un conteneur à partir de cette image, Docker sait que vous voulez persister [PATH]
dans un volume et s'en occupe.