web-dev-qa-db-fra.com

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

Quelqu'un pourrait-il m'aider à comprendre la différence entre:

VOLUME commande dans Dockerfile (couche de construction d'image)

et

-v paramètre lors de l'émission docker run- v/xyz/bla commande (couche de construction de conteneurs).

-v le paramètre est clair pour moi, 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?

32
Mohammed Noureldin

Le paramètre -v Et le mot clé VOLUME sont presque identiques. Vous pouvez utiliser -v Pour avoir le même comportement que VOLUME.

docker run -v /data

Pareil que

VOLUME /data

Mais -v a également plus d'utilisations, l'une d'elles est la correspondance avec le 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: à quoi sert VOLUME dans un Dockerfile?

Le système de fichiers conteneur est constitué de couches, donc l'écriture là-bas est plus lente et limitée (car le nombre de couches est fixe) que le système de fichiers standard.

Vous déclarez VOLUME dans votre Dockerfile pour indiquer où votre conteneur écrira les données d'application. Par exemple, un conteneur de base de données, ses données iront dans un volume indépendamment de 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 se bloquera 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 une déclaration VOLUME faite dans Dockerfile.

Cordialement

26

En un mot

Le VOLUME [PATH] l'instruction à l'intérieur d'un 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 de couches est fixe) que le système de fichiers standard.

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. Le montage de volumes à partir d'un disque plus rapide sera évidemment améliorer 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 clair pour moi, il expose simplement un répertoire de l'hôte au conteneur et vice versa

Bien que cela soit partiellement 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 Est-ce que. Un exemple:

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

Voici un volume nommé my_volume a été créé. Il se comporte comme on peut s'y attendre d'une monture "normale". Toute modification de [PATH] à l'intérieur du conteneur sera conservé dans ce volume. La différence est que Docker gère l'emplacement du volume, de sorte que vous n'avez pas à 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. Bien que vous n'ayez pas besoin d'un accès direct aux fichiers, vous souhaiterez peut-être enregistrer l'état actuel pour le monter dans d'autres conteneurs de base de données.

Le VOLUME [PATH] instruction enregistre essentiellement les instructions ci-dessus dans la métainformation de l'image. Ainsi, chaque fois que vous démarrez un conteneur à partir de cette image, Docker sait que vous souhaitez persister [PATH] dans un volume et s'occupe de ça.

12
stepf