Si les conteneurs sont isolés, comment peuvent-ils communiquer avec la machine hôte, peut-être pour stocker des données ? Parce que lorsque nous créons un conteneur à partir d'une image, toutes les données générées sont perdues lorsque le conteneur est supprimé.
Nous avons donc besoin d'un moyen d'avoir un stockage permanent.
Nous pouvons le faire en utilisant Bind Mounts et Volumes .
Il n'y a pas beaucoup de différence entre les deux, sauf que les montages liés peuvent pointer vers n'importe quel dossier sur l'ordinateur hôte et ne sont pas gérés directement par Docker.
Commençons par eux. Un exemple classique est les journaux. Supposons que votre application crée un fichier journal, à l'intérieur du conteneur, dans /usr/src/app/logs
. Vous pouvez le mapper à un dossier sur la machine hôte, en utilisant le -v
(identique à --volume
) indicateur lorsque vous exécutez le conteneur avec docker run
, comme ceci :-v ~/logs:/usr/src/app/logs
Cela mappera ce dossier au sous-dossier des journaux dans le répertoire personnel de l'utilisateur.
Nœud :le
-m
ou--mount
flag fonctionne de manière très similaire
C'est le drapeau utilisé avec le examplenode
image que nous avons créée précédemment :
docker run -d -p 80:3000 -v ~/logs:/usr/src/app/logs --name node-app examplenode
Nous pouvons donc maintenant exécuter notre application Node, et tout journal sera stocké sur l'ordinateur hôte, plutôt que dans le conteneur Docker.
Notez que le
examplenode
l'application ne génère aucun journal dans/usr/src/app/logs
, ce n'est qu'un exemple et vous devez d'abord configurer cette connexion.
Les détails sur le volume seront répertoriés lorsque vous exécuterez docker inspect
sur le nom du conteneur, sous "Mounts":
"Mounts": [
{
"Type": "bind",
"Source": "/Users/flavio/logs",
"Destination": "/usr/src/app/logs",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
Pouvez-vous voir "Type": "bind"
? Cela signifie que nous avons créé un montage lié .
Parlons maintenant des volumes .
La différence entre Bind Mounts et Volumes est qu'en créant des volumes, Docker stockera les données dans un dossier qu'il gère, ce qui signifie qu'il s'occupera des autorisations et de la propriété des fichiers, et il vous donnera les outils pour gérer ces volumes. Bien que les montages liés soient basés sur les chemins du système de fichiers, Docker ne peut pas fournir les outils qui les entourent.
Par exemple, Docker vous permet de supprimer tous les volumes inutilisés en exécutant docker volume prune
ou docker system prune --volumes
.
Pour créer un volume, nous devons d'abord exécuter docker volume create
:
docker volume create logs
Vous pouvez maintenant utiliser docker volume ls
et docker volume inspect
pour obtenir plus de données sur les volumes système :
Maintenant, lancez docker run
avec l'option -v logs:/usr/src/app/logs
(dites le nom du volume au lieu d'un dossier)
docker run -d -p 80:3000 -v logs:/usr/src/app/logs --name node-app examplenode
docker inspect
en cours d'exécution sur l'image affichera le volume monté :
"Mounts": [
{
"Type": "volume",
"Name": "logs",
"Source": "/var/lib/docker/volumes/logs/_data",
"Destination": "/usr/src/app/logs",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
Voir? Maintenant, les journaux seront stockés dans le /var/lib/docker/volumes/logs/_data
dossier.
Les volumes seront indispensables lorsqu'il sera temps de déployer un conteneur sur un service cloud par exemple.
Vous pouvez supprimer un volume exécutant docker volume rm <name>
.