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?

24
demandé sur Carlos Rafael Ramirez 2016-10-20 22:34:39

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

18
répondu Carlos Rafael Ramirez 2017-08-14 20:28:40

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.

9
répondu stepf 2016-11-07 16:03:16