Sauvegarde et restauration efficaces de /var/lib/docker avec zstd
Sauvegarde et restauration de /var/lib/docker avec Zstd (Zstandard)
L’arborescence /var/lib/docker contient un mélange de données critiques (volumes, métadonnées) et de données dérivées (couches d’images, caches, logs). Sauvegarder l’ensemble sans distinction produit des archives volumineuses, lentes à restaurer et redondantes.
L’objectif est de capturer uniquement ce qui est nécessaire pour reconstruire un environnement Docker fonctionnel, puis de compresser ce sous-ensemble avec un algorithme adapté à sa structure.
1. Ce que contient /var/lib/docker
On y trouve :
- les couches d’images et de conteneurs (
overlay2,image/) - les volumes persistants (
volumes/) - les métadonnées (conteneurs, réseaux, plugins)
- des journaux et des caches internes
Une grande partie de ces données est soit recomputable, soit déjà compressée (layers, blobs), ce qui les rend peu intéressantes à sauvegarder.
2. Parties excluables sans perte fonctionnelle
Les répertoires suivants sont intégralement régénérés par Docker à partir des métadonnées et des images :
/var/lib/docker/overlay2
/var/lib/docker/image
/var/lib/docker/containers/*/*.log
/var/lib/docker/tmp
/var/lib/docker/buildkit
À l’inverse, ce qui doit impérativement être conservé est :
volumes/(données applicatives)- les métadonnées des conteneurs et réseaux
- les plugins
C’est ce sous-ensemble qui permet à Docker de réattacher les volumes, recréer les conteneurs et reconstituer l’état logique du système.
3. Pourquoi zstd
Les données restantes sont dominées par :
- de nombreux petits fichiers
- du JSON et des métadonnées textuelles
- des structures déjà partiellement compressées
Dans ce contexte, Zstandard offre le meilleur compromis débit / taux de compression. En pratique, le profil suivant est efficace :
zstd -9 --long=19 -T0
Il maximise la compression tout en restant beaucoup plus rapide que xz sur de gros volumes de petits fichiers.
4. Commande de sauvegarde
tar \
--exclude=/var/lib/docker/overlay2 \
--exclude=/var/lib/docker/image \
--exclude=/var/lib/docker/containers/*/*.log \
--exclude=/var/lib/docker/tmp \
--exclude=/var/lib/docker/buildkit \
-c /var/lib/docker \
| zstd -9 --long=19 -T0 > $HOME/docker-core.zst
5. Ordre de grandeur des gains
| Méthode | Taille |
|---|---|
| tar brut | 100 % |
| tar.gz | 45–55 % |
| tar.zstd | 30–40 % |
| tar.zstd + exclusions | 5–15 % |
Un répertoire Docker de 50 Go produit typiquement une archive de 2 à 6 Go.
6. Restauration
Sur le système cible :
systemctl stop docker.service
zstd -d "$HOME/docker-core.zst" -c | tar -x -C /var/lib/docker
systemctl start docker.service
Docker reconstruit alors automatiquement :
- les couches
overlay2 - les images
- les caches internes
Les volumes, conteneurs et réseaux sont relus à partir des métadonnées restaurées.
7. Synthèse
L’exclusion systématique des données dérivées combinée à une compression Zstandard réduit la taille d’un backup Docker. On obtient une archive plus petite, plus rapide à produire et plus rapide à restaurer, tout en conservant une reconstruction de l’environnement.