Persister la BD
Au cas où vous ne l'auriez pas remarqué, votre liste de tâches est vide à chaque fois que vous lancez le conteneur. Pourquoi cela ? Dans cette partie, vous plongerez dans le fonctionnement du conteneur.
Le système de fichiers du conteneur
Quand un conteneur s'exécute, il utilise les diverses couches d'une image pour son système de fichiers. Chaque conteneur obtient aussi son propre "espace de travail" pour créer/mettre à jour/supprimer des fichiers. Tous les changements ne seront pas vus dans un autre conteneur, même s'ils utilisent la même image.
Voir cela en pratique
Pour voir cela en action, vous allez démarrer deux conteneurs. Dans un conteneur, vous créerez un fichier. Dans l'autre conteneur, vous vérifierez si ce même fichier existe.
-
Démarrez un conteneur Alpine et créez un nouveau fichier dedans.
$ docker run --rm alpine touch greeting.txt
TipToutes les commandes que vous spécifiez après le nom de l'image (dans ce cas,
alpine
) sont exécutées à l'intérieur du conteneur. Dans ce cas, la commandetouch greeting.txt
place un fichier nommégreeting.txt
sur le système de fichiers du conteneur. -
Exécutez un nouveau conteneur Alpine et utilisez la commande
stat
pour vérifier si le fichier existe.$ docker run --rm alpine stat greeting.txt
Vous devriez voir une sortie similaire à la suivante qui indique que le fichier n'existe pas dans le nouveau conteneur.
stat: can't stat 'greeting.txt': No such file or directory
Le fichier greeting.txt
créé par le premier conteneur n'existait pas dans le second conteneur. C'est parce que la "couche supérieure" inscriptible de chaque conteneur est isolée. Même si les deux conteneurs partageaient les mêmes couches sous-jacentes qui composent l'image de base, la couche inscriptible est unique à chaque conteneur.
Volumes de conteneur
Avec l'expérience précédente, vous avez vu que chaque conteneur démarre à partir de la définition d'image à chaque fois qu'il démarre. Bien que les conteneurs puissent créer, mettre à jour et supprimer des fichiers, ces changements sont perdus quand vous supprimez le conteneur et Docker isole tous les changements à ce conteneur. Avec les volumes, vous pouvez changer tout cela.
Les Volumes fournissent la capacité de connecter des chemins spécifiques du système de fichiers du conteneur de retour à la machine hôte. Si vous montez un répertoire dans le conteneur, les changements dans ce répertoire sont aussi vus sur la machine hôte. Si vous montez ce même répertoire à travers les redémarrages de conteneur, vous verriez les mêmes fichiers.
Il y a deux types principaux de volumes. Vous utiliserez finalement les deux, mais vous commencerez avec les montages de volume.
Persister les données de tâches
Par défaut, l'application de tâches stocke ses données dans une base de données SQLite à /etc/todos/todo.db
dans le système de fichiers du conteneur. Si vous n'êtes pas familier avec SQLite, ne vous inquiétez pas ! C'est simplement une base de données relationnelle qui stocke toutes les données dans un seul fichier. Bien que ce ne soit pas le meilleur pour les applications à grande échelle, cela fonctionne pour les petites démos. Vous apprendrez comment basculer vers un moteur de base de données différent plus tard.
Avec la base de données étant un seul fichier, si vous pouvez persister ce fichier sur l'hôte et le rendre disponible au conteneur suivant, il devrait pouvoir reprendre là où le dernier s'est arrêté. En créant un volume et en l'attachant (souvent appelé "montage") au répertoire où vous avez stocké les données, vous pouvez persister les données. Comme votre conteneur écrit dans le fichier todo.db
, il persistera les données vers l'hôte dans le volume.
Comme mentionné, vous allez utiliser un montage de volume. Pensez à un montage de volume comme un seau opaque de données. Docker gère complètement le volume, y compris l'emplacement de stockage sur le disque. Vous devez seulement vous rappeler le nom du volume.
Créer un volume et démarrer le conteneur
Vous pouvez créer le volume et démarrer le conteneur en utilisant la CLI ou l'interface graphique de Docker Desktop.
-
Créez un volume en utilisant la commande
docker volume create
.$ docker volume create todo-db
-
Arrêtez et supprimez le conteneur d'application de tâches encore une fois avec
docker rm -f <id>
, car il est encore en cours d'exécution sans utiliser le volume persistant. -
Démarrez le conteneur d'application de tâches, mais ajoutez l'option
--mount
pour spécifier un montage de volume. Donnez un nom au volume, et montez-le vers/etc/todos
dans le conteneur, ce qui capture tous les fichiers créés au chemin.$ docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started
NoteSi vous utilisez Git Bash, vous devez utiliser une syntaxe différente pour cette commande.
$ docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=//etc/todos getting-started
Pour plus de détails sur les différences de syntaxe de Git Bash, voir Travailler avec Git Bash.
Pour créer un volume :
- Sélectionnez Volumes dans Docker Desktop.
- Dans Volumes, sélectionnez Créer.
- Spécifiez
todo-db
comme nom de volume, puis sélectionnez Créer.
Pour arrêter et supprimer le conteneur d'application :
- Sélectionnez Conteneurs dans Docker Desktop.
- Sélectionnez Supprimer dans la colonne Actions pour le conteneur.
Pour démarrer le conteneur d'application de tâches avec le volume monté :
-
Sélectionnez la boîte de recherche en haut de Docker Desktop.
-
Dans la fenêtre de recherche, sélectionnez l'onglet Images.
-
Dans la boîte de recherche, spécifiez le nom de l'image,
getting-started
.TipUtilisez le filtre de recherche pour filtrer les images et montrer seulement les Images locales.
-
Sélectionnez votre image puis sélectionnez Exécuter.
-
Sélectionnez Paramètres optionnels.
-
Dans Port hôte, spécifiez le port, par exemple,
3000
. -
Dans Chemin hôte, spécifiez le nom du volume,
todo-db
. -
Dans Chemin conteneur, spécifiez
/etc/todos
. -
Sélectionnez Exécuter.
Vérifier que les données persistent
-
Une fois que le conteneur démarre, ouvrez l'application et ajoutez quelques éléments à votre liste de tâches.
-
Arrêtez et supprimez le conteneur pour l'application de tâches. Utilisez Docker Desktop ou
docker ps
pour obtenir l'ID puisdocker rm -f <id>
pour le supprimer. -
Démarrez un nouveau conteneur en utilisant les étapes précédentes.
-
Ouvrez l'application. Vous devriez voir vos éléments encore dans votre liste.
-
Allez-y et supprimez le conteneur quand vous avez fini de vérifier votre liste.
Vous avez maintenant appris comment persister les données.
Plonger dans le volume
Beaucoup de personnes demandent fréquemment "Où Docker stocke-t-il mes données quand j'utilise un volume ?" Si vous voulez savoir, vous pouvez utiliser la commande docker volume inspect
.
$ docker volume inspect todo-db
Vous devriez voir une sortie comme la suivante :
[
{
"CreatedAt": "2019-09-26T02:18:36Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
"Name": "todo-db",
"Options": {},
"Scope": "local"
}
]
Le Mountpoint
est l'emplacement réel des données sur le disque. Notez que sur la plupart des machines, vous devrez avoir un accès root pour accéder à ce répertoire depuis l'hôte.
Résumé
Dans cette section, vous avez appris comment persister les données de conteneur.
Informations connexes :
Étapes suivantes
Ensuite, vous apprendrez comment vous pouvez développer votre application plus efficacement en utilisant les montages de liaison.