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 à la fermeture du conteneur. Ce n'est évidemment pas idéal pour de nombreuses applications, donc Docker fournit quelques façons de gérer l'état.
Que sont les volumes ?
Le moyen le plus simple de rendre les données Docker persistantes consiste à lier les montages , qui lient 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 compliqués 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émorisable plutôt qu'un chemin de répertoire. Il est facile de les créer et de les supprimer à l'aide de Docker CLI.
Ceux-ci ont 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 liés et sont recommandés par Docker pour la gestion de l'état.
Bien sûr, vous devez déterminer 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 immobiliser 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 :
docker volume create nginx-config
Et puis, lorsque vous allez exécuter votre conteneur Docker, liez-le à la cible dans le conteneur avec le --mount
drapeau :
docker run -d --name devtest --mount source=nginx-config,target=/etc/nginx nginx:latest
Si vous exécutez docker inspect <name>
, vous verrez le volume répertorié sous Mounts
rubrique.
Si vous utilisez Docker Compose, la configuration est également simple. Ajoutez simplement un volumes
entrée 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 volumes
de niveau supérieur. clé pour Compose à provisionner.
version: "3.0" services: web: image: nginx:latest 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 external: true
dans la configuration des volumes :
volumes: cms-content: external: true
Si vous préférez simplement effectuer un montage lié et ne pas vous soucier des volumes, entrez simplement un nom de chemin à la place du nom de volume et renoncez à définir les noms de volume.
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - /docker/nginx-config/:/etc/nginx/
Vous pouvez lire la 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.
Transférer des 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 plutôt 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 le faire est un peu un hack - vous devrez exécuter une commande dans un nouveau conteneur Docker, lier le montage du répertoire shell actuel, monter le volume sur ce conteneur, puis tar
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.