un conteneur est éphémère. En effet, lorsqu'il est détruit, tout ce qui était contenu dans le conteneur disparaît et ne laisse aucune trace, même sur l'hôte.
Toutes les données sont donc supprimées.
Les volumes permettent aux conteneurs de persister les données d'un conteneur sur la machine hôte ou sur un support. Ces données sont gardées en mémoire de manière permanente afin de les exporter ou de les importer et les réutiliser soit par d'autres conteneurs ou par d'autres systèmes.
Intérets :
Il existe trois types de volumes expliqués ci-dessous.
Seulement disponible sur Linux, ces volumes sont crées par docker. Les données sont stockées uniquement dans la mémoire RAM du système hôte et attachés au container. Cette option permet créer un espace de travail temporaire en mémoire, qui sera donc perdu à l’arrêt du conteneur.
Il n'y a donc pas de persistance de données, cependant les performances de vitesses d'accès aux données sont plus importantes.
docker run --mount type=tmpfs, dst=/chemin/destination/dans/conteneur, tmpfs-size=100M, tmpfs-mode=770 nom-image
\\
Les limites de docker ne permettent pas d'ajouter un volume tmpfs à un conteneur déjà en cours d'exécution. Nous devons arrêter et relancer le conteneur avec l'option –tmpfs ou via une configuration de volume dans un docker-compose.yml. Il existe cependant des solutions de contournement.
Cette fonctionnalité permet de mapper (créer un point de montage) entre un dossier de l'ordinateur local (lhôte) et un dossier de conteneur. Les données local (point de montage) vont montées dans le répertoire du conteneur. Ils offrent un moyen pratique de partager des données (fichiers et repertoires) entre l’hôte et le(s) conteneur(s).
Cette méthode se distingue par sa flexibilité et sa facilité d’utilisation, offrant une solution pratique pour le développement et les tests, ainsi que pour des scénarios de production spécifiques.
L'utilisation du bind mount peut être nécessaire dans les cas suivants :
A savoir que les dossiers et fichiers de l'hôte prennent le dessus sur les dossiers et fichiers du conteneur. Les fichiers et dossiers déjà existants non présent chez l'hôte seront inaccessible mais ne seront pas supprimées.
docker run --mount type=bind, src=/dossier/source/hote, dst=/dossier/dst/conteneur ImageOuRepository docker run --mount type=bind, src=/dosstest/test-contnr, dst=/srv/conteneur ubuntu:20.04
Globalement, bind mount est pratique pour le développement et aussi pour un accès direct aux fichiers de l'ôte.
Il est moins sécurié car le conteneur peut accéder à des fichiers sensibles.
Cette fonctionnalité permet à docker de gérer un répertoire de stockage de donnéeds généralement crée dans /var/lib/docker/volumes. Ainsi leur persistance après suppression du conteneur, les données sont sauvegardées. Il est géré entièrement par l'API, quel que soit le système. C’est la solution à privilégier dans le cas de système hétérogènes.
Le volume est extrêmement pratique dans le cas d'utilisation de bases de données ou autres applications ou de fichiers applicatifs initiaux présents dans une image.
L'utilisation de volume managé peut être nécessaire pour les critères suivants :
Un volume nommé sera créé à la demande si son nom (la source, ou ‘src’) n’existe pas, et sera réutilisé s’il existe.
Si un volume nommé vide est monté sur un conteneur où le point d’accroche (destination) n’est pas vide et contient fichiers et/ou dossiers, alors ces fichiers sont copiés dans le volume hôte en question avant démarrage du conteneur (pratique pour les databases, applications et fichiers applicatifs initiaux présents dans une image).
docker volume ls # Lister les volumes docker volume create nom_volume # Créer manuellement un volume (simple dossier vide) docker volume rm nom_volume # Supprimer un volume s'il n'est utilisé par aucun conteneur existant docker volume inspect nom_volume # Lister les informations du volume docker volume prune # Nettoyer les volumes non utilisés (peut ajouter option -f) docker volume rm $(docker volume ls -q) # Supprime tous les volumes Docker
docker run --mount type=volume, src=/dossier/source/hote, dst=/dossier/dst/conteneur ImageOuRepository docker run --mount type=volume,src=/srv/telegraf,dst=/srv/telegraf bash
La plus courte et plus légère :
# Dans le cas d'un bind mount docker run -v <volume_hôte>:<dossier_conteneur>[:ro] # Dans le cas d'un volume nommé docker run -v <volume_nommé>:<dossier_conteneur>[:ro]
La plus complète :
--mount type=bind,src=<source>,dst=<destination>,readonly --mount type=volume,src=<source>,dst=<destination> --mount type=tmpfs,dst=<destination>(,tmpfs-size=50M,tmpfs-mode=0770 bash)
Nous pouvons créer un volume nommé dans un fichier docker-compose.yml. Il doit être défini à deux endroits :
version: '3.3' services: web: #Nous précisons le contexte où le conteneur devra récupéré les fichiers necessaires à son build build: context: ./web/ dockerfile: dockerfile ports: #choix du port (8000 est le port de la machine hote, 80 est le port utilisé par le service du conteneur) - 8000:80 volumes: # VolumeWebS monté à l'emplacement /var/www/html du conteneur - VolumeWebS:/var/www/html Volumes: # Déclaration du volume VolumeWebS:
La section volumes monte le volume nommé VolumeWebS dans le conteneur à l’emplacement /var/www/html
La section globale volumes déclare le volume nommé VolumeWebS. Si le volume n’existe pas docker le créer automatiquement dans /var/lib/docker/volumes/NomVolume.
version: '3.3' services: web: #Nous précisons le contexte où le conteneur devra récupéré les fichiers nécessaires à son build build: context: ./web/ dockerfile: dockerfile ports: #choix du port (8000 est le port de la machine hote, 80 est le port utilisé par le service du conteneur) - 8000:80 volumes: # VolumeWebS monté à l'emplacement /var/www/html du conteneur - VolumeWebS:/var/www/html Volumes: # Déclaration du volume VolumeWebS : driver: local driver_opts: type: none device: /chemin/dossier/local o: bind