14/03/2024

3. Volumes

Lu 980 fois Licence Creative Commons

Démarrez un conteneur mysql:5.7 et ajoutez une table en base de données:

USE aymdev;

CREATE TABLE utilisateur (
	id INT(3) NOT NULL AUTO_INCREMENT,
    pseudo VARCHAR(20) NOT NULL,
    PRIMARY KEY (id)
)ENGINE=INNODB;

Vérifiez l'existence de la table:

USE aymdev;
SHOW TABLES;

Stoppez le conteneur puis redémarrez-le: la table est-elle toujours présente ?
Supprimez le conteneur puis recréez-le: la table est-elle toujours présente ?


Utiliser un volume

Un volume permet de sauvegarder des données générées ou utilisées par des conteneurs.
Les volumes peuvent avoir un nom, ce qui facilite leur réutilisation, et ont toujours un chemin correspondant à l'emplacement ou sera monté le volume dans le conteneur.
Un volume s'indique avec l'option -v (ou --volume) et prend en valeur nom:chemin:options. Seul le chemin est obligatoire:

docker run -d --rm --name db -p 3306:3306 --env-file ./.env -v db-vol:/var/lib/mysql mysql:5.7

Arrêtez le conteneur puis créez-en un nouveau avec les mêmes paramètres: la table utilisateur est toujours présente.


Le volume est conservé sur la machine hôte et automatiquement géré par Docker.


Utiliser un bind mount: "volume lié"

Un volume lié permet de monter un dossier/fichier spécifique de la machine hôte dans le conteneur. Il peut s'avérer utile pour modifier du code source utilisé dans un conteneur.
On peut utiliser un volume lié de la même manière qu'un volume nommé, en remplaçant le nom du volume par le chemin vers le dossier/fichier sur la machine hôte.
Créez un dossier /web/ vide et démarrez un conteneur nginx dont ce dossier est lié à /usr/share/nginx/html:

mkdir ./web
docker run -d --rm -p 8080:80 --name web-srv -v $(pwd)/web:/usr/share/nginx/html nginx

Note: utiliser un chemin relatif (ex: ./web) renverra une erreur de caractères autorisés, Docker pensant qu'il s'agit du nom d'un volume nommé. Il faut donc utiliser un chemin absolu pouvant être obtenu par substitution de commande: $(pwd).

Le serveur web est accessible à l'adresse http://127.0.0.1:8080 mais résulte en une erreur 403 car son répertoire racine ne dispose pas de fichier index.html.
Créez un fichier index.html dans le dossier /web/:

<h1>Hello from Docker !</h1>

En rafraichissant la page du navigateur, le fichier créé est retourné par le serveur: nos modifications sont prises en compte en temps réel.


Le volume est toujours sur la machine hôte mais n'est plus géré par Docker.


Volume nommé ou volume lié ?

Les volumes nommés sont automatiquement gérés par Docker et apportent des avantages:

  • facilités de sauvegardes et portabilité
  • gestion par le Docker CLI
  • lors de la création du volume, récupère le contenu dans le conteneur au lieu de le remplacer
  • ...

Ils sont à privilégier pour la sauvegarde de contenu généré par un conteneur.


A l'inverse les volumes liés vont remplacer le contenu dans le conteneur. Ils sont donc à privilégier pour remplacer des fichiers de configuration ou pour importer du code source modifiable durant le développement.