## Introduction

Perdre un environnement Docker local peut signifier des heures de reconstruction d'images, de saisie de secrets et de recréation de données de test. Les procédures de sauvegarde et de restauration de Docker Desktop vous aident à récupérer rapidement, surtout si vous utilisez des volumes persistants, des réseaux personnalisés ou des projets Compose. Ce guide couvre des techniques pratiques de sauvegarde et de restauration, des étapes de validation et la récupération en cas d'échec, en se concentrant sur Docker Desktop sous Windows, macOS et Linux.

Nous aborderons les composants essentiels : les données des conteneurs (volumes et montages de type bind), les images, les paramètres de Docker Desktop et les fichiers de configuration. Vous apprendrez à inspecter votre configuration actuelle, à créer des sauvegardes cohérentes, à les restaurer dans un nouvel environnement et à vérifier que vos applications fonctionnent toujours. Chaque section comprend des commandes réelles, les résultats attendus et des conseils de dépannage.

Cet article s'adresse aux développeurs, aux ingénieurs DevOps et à toute personne utilisant Docker Desktop pour le développement local ou la production à petite échelle. À la fin, vous disposerez d'un processus reproductible pour protéger votre travail et réduire les temps d'arrêt en cas de problème.

## Ce qu'il faut sauvegarder dans Docker Desktop

Avant d'exécuter toute commande de sauvegarde, identifiez ce qui doit être protégé. Docker Desktop stocke les données à plusieurs endroits, et chacun nécessite une approche différente.

### 1. Données des conteneurs : volumes et montages de type bind

La plupart des applications avec état stockent leurs données dans des volumes Docker ou des montages de type bind. Comprendre la différence est essentiel pour la sauvegarde.

- **Les volumes Docker** sont gérés par Docker et stockés dans un emplacement comme `/var/lib/docker/volumes/` (Linux) ou à l'intérieur de la machine virtuelle Docker Desktop (macOS/Windows). Vous pouvez les sauvegarder à l'aide d'un conteneur temporaire.
- **Les montages de type bind** mappent un répertoire hôte directement dans un conteneur. Ils sont simples à sauvegarder car les données se trouvent sur le système de fichiers hôte, mais ils peuvent causer des problèmes de permissions et de portabilité.

Pour voir quels volumes ou montages un conteneur en cours d'exécution utilise, inspectez-le :

```bash
docker inspect mon-conteneur --format '{{ json .Mounts }}'
```

Résultat attendu (exemple) :

```json
[{"Type":"volume","Name":"myapp_data","Source":"/var/lib/docker/volumes/myapp_data/_data","Destination":"/var/lib/app","RW":true}]
```

Si le type de montage est `bind`, la source est un chemin hôte comme `/home/utilisateur/projet/donnees`. Sauvegardez ce répertoire directement avec des outils de fichiers standard.

### 2. Images Docker

Les images peuvent être reconstruites à partir de Dockerfiles ou récupérées depuis des registres, mais les images construites sur mesure sans Dockerfile peuvent être perdues. Exportez les images importantes avec `docker save` et importez-les plus tard avec `docker load`. Nous verrons cela plus loin.

### 3. Paramètres et configuration de Docker Desktop

Docker Desktop stocke des paramètres tels que les limites de ressources, la configuration du proxy et les préférences Kubernetes. Ceux-ci ne sont pas inclus dans les sauvegardes de volumes. Sur macOS et Windows, les paramètres se trouvent dans des fichiers comme `~/Library/Group Containers/group.com.docker/settings.json` (macOS) et `%APPDATA%\Docker\settings.json` (Windows). Sur Linux, la configuration du moteur Docker se trouve dans `/etc/docker/daemon.json`. Sauvegardez ces fichiers si vous personnalisez votre environnement.

### 4. Fichiers Compose et variables d'environnement

Vos fichiers `docker-compose.yml` et `.env` définissent les services, les réseaux et les variables d'environnement. Ils sont souvent stockés dans le dépôt de votre projet, mais s'ils n'existent que localement, incluez-les dans votre plan de sauvegarde.

## Création de sauvegardes : commandes et exemples

### Sauvegarder un volume Docker

Utilisez un conteneur temporaire pour créer une archive tar du contenu du volume.

```bash
# Démarrer un conteneur temporaire qui monte le volume, pour utilisation avec --volumes-from
docker run -d --name source-sauvegarde -v myapp_data:/data alpine sleep infinity

# Créer une sauvegarde du volume 'myapp_data' en utilisant l'approche documentée --volumes-from
docker run --rm --volumes-from source-sauvegarde -v $(pwd):/backup alpine \
  tar czf /backup/myapp_data_backup.tar.gz -C /data .

# Supprimer le conteneur temporaire
docker rm -f source-sauvegarde
```

Cette commande :

- Démarre un conteneur Alpine temporaire nommé `source-sauvegarde` qui monte le volume `myapp_data` sur `/data` et dort.
- Exécute un second conteneur Alpine avec `--volumes-from source-sauvegarde` pour accéder au même volume.
- Monte le répertoire courant sur `/backup`.
- Crée un fichier tar compressé `myapp_data_backup.tar.gz` dans le répertoire courant.
- Supprime le conteneur temporaire `source-sauvegarde` après la sauvegarde.

Après exécution, vérifiez que le fichier de sauvegarde existe et n'est pas vide :

```bash
ls -lh myapp_data_backup.tar.gz
# Attendu : une taille de fichier supérieure à 0 octet
```

### Sauvegarder un montage de type bind

Pour un montage de type bind, copiez simplement le répertoire hôte :

```bash
# Exemple de source de montage bind : /home/utilisateur/projet/donnees
cp -a /home/utilisateur/projet/donnees /emplacement/sauvegarde/donnees_backup
```

Utilisez `rsync` pour des sauvegardes incrémentales :

```bash
rsync -av --delete /home/utilisateur/projet/donnees/ /emplacement/sauvegarde/donnees_backup/
```

### Sauvegarder plusieurs volumes avec un script

Créez un script pour sauvegarder tous les volumes utilisés par vos conteneurs. Cet exemple itère sur les volumes de `docker volume ls` :

```bash
#!/bin/bash
REP_SAUVEGARDE="$(pwd)/sauvegardes"
mkdir -p "$REP_SAUVEGARDE"
for volume in $(docker volume ls --format '{{.Name}}'); do
  echo "Sauvegarde du volume : $volume"
  conteneur="source-sauvegarde-${volume}"
  docker run -d --name "$conteneur" -v "$volume":/data alpine sleep infinity
  docker run --rm --volumes-from "$conteneur" -v "$REP_SAUVEGARDE":/backup alpine \
    tar czf "/backup/${volume}_backup.tar.gz" -C /data .
  docker rm -f "$conteneur"
done
```

Exécutez `chmod +x backup_volumes.sh` puis `./backup_volumes.sh`. Vérifiez les archives dans `sauvegardes/`.

### Sauvegarder les images

Pour exporter une ou plusieurs images :

```bash
docker save -o myapp_image.tar myapp:latest
```

Pour plusieurs images, listez-les après `-o` :

```bash
docker save -o toutes_images.tar image1:tag image2:tag
```

Le fichier tar résultant peut être copié sur une autre machine.

### Sauvegarder les fichiers de configuration

Copiez manuellement les fichiers de configuration importants vers votre répertoire de sauvegarde :

```bash
# Exemple macOS
cp ~/Library/Group\ Containers/group.com.docker/settings.json ./sauvegardes/docker-settings.json

# Exemple Linux
sudo cp /etc/docker/daemon.json ./sauvegardes/daemon.json
```

Si vous utilisez des contextes Docker, sauvegardez le répertoire des contextes :

```bash
cp -r ~/.docker/contexts ./sauvegardes/docker-contextes
```

## Restauration des sauvegardes

### Restaurer un volume Docker

Pour restaurer un volume à partir d'une archive tar :

```bash
# Assurez-vous que le volume existe (créez-le si nécessaire)
docker volume create myapp_data

# Restaurer les données
docker run --rm -v myapp_data:/data -v $(pwd):/backup alpine \
  tar xzf /backup/myapp_data_backup.tar.gz -C /data
```

Après la restauration, vérifiez en démarrant le conteneur et en consultant les journaux de l'application.

### Restaurer les images

```bash
docker load -i myapp_image.tar
```

Confirmez avec `docker images`.

### Restaurer les fichiers de configuration

Copiez les fichiers sauvegardés vers leurs emplacements d'origine. Pour les paramètres de Docker Desktop, assurez-vous que Docker Desktop est arrêté avant de restaurer pour éviter les écrasements :

```bash
# macOS
cp ./sauvegardes/docker-settings.json ~/Library/Group\ Containers/group.com.docker/settings.json
```

Redémarrez Docker Desktop ensuite.

### Restaurer un projet Compose

Si vous avez sauvegardé votre `docker-compose.yml`, restaurez-le et exécutez :

```bash
docker compose up -d
```

Vérifiez l'état avec `docker compose ps`.

## Vérification et diagnostic

Après la restauration, confirmez que tout fonctionne comme prévu.

### Contrôles de santé de base

Exécutez ces commandes pour inspecter l'environnement :

```bash
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# Attendu : liste des conteneurs en cours d'exécution avec statut Up

docker logs mon-conteneur --tail 50
# Attendu : journaux récents sans erreurs fatales

docker inspect mon-conteneur
# Vérifiez les montages, réseaux et variables d'environnement
```

Pour les projets Compose :

```bash
docker compose ps
# Assurez-vous que tous les services sont actifs

docker compose logs -f app
# Suivre les journaux du service 'app'
```

### Tester la persistance des données

Un simple test de redémarrage permet de détecter les volumes manquants :

```bash
docker stop mon-conteneur
docker start mon-conteneur
# Vérifiez ensuite que les données sont toujours accessibles
```

Si les données disparaissent, le conteneur écrivait probablement dans son système de fichiers éphémère au lieu d'un volume.

### Vérifier le contenu du volume

Montez le volume dans un conteneur temporaire et listez les fichiers :

```bash
docker run --rm -v myapp_data:/data alpine ls -la /data
```

Comparez avec les fichiers attendus.

## Modes de défaillance et récupération

Même avec des sauvegardes, la restauration peut échouer. Comprenez les problèmes courants et comment les résoudre.

### Erreurs de permission après restauration

**Symptôme :** Les journaux du conteneur affichent `Permission denied` lors de l'accès aux fichiers.

**Cause :** Les fichiers restaurés ont un mauvais propriétaire (par exemple, appartenant à root alors que l'application attend un utilisateur non root).

**Récupération :** Ajustez la propriété à l'intérieur du conteneur ou du volume. Par exemple :

```bash
docker run --rm -v myapp_data:/data alpine chown -R 1000:1000 /data
```

### Volume non monté

**Symptôme :** L'application démarre mais les données sont absentes.

**Cause :** Mauvais nom de volume ou volume manquant.

**Récupération :** Vérifiez `docker volume ls` et la configuration de montage du conteneur avec `docker inspect`. Recréez le volume si nécessaire.

### Restauration à partir d'une archive corrompue

**Symptôme :** L'extraction tar échoue ou produit des données incomplètes.

**Cause :** Fichier de sauvegarde corrompu (par exemple, transfert interrompu).

**Récupération :** Vérifiez toujours les archives de sauvegarde avec `tar tzf` avant de leur faire confiance. Relancez la sauvegarde si possible.

### Paramètres Docker Desktop perdus

**Symptôme :** Les limites de ressources ou les paramètres de proxy sont revenus à la valeur par défaut.

**Cause :** Restauration des paramètres non effectuée ou mise à jour de Docker Desktop qui a écrasé les paramètres.

**Récupération :** Réappliquez à partir de la sauvegarde ou reconfigurez manuellement. Envisagez d'utiliser `docker context` pour gérer les paramètres.

## Pièges courants et comment les éviter

### 1. Ignorer les montages de type bind dans le plan de sauvegarde

Les montages bind sont souvent oubliés car les données sont sur l'hôte, pas dans les volumes Docker. **Solution :** Documentez tous les chemins de montage bind à l'aide de `docker inspect` et incluez-les dans votre script de sauvegarde.

### 2. Sauvegarder une base de données en direct sans cohérence

Un tar d'un volume de base de données en cours d'exécution peut être incohérent. **Solution :** Arrêtez le conteneur avant la sauvegarde ou utilisez des outils spécifiques à la base de données comme `pg_dump` (PostgreSQL) ou `mysqldump` (MySQL). Vous pouvez aussi utiliser `docker exec` pour exécuter la commande de dump et sauvegarder le fichier résultant.

Exemple pour PostgreSQL :

```bash
docker exec mon-postgres pg_dump -U utilisateur mabase > db_backup.sql
```

### 3. Ne pas tester régulièrement les restaurations

Les sauvegardes peuvent être invalides. **Solution :** Planifiez un test de restauration mensuel dans un environnement temporaire. Automatisez si possible.

### 4. Compter sur la fonction d'exportation de Docker Desktop

L'exportation/importation via l'interface graphique de Docker Desktop peut être lente et ne pas inclure tous les volumes. **Solution :** Utilisez des méthodes en ligne de commande pour la précision et l'automatisation.

### 5. Stocker les sauvegardes sur le même disque

Si le disque tombe en panne, les sauvegardes sont également perdues. **Solution :** Copiez les sauvegardes vers un stockage externe ou le cloud.

## Liste de contrôle opérationnelle

Utilisez cette liste pour garantir un processus de sauvegarde et de restauration de haute qualité.

| Élément | Rôle responsable | Fréquence | Vérification |
|---------|------------------|-----------|--------------|
| Identifier tous les volumes et montages bind | Ingénieur DevOps | Mensuel | `docker inspect` sur tous les conteneurs |
| Mettre à jour le script de sauvegarde pour les nouveaux services | Développeur | À chaque changement de projet | Tester le script en staging |
| Exécuter la sauvegarde complète | Tâche planifiée (ou manuelle) | Quotidien | Vérifier les journaux de sauvegarde et les tailles de fichiers |
| Vérifier les archives de sauvegarde | Ingénieur DevOps | Hebdomadaire | `tar tzf` ou test de restauration |
| Tester la restauration dans un environnement propre | Ingénieur QA | Mensuel | Tests de fumée de l'application |
| Examiner les paramètres de Docker Desktop | Ingénieur DevOps | Trimestriel | Comparer les paramètres actuels à la sauvegarde |

Attribuez un responsable unique pour chaque ligne, pas un groupe. Par exemple, « Priya Shah, responsable de l'ingénierie » pour la revue de la politique de sauvegarde, à revoir trimestriellement.

## Conclusion

La sauvegarde et la restauration de Docker Desktop ne sont pas une tâche ponctuelle mais une pratique continue. En comprenant ce qu'il faut sauvegarder, en utilisant des commandes cohérentes et en testant régulièrement les restaurations, vous pouvez éviter les pertes de données et minimiser les temps d'arrêt. Commencez dès aujourd'hui avec une simple sauvegarde de volume, puis étendez pour inclure les images, les configurations et l'automatisation. Rappelez-vous : une sauvegarde n'est aussi bonne que son dernier test de restauration réussi.

Comme prochaine étape, implémentez le script de sauvegarde de volume pour un conteneur critique, vérifiez l'archive et planifiez un test de restauration dans la semaine à venir.