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?
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
Le VOLUME [PATH]
l'instruction à l'intérieur d'un Dockerfile est équivalente à
$ docker run -v $(docker volume create):[PATH] [IMAGE_NAME]
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.