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.