48 votes

Différence entre la déclaration VOLUME dans Dockerfile et -v en tant que paramètre d'exécution de docker

Peut-on m'aider à comprendre la différence entre:

VOLUME commande en Dockerfile (la construction de l'image de la couche)

et

-v paramètre lors de l'émission d' docker runv/xyz/bla commande (conteneur de construction de la couche).

-v paramètre est pour moi, clairement, simplement, il expose un répertoire de l'hôte vers le conteneur et vice versa, mais comment fait - VOLUME en Dockerfile se comporter différemment?

46voto

Carlos Rafael Ramirez Points 3206

L' -v paramètre et VOLUME mot-clé sont presque les mêmes. Vous pouvez utiliser -v d'avoir le même comportement que l' VOLUME.

docker run -v /data

Même que

VOLUME /data

Mais aussi -v ont plusieurs utilisations, l'un d'eux est l'endroit où la carte du 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,

La question est donc: qu'est-ce que l'utilisation d' VOLUME en Dockerfile?

Le conteneur de système de fichiers est faite de couches ainsi écrit-il, est plus lente et limitée (parce que le nombre fixe de couches) de la plaine du système de fichiers.

Vous déclarez VOLUME votre Dockerfile pour désigner l'endroit où votre conteneur va écrire les données de l'application. Par exemple, un conteneur de base de données, ses données vont dans un volume peu importe ce que vous mettez dans votre docker run.

Si vous créez un conteneur docker pour JBoss et que vous souhaitez utiliser rapide du système de fichiers d'accès avec libaio yo besoin de déclarer le répertoire de données en tant que VOLUME ou JBoss se crash au démarrage.

En résumé, VOLUME déclare un volume peu importe ce que vous faites en docker run. En fait, en docker run vous ne pouvez pas annuler un VOLUME déclaration faite en Dockerfile.

Ce qui concerne

17voto

stepf Points 334

En un mot

L' VOLUME [PATH] d'instructions à l'intérieur d'un Dockerfile est équivalent à

$ docker run -v $(docker volume create):[PATH] [IMAGE_NAME]

Explication détaillée

Le conteneur de système de fichiers est faite de couches, de manière à l'écriture, il est plus lent et limité (parce que le nombre fixe de couches) de la plaine du système de fichiers.

À l'aide de volumes dans le menu fixe est principalement moins d'une question de vitesse qu'une question de persistance des données indépendantes à partir d'un conteneur du cycle de vie. Le montage des volumes à partir d'un disque plus rapide sera bien évidemment d'améliorer les performances, mais Docker du comportement par défaut de VOLUME est de créer un nom de volume sur le système hôte avec peu ou pas d'améliorations de la vitesse par rapport au conteneur de l'écriture de la couche.

-v paramètre est pour moi, clairement, simplement, il expose un répertoire de l'hôte vers le conteneur et vice versa

Alors que c'est en partie vrai, -v peut également être utilisé pour monter nommé volumes dans votre conteneur Docker au lieu d'un répertoire. Ce petit détail est important pour comprendre ce qu' VOLUME n'. 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 attendre d'un "normal" d'un montage. Toute modification de [PATH] à l'intérieur du conteneur sera conservée dans ce volume. La différence est que Docker gère le volume de l'emplacement, de sorte que vous n'avez pas besoin de s'inquiéter (c'est - /var/lib/docker/volumes/my_volume/_data dans le cas où vous êtes intéressé). Pourquoi voudriez-vous cela? Vous pourriez avoir une base de données de test. Alors que vous n'avez pas besoin d'un accès direct aux fichiers, vous pouvez économiser de l'état actuel de monter dans d'autres conteneurs de base de données.

L' VOLUME [PATH] enseignement essentiellement enregistre les instructions ci-dessus dans l'image de la métainformation. Donc, chaque fois que vous démarrez un conteneur à partir de cette image, Docker sait que vous voulez persister [PATH] dans un volume et prend soin de cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X