Par défaut, les conteneurs Docker sont entièrement sans état. Les données stockées sur le conteneur sont éphémères et seront effacées lorsque le conteneur s'arrêtera. Ce n'est évidemment pas idéal pour de nombreuses applications, c'est pourquoi Docker propose quelques moyens de gérer l'état.
Que sont les volumes?
Le moyen le plus simple de rendre les données Docker persistantes est lier les montures, qui lie littéralement un emplacement sur le disque de l'hôte à un emplacement sur le disque du conteneur. Ceux-ci sont simples à créer et à utiliser, mais sont un peu capricieux car vous devez configurer les répertoires et les gérer vous-même.
Les volumes sont comme des disques durs virtuels gérés par Docker. Docker gère leur stockage sur disque (généralement dans / var / lib / docker / volumes /
), et leur donne un nom unique facilement mémorable plutôt qu'un chemin de répertoire. Il est facile de les créer et de les supprimer à l’aide de la CLI Docker.
Ceux-ci présentent quelques autres avantages en plus d'être gérés par Docker. Ils fonctionnent à la fois sur des conteneurs Linux et Windows, ils peuvent être partagés de manière plus sûre entre plusieurs conteneurs et les pilotes de volume permettent aux fournisseurs de cloud de fournir un hébergement à distance pour les données sous-jacentes. Dans l'ensemble, les volumes sont plus faciles à utiliser que les montages de liaison et sont recommandés par Docker pour la gestion de l'état.
Bien sûr, vous devez vous demander si vous avez vraiment besoin que les données Docker soient stockées sur le serveur. Pour de nombreuses applications, l'utilisation d'un magasin de données distant externe comme Amazon S3 ou d'une base de données externe suffit pour stocker les données qu'elles utilisent sans les attacher sur le serveur frontal.
Comment les utilisez-vous?
Vous pouvez créer un nouveau volume à partir de la ligne de commande avec la commande suivante:
volume docker créer nginx-config
Et puis, lorsque vous allez exécuter votre conteneur Docker, liez-le à la cible dans le conteneur avec le --monter
drapeau:
docker exécuter -d --name devtest --mount source = nginx-config, cible = / etc / nginx nginx: dernier
Si vous courez docker inspecter
, vous verrez le volume répertorié sous Montures
section.
Si vous utilisez Docker Compose, la configuration est également simple. Ajoutez simplement un volumes
pour chaque service de conteneur dont vous disposez, puis mappez un nom de volume à un emplacement dans l'invité. Vous devrez également fournir une liste de volumes dans un niveau supérieur volumes
clé pour Compose à provisionner.
version: "3.0" prestations de service: la toile: image: nginx: dernier ports: - "80:80" volumes: - nginx-config:/etc/nginx/ volumes: nginx-config:
Cela créera automatiquement le volume pour ce Compose. Si vous souhaitez utiliser un volume prédéfini en dehors de Compose, spécifiez externe: vrai
dans la configuration du volume:
volumes: contenu cms: externe: vrai
Si vous souhaitez simplement effectuer un montage de liaison et ne pas vous soucier des volumes, entrez simplement un nom de chemin à la place du nom de volume et ne définissez pas les noms de volume.
version: "3.0" prestations de service: la toile: image: nginx: dernier ports: - "80:80" volumes: - / docker / nginx-config /: / etc / nginx /
Tu peux lire Documentation complète de Docker sur l’utilisation des volumes avec Compose si votre cas d'utilisation nécessite quelque chose de plus spécifique que cela.
Transfert de volumes Docker
Les volumes Docker ne sont que des dossiers créés automatiquement et stockés dans / var / lib / docker / volumes /
, chaque volume étant stocké sous ./volumename/_data/
. Pour sauvegarder et restaurer, vous pouvez simplement sauvegarder ces volumes directement.
Si vous souhaitez à la place utiliser la CLI Docker, ils ne fournissent malheureusement pas un moyen facile de le faire. Pour sauvegarder les volumes d'un conteneur, vous aurez besoin du nom du conteneur, ainsi que de l'emplacement de montage dans lequel les données sont stockées.
La façon de procéder est un peu un hack: vous devrez exécuter une commande dans un nouveau conteneur Docker, lier monter le répertoire shell actuel, monter le volume sur ce conteneur, puis le goudron
le répertoire dans une sauvegarde. Vous vous retrouverez avec un backup.tar
du volume:
docker run --rm --volumes-from containername -v $ (pwd): / backup ubuntu tar cvf /backup/backup.tar / mountlocation
Ensuite, de la même manière, vous pouvez extraire l'archive dans le répertoire cible:
docker run --rm --volumes-from containername -v $ (pwd): / backup ubuntu bash -c "cd / mountlocation && tar xvf /backup/backup.tar --strip 1"
C'est toujours mieux que d'avoir à connaître l'emplacement de l'hôte, vous pouvez donc automatiser cela si vous le souhaitez.