Persistance des données du conteneur
Explication
Lorsqu'un conteneur démarre, il utilise les fichiers et la configuration fournis par l'image. Chaque conteneur est capable de créer, modifier et supprimer des fichiers sans affecter les autres conteneurs. Lorsque le conteneur est supprimé, ces modifications de fichiers sont également supprimées.
Bien que cette nature éphémère des conteneurs soit excellente, elle pose un défi lorsque vous souhaitez conserver les données. Par exemple, si vous redémarrez un conteneur de base de données, vous ne voudrez peut-être pas commencer avec une base de données vide. Alors, comment conserver les fichiers ?
Volumes de conteneur
Les volumes sont un mécanisme de stockage qui permet de conserver les données au-delà du cycle de vie d'un conteneur individuel. Pensez-y comme à la création d'un raccourci ou d'un lien symbolique de l'intérieur du conteneur vers l'extérieur du conteneur.
Par exemple, imaginez que vous créez un volume nommé log-data
.
$ docker volume create log-data
En démarrant un conteneur avec la commande suivante, le volume sera monté (ou attaché) dans le conteneur à /logs
:
$ docker run -d -p 80:80 -v log-data:/logs docker/welcome-to-docker
Si le volume log-data
n'existe pas, Docker le créera automatiquement pour vous.
Lorsque le conteneur s'exécute, tous les fichiers qu'il écrit dans le dossier /logs
seront enregistrés dans ce volume, à l'extérieur du conteneur. Si vous supprimez le conteneur et en démarrez un nouveau en utilisant le même volume, les fichiers y seront toujours.
Partage de fichiers à l'aide de volumes
Vous pouvez attacher le même volume à plusieurs conteneurs pour partager des fichiers entre eux. Cela peut être utile dans des scénarios tels que l'agrégation de journaux, les pipelines de données ou d'autres applications événementielles.
Gestion des volumes
Les volumes ont leur propre cycle de vie au-delà de celui des conteneurs et peuvent devenir assez volumineux en fonction du type de données et des applications que vous utilisez. Les commandes suivantes seront utiles pour gérer les volumes :
docker volume ls
- lister tous les volumesdocker volume rm <nom-ou-id-du-volume>
- supprimer un volume (ne fonctionne que lorsque le volume n'est attaché à aucun conteneur)docker volume prune
- supprimer tous les volumes inutilisés (non attachés)
Essayez-le
Dans ce guide, vous vous entraînerez à créer et à utiliser des volumes pour conserver les données créées par un conteneur Postgres. Lorsque la base de données s'exécute, elle stocke les fichiers dans le répertoire /var/lib/postgresql/data
. En y attachant le volume, vous pourrez redémarrer le conteneur plusieurs fois tout en conservant les données.
Utiliser les volumes
-
Téléchargez et installez Docker Desktop.
-
Démarrez un conteneur à l'aide de l'image Postgres avec la commande suivante :
$ docker run --name=db -e POSTGRES_PASSWORD=secret -d -v postgres_data:/var/lib/postgresql/data postgres
Cela démarrera la base de données en arrière-plan, la configurera avec un mot de passe et attachera un volume au répertoire où PostgreSQL conservera les fichiers de la base de données.
-
Connectez-vous à la base de données à l'aide de la commande suivante :
$ docker exec -ti db psql -U postgres
-
Dans la ligne de commande PostgreSQL, exécutez ce qui suit pour créer une table de base de données et insérer deux enregistrements :
CREATE TABLE tasks ( id SERIAL PRIMARY KEY, description VARCHAR(100) ); INSERT INTO tasks (description) VALUES ('Finir le travail'), ('S''amuser');
-
Vérifiez que les données sont dans la base de données en exécutant ce qui suit dans la ligne de commande PostgreSQL :
SELECT * FROM tasks;
Vous devriez obtenir une sortie qui ressemble à ce qui suit :
id | description ----+------------- 1 | Finir le travail 2 | S'amuser (2 rows)
-
Quittez le shell PostgreSQL en exécutant la commande suivante :
\q
-
Arrêtez et supprimez le conteneur de base de données. N'oubliez pas que, même si le conteneur a été supprimé, les données sont conservées dans le volume
postgres_data
.$ docker stop db $ docker rm db
-
Démarrez un nouveau conteneur en exécutant la commande suivante, en attachant le même volume avec les données conservées :
$ docker run --name=new-db -d -v postgres_data:/var/lib/postgresql/data postgres
Vous avez peut-être remarqué que la variable d'environnement
POSTGRES_PASSWORD
a été omise. C'est parce que cette variable n'est utilisée que lors de l'amorçage d'une nouvelle base de données. -
Vérifiez que la base de données contient toujours les enregistrements en exécutant la commande suivante :
$ docker exec -ti new-db psql -U postgres -c "SELECT * FROM tasks"
Afficher le contenu du volume
Le tableau de bord de Docker Desktop offre la possibilité de visualiser le contenu de n'importe quel volume, ainsi que la possibilité d'exporter, d'importer et de cloner des volumes.
-
Ouvrez le tableau de bord de Docker Desktop et accédez à la vue Volumes. Dans cette vue, vous devriez voir le volume postgres_data.
-
Sélectionnez le nom du volume postgres_data.
-
L'onglet Données affiche le contenu du volume et offre la possibilité de naviguer dans les fichiers. Un double-clic sur un fichier vous permettra de voir le contenu et d'apporter des modifications.
-
Faites un clic droit sur n'importe quel fichier pour l'enregistrer ou le supprimer.
Supprimer des volumes
Avant de supprimer un volume, il ne doit être attaché à aucun conteneur. Si vous n'avez pas supprimé le conteneur précédent, faites-le avec la commande suivante (le -f
arrêtera d'abord le conteneur, puis le supprimera) :
$ docker rm -f new-db
Il existe plusieurs méthodes pour supprimer des volumes, notamment les suivantes :
-
Sélectionnez l'option Supprimer le volume sur un volume dans le tableau de bord de Docker Desktop.
-
Utilisez la commande
docker volume rm
:$ docker volume rm postgres_data
-
Utilisez la commande
docker volume prune
pour supprimer tous les volumes inutilisés :$ docker volume prune
Ressources supplémentaires
Les ressources suivantes vous aideront à en savoir plus sur les volumes :
Prochaines étapes
Maintenant que vous avez appris à conserver les données des conteneurs, il est temps d'apprendre à partager des fichiers locaux avec les conteneurs.