Bienvenue > Blog sur la sauvegarde et la restauration > Comment sauvegarder les conteneurs Docker ? Méthodes de sauvegarde des conteneurs Docker.

Comment sauvegarder les conteneurs Docker ? Méthodes de sauvegarde des conteneurs Docker.

Mis à jour 5th janvier 2024, Rob Morrison

Bien que Docker – et tous les conteneurs – soient généralement un peu plus récents dans un environnement informatique de production que la plupart des autres technologies, il est toujours nécessaire de sauvegarder ces conteneurs, leurs applications et leurs données persistantes. Si un système informatique de production produit des données persistantes, ces données ont probablement une certaine valeur. Elles peuvent même être d’une importance critique. Par conséquent, il est probablement nécessaire de sauvegarder ces données en cas de catastrophe, par exemple à la suite d’une violation de données ou d’une erreur humaine.

Ce sujet couvre à la fois la capacité de Docker à créer des sauvegardes par lui-même, ainsi que la capacité de diverses solutions tierces à créer des sauvegardes Docker complètes, telles que Bacula Enterprise.

Sauvegarde et restauration de conteneurs Docker

Cela commence généralement par la validation du conteneur en question en tant qu’image, à l’aide de la commande suivante :


# docker commit -p [container-id] backup01
sha256:89682d4xxxxxx

Cette image peut être sauvegardée sous la forme d’un fichier .tar à l’aide d’une autre commande :


# docker save -o backup01.tar backup01
# ls -al | grep back
-rw——- 1 root root 178697728 Mar 31 23:35 backup01.tar

Le fichier .tar peut également être enregistré sur le point de montage NFS. Une alternative consiste à pousser l’image en question (backup01) directement dans votre registre local. Pour ce faire, nous devons d’abord étiqueter l’image de manière appropriée :


# docker tag backup01 localhost:5000/backup-image:v1

Dans ce cas, localhost est le nom de l’emplacement et 5000 est le numéro de port. Ces deux éléments peuvent être modifiés si nécessaire. Il est également important de se rappeler que le nom de la balise et le référentiel doivent être en minuscules pour que la balise soit appliquée correctement. Le processus est terminé avec le lancement de la commande push :


# docker push backup-image:v1

Comme nous avons discuté de deux méthodes de sauvegarde, il y aura également deux méthodes de restauration. Pour restaurer l’image de sauvegarde à partir d’un fichier .tar, vous devez lancer la commande suivante :


# docker load -i /tmp/backup01.tar

La ligne de commande doit afficher les lignes d’état suivantes si la commande a été saisie correctement :


ff91b8b5abb1: Loading layer [======================>] 2.56 kB/2.56 kB
Loaded image: backup01:latest

Une autre commande appelée docker run peut être utilisée pour créer un conteneur à partir de cette image.

Une image poussée peut être tirée directement avec une commande relativement simple :


# docker pull localhost:5000/backup-image:v1

Comme dans l’exemple précédent, le nom localhost et le numéro de port peuvent être modifiés si nécessaire.

Sauvegarde et restauration de volumes Docker

Un autre type de sauvegardes Docker se fait via des volumes – des fournisseurs de stockage persistant pour les conteneurs Docker. Ces volumes doivent être sauvegardés pour assurer la continuité des données.

Lorsqu’il s’agit de gérer des données persistantes à l’intérieur des conteneurs Docker en cours d’exécution, les volumes Docker sont la manière la plus recommandée de gérer tout cela. Ce type d’approche offre plusieurs avantages. Par exemple, les données stockées dans le conteneur Docker via les volumes sont effectivement isolées du reste du système de fichiers, ce qui les rend d’autant plus difficiles à affecter par des cyberattaques à l’échelle du système. Cependant, ce type d’isolation rend également plus difficile la création de volumes de sauvegarde Docker.

En outre, les volumes éliminent le besoin de se préoccuper de l’interface graphique et de l’UID entre le système de conteneurs Docker et le système d’exploitation. Les volumes eux-mêmes sont portables lorsqu’il s’agit de différentes installations Docker, ce qui signifie qu’il n’est pas nécessaire de se préoccuper du système d’exploitation de l’hôte. En même temps, cette approche portable permet de gérer les volumes Docker avec divers outils externes – tels que le stockage basé sur des seaux, nfs, etc.

Puisque les volumes Docker sont presque nécessaires pour créer de manière réaliste différents conteneurs Docker avec des données persistantes, il est tout à fait naturel de s’assurer que vous avez également des volumes de sauvegarde Docker – ce type de données est au moins aussi important que n’importe quelle autre donnée à l’intérieur de votre système, si ce n’est plus important.

Bien sûr, l’utilisation des volumes Docker pour stocker les données des conteneurs n’est pas forcément pratique et il y a quelques difficultés à surmonter ici et là. Par exemple, vous devrez apprendre plusieurs commandes différentes pour faire quelque chose d’aussi simple que de copier des informations hors du conteneur. Vous devrez également connaître plusieurs commandes pour être en mesure de saisir un shell sur un Docker en cours d’exécution afin de voir l’état actuel.

L’intégralité des données du volume Docker peut être plus difficile à rendre visible dans votre système de fichiers centralisé, car il fonctionne d’une manière légèrement différente des emplacements de stockage traditionnels – et vous devrez créer des volumes de sauvegarde Docker pour la même raison que vous créez habituellement des sauvegardes de vos données régulières.

Habituellement, les volumes Docker sont gérés par le démon Docker, mais nous n’interagirons pas du tout avec lui. L’idée d’un volume de sauvegarde Docker est d’obtenir une copie du volume sous forme de fichier compressé dans l’un des répertoires locaux. Cette copie est la sauvegarde que nous recherchons.

Dans cet exemple, notre conteneur en question s’appelle dckr-site avec le volume appelé dckr-volume, il est monté dans /var/lib/dckr/content/ et stocke toutes les données à cet endroit.

La première étape consiste à arrêter le conteneur à l’aide de la commande suivante :


$ docker stop dckr-site

La suivante porte sur le montage du conteneur et la sauvegarde du contenu du volume :


$ mkdir ~/backup
$ docker run –rm –volumes-from dckr-site -v ~/backup:/backup ubuntu bash -c “cd /var/lib/dckr/content && tar cvf /backup/dckr-site.tar .”

Dans ce scénario :

  • docker run la commande est utilisée pour créer un nouveau conteneur,
  • -rm la commande indique au système de retirer le conteneur une fois l’opération terminée;
  • -volumes-from dckr-site monte les volumes du conteneur sur notre nouveau conteneur temporaire;
  • bash -c « cd /var/lib/dckr/content && tar cvf /backup/dckr-site.tar » crée une sauvegarde à partir de tout le contenu du répertoire /backup/

Le processus de récupération de ces sauvegardes n’est pas très compliqué. Il commence par la création d’un nouveau volume à l’aide de la commande suivante :


$ docker volume create dckr-volume-2

Vous pouvez ensuite utiliser la commande suivante pour restaurer le volume à partir d’un conteneur temporaire dans un fichier .tar :


$ docker run –rm -v dckr-volume-2:/recover -v ~/backup:/backup ubuntu bash -c “cd /recover && tar xvf /backup/dckr-site.tar”

Bien entendu, vous devrez monter ce nouveau volume dans le nouveau conteneur pour qu’il fonctionne correctement :


$ docker run -d -v dckr-volume-2:/var/lib/dckr/content -p 80:2368 dckr:latest

Si la procédure est effectuée correctement, l’état complet de l’application devrait être restauré. Il est important de mentionner que cette méthode ne doit pas être utilisée comme source unique de sauvegarde, car les données de sauvegarde sont toujours stockées sur l’hôte et seraient donc perdues en cas de perte de données ou de désastre affectant également l’hôte.

Approche alternative pour la sauvegarde & restauration des volumes Docker

Il est naturel pour tous les systèmes modernes d’évoluer et de changer au fil du temps, et Docker ne fait pas exception, surtout avec une communauté aussi massive d’utilisateurs et de développeurs. À titre d’exemple, il existe une approche alternative de la sauvegarde des volumes Docker que certains utilisateurs pourraient préférer à la première option pour une raison ou une autre.

La première étape consiste à définir le nom du volume. La commande en question diffère pour les utilisateurs de Windows (PowerShell) et de Linux/macOS, les premiers ont besoin de la commande $VOLUME= »name_volume », tandis que les seconds s’appuient sur la commande VOLUME= »name_volume ».

Une fois cette étape franchie, la première option consiste à exécuter une commande de sauvegarde :


docker run –rm \
-v « ${VOLUME}:/data » \
-v « ${PWD}:/backup-dir » \
ubuntu \
tar cvzf /backup-dir/backup.tar.gz /data

La partie /data représente la destination cible et peut être modifiée si nécessaire.

La commande Restore serait bien sûr différente, et l’exemple ci-dessous le montre bien :


docker run –rm \
-v « ${VOLUME}:/data » \
-v « ${PWD}:/backup-dir » \
ubuntu \
bash -c « rm -rf /data/{*,.*}; cd /data && tar xvzf /backup-dir/backup.tar.gz –strip 1 »

Il convient de noter que la partie rm -rf /data/{*,.*} existe pour supprimer tous les fichiers existants avant la restauration de la sauvegarde, mais la nature de Docker signifie qu’il comprend deux commandes différentes – l’une pour supprimer tous les fichiers et dossiers qui commencent par un point, et l’autre pour les fichiers qui ne commencent pas par un point. Cependant, il existe deux « fichiers » invisibles dans chaque conteneur, appelés « . » et « … », qui ne sont pas techniquement des fichiers, ce qui explique pourquoi ils ne peuvent pas être supprimés.

C’est pourquoi les deux premiers messages de sortie après l’exécution de la commande de restauration concernent l’impossibilité de supprimer ces fichiers – c’est normal et cela n’affecte en rien le reste du processus.

Il existe quelques différences essentielles entre cette méthode et celles que nous avons proposées précédemment :

  • Les trois arguments tar (c, v et f, comme dans cvf) sont désormais inclus en tant que cvzf – de sorte que le fichier de sauvegarde soit automatiquement compressé après sa création.
  • Les chemins cibles des volumes de sauvegarde sont spécifiés dans chaque commande de sauvegarde, ce qui permet de les localiser plus facilement par la suite. Il s’agit d’une approche différente de l’utilisation de la commande –volumes-from, puisque cette dernière n’affiche pas les noms des volumes ou leurs chemins cibles à l’utilisateur en question.
  • Le processus de restauration inclut la commande de suppression de toutes les données de volume existantes avant d’effectuer une opération de restauration afin de garantir un processus de restauration correct. En outre, il y a une raison pour que le point-virgule soit utilisé entre les commandes tar xvzf et rm, car l’utilisation de && (similaire à la façon dont notre première méthode fonctionne) signifie que la chaîne de commande entière s’arrête complètement après avoir fait face au premier échec de la commande.

Bien entendu, cette commande particulière ne convient que comme exemple manuel pour les sauvegardes de volumes Docker, car chaque exécution de commande produit une sauvegarde full – ce qui serait très inefficace en termes de temps et d’espace de stockage si cette commande devait être automatisée et exécutée régulièrement (et même la compression ne peut pas résoudre ce problème).

Bonnes pratiques de gestion des volumes Docker

Travailler avec les volumes Docker peut être un véritable défi – c’est un outil très utile, mais il a ses propres nuances auxquelles la plupart des utilisateurs doivent s’habituer tôt ou tard. Pour rendre ce processus un peu plus facile, nous pouvons passer en revue quelques conseils et meilleures pratiques pour la gestion des volumes Docker :

  • Mettre en œuvre des méthodes cohérentes pour attacher et détacher des volumes à des conteneurs.
  • Employer des conventions de dénomination cohérentes et significatives pour faciliter l’identification et la gestion des volumes.
  • Évitez de créer des volumes inutiles, car chaque volume consomme des ressources.
  • Vérifiez régulièrement les volumes pour identifier et résoudre les problèmes de stockage de données excessif ou de capacité.
  • Évitez l’accès simultané en écriture au même lecteur par plusieurs conteneurs afin de prévenir la corruption des données.
  • Mettre en œuvre des mesures de sécurité appropriées pour protéger les données sensibles stockées dans les volumes.
  • Assignez des noms clairs et descriptifs aux volumes pour une meilleure organisation et gestion.

Scripts personnalisés et images Docker

Étant donné que Docker dispose d’une communauté assez importante de personnes hautement qualifiées, il ne devrait pas être si surprenant d’apprendre qu’il existe de nombreux scripts et images personnalisés à des fins de sauvegarde Docker.

Une image Docker de Offen en est un bon exemple. Il s’agit d’un conteneur compagnon léger qui peut effectuer des sauvegardes de volume Docker individuelles ou régulières vers un répertoire cible spécifique – répertoire local, Azure Blob, S3, Dropbox, WebDAV, etc. Il a également la capacité d’éliminer les anciennes sauvegardes par rotation, il peut chiffrer les sauvegardes avec GPG, et les tâches de sauvegarde qui échouent fournissent des notifications à l’utilisateur.

Le processus de configuration initiale est assez simple (toutes les informations peuvent être trouvées en utilisant le lien ci-dessus), et la ligne de commande d’exemple pour une opération de sauvegarde unique devrait ressembler à ceci :


docker run –rm -v data:/backup/data 
  –env AWS_ACCESS_KEY_ID= »<key_id> » \
  –env AWS_SECRET_ACCESS_KEY= »<access_key> » \
  –env AWS_S3_BUCKET_NAME= »<bucket_name> » \
  –entrypoint backup \
  offen/docker-volume-backup:v2

Bien entendu, il ne s’agit là que d’un exemple, mais il existe de nombreuses autres options disponibles sur le marché pour les utilisateurs qui sont prêts à consacrer le temps et les efforts nécessaires pour apprendre à les utiliser.

Volumes Backup & Share

Les utilisateurs qui sont moins familiers avec la logique d’une interface de ligne de commande utilisée pour effectuer toutes les tâches susmentionnées peuvent chercher un moyen plus facile de travailler avec les conteneurs Docker dans leur ensemble. Heureusement, il existe une solution à ce problème : l’application officielle Docker Desktop qui offre une interface graphique directe pour la gestion des applications, la gestion des conteneurs et bien plus encore.

Cette même application dispose également d’un marché d’extensions, qui propose de nombreuses extensions différentes permettant d’étendre ou de modifier les fonctionnalités de la solution. Les extensions peuvent être officielles ou générées par les utilisateurs, mais celle qui nous intéresse est fournie par Docker.

Volumes Backup & Share est l’extension officielle de gestion des volumes de Docker pour Docker Desktop, offrant un moyen transparent de travailler avec des volumes, y compris leurs opérations de sauvegarde et de restauration, ainsi que le clonage, le partage, et plus encore.

La solution en question propose quatre types de sauvegarde différents :

  • Une nouvelle image.
  • Une sauvegarde de fichier (un tarball compressé avec gzip, similaire à celui dont nous avons parlé précédemment).
  • Un registre d’images.
  • Une image existante.

D’autres fonctionnalités incluent la possibilité d’importer ou de restaurer des volumes, la possibilité de transférer des volumes d’un hôte à un autre, et tout cela peut être fait sans aucune commande CLI impliquée – une excellente option pour un public cible spécifique.

SnapShooter de Digital Ocean

En nous concentrant sur les options de sauvegarde tierces pour Docker, nous pouvons commencer par SnapShooter. SnapShooter est une solution de sauvegarde relativement jeune qui ciblait spécifiquement les offres de DigitalOcean. Elle s’est étendue à d’autres fournisseurs quelques années plus tard, et a été rachetée par DigitalOcean au début de l’année 2023.

Comme son nom l’indique, SnapShooter offre principalement la possibilité d’effectuer des instantanés – même si elle a été étendue pour inclure également des sauvegardes de fichiers, des sauvegardes de bases de données, des sauvegardes d’applications, etc. En ce qui concerne ses capacités Docker, SnapShooter peut prendre en charge la sauvegarde des volumes Docker, ainsi que la couverture de la sauvegarde des bases de données pour MongoDB, MySQL et Postgres qui fonctionnent dans Docker.

SnapShooter peut également offrir une interface plutôt conviviale qui aide ses utilisateurs à effectuer une variété de tâches différentes. Cela inclut la création de sauvegardes et les processus de restauration de données pour les volumes Docker.

Duplicati

Une autre option de sauvegarde tierce pour les volumes Docker qui est quelque peu différente est Duplicati. Duplicati est une solution de sauvegarde gratuite plutôt bien connue avec une structure open-source, elle offre la possibilité de créer des sauvegardes de données et de les déplacer vers une variété d’emplacements cibles de stockage, qu’il s’agisse de serveurs distants, de NAS ou de services en nuage.

Duplicati étant une solution gratuite et open-source, il est un peu plus difficile de l’utiliser pour un utilisateur moyen. Cependant, il peut toujours être utilisé pour configurer des sauvegardes régulières de volumes Docker à l’aide d’une séquence spécifique de commandes. Il convient de noter que cet exemple utilise un conteneur Docker spécifique – linuxserver/duplicati.

La première étape consisterait à exécuter la commande appelée id $user pour s’assurer que l’hôte actuel dispose des droits d’accès à la racine pour toutes les tâches à venir. La commande en question, ainsi que la réponse, devraient ressembler à ceci :


root@debian:~# id $user
uid=0(root) gid=0(root) groups=0(root)

Le nombre zéro dans les deux champs gid et uid représente le statut d’un utilisateur root.

La commande suivante exécute le conteneur Docker susmentionné linuxserver/duplicati à l’intérieur de votre système :


docker run -d \
  –name=duplicati \
  -e PUID=0 \
  -e PGID=0 \
  -e TZ=Etc/UTC \
  -p 8200:8200 \
  -v duplicati-config:/config \
  -v /tmp/backups:/backups \
  -v /:/source \
  –restart unless-stopped \
  lscr.io/linuxserver/duplicati:latest

Dès que cette commande est entrée, vous pouvez aller sur l’interface web de Duplicati en visitant http://<server_ip>:8200 dans la barre de recherche de votre navigateur web.

Une fois l’exécution initiale terminée, il est important que le conteneur en question soit arrêté avec la commande docker stop <id_cont>, dans laquelle vous saisissez l’identifiant unique du conteneur.

La plupart des types d’interface graphique pour la gestion des conteneurs Docker devraient également être en mesure d’effectuer cette prochaine étape, mais nous allons passer par la version CLI de celle-ci pour les besoins de cet exemple. Ici, nous devons modifier la commande de lancement de conteneur Docker utilisée précédemment en remplaçant le champ /source par l’emplacement exact de chaque volume que vous souhaitez sauvegarder.


docker run -d \
  –name=duplicati \
  -e PUID=0 \
  -e PGID=0 \
  -e TZ=Etc/UTC \
  -p 8200:8200 \
  -v duplicati-config:/config \
  -v /tmp/backups:/backups \
  -v volume1:/source/volume1 \
  -v volume2:/source/volume2 \
  –restart unless-stopped \
  lscr.io/linuxserver/duplicati:latest

Une fois ce processus terminé, il est recommandé de redémarrer le conteneur Duplicati avant de continuer. La dernière étape consiste à utiliser l’interface web de Duplicati pour lancer des tâches de sauvegarde. Utilisez le bouton Add backup et suivez l’assistant de sauvegarde. Vous devrez indiquer les données exactes que vous souhaitez sauvegarder – les volumes Docker que vous avez mappés devraient être situés dans la catégorie Source data dans l’assistant de sauvegarde. Les sauvegardes elles-mêmes sont enregistrées dans le répertoire /tmp/backups (modifiable).

Nous avons examiné une solution de sauvegarde Docker à petite échelle et une option de sauvegarde de volume Docker gratuite, il est maintenant temps de voir comment les solutions de sauvegarde d’entreprise à grande échelle fonctionnent avec la même tâche.

Sauvegarde et restauration de Docker avec Bacula Enterprise

Bacula Enterprise utilise sa capacité modulaire pour permettre l’intégration native de divers systèmes et services, y compris Docker. Bacula est un logiciel de sauvegarde et de restauration complet, en réseau, conçu pour supporter les charges de travail lourdes des moyennes et grandes entreprises. Il présente également des niveaux de sécurité particulièrement élevés par rapport à d’autres solutions de sauvegarde et, à ce titre, il est utilisé par la grande majorité des organisations militaires, de défense et gouvernementales occidentales. Le module Docker de Bacula fournit un grand nombre de fonctionnalités supplémentaires utiles en plus des fonctionnalités de sauvegarde et de restauration de base.

La sauvegarde Docker avec Bacula Enterprise consiste en trois étapes simples :

  1. L’état actuel du conteneur est sauvegardé dans la nouvelle image
  2. L’utilitaire Docker est exécuté et les données sont sauvegardées
  3. L’instantané en question est supprimé pour libérer de l’espace

La sauvegarde en question peut être effectuée sur un conteneur dans n’importe quel état, et le logiciel Bacula indique l’état du processus de sauvegarde à chaque étape. Chaque sauvegarde d’image de conteneur signifie qu’un fichier .tar supplémentaire est sauvegardé. Les sauvegardes d’images sont conservées dans le répertoire /@docker/image//.tar, et les sauvegardes de conteneurs sont conservées dans le répertoire /@docker/container//.tar .

Le processus de restauration des sauvegardes Docker avec Bacula Enterprise est légèrement plus compliqué et peut être effectué de deux manières différentes :

  • Restore to local directory qui utilise le paramètre where=/some/path Bacula pour indiquer le chemin complet de la sauvegarde à restaurer sous forme de fichier(s) d’archive;
  • Et Restore to Docker service, ce qui signifie que les données de sauvegarde seraient restaurées avec la commande where= en tant que nouveau conteneur, sans les archiver en premier lieu.

La personnalisation du processus de restauration est également possible via différents paramètres, tels que container_create, container_run, etc.

À l’heure où nous écrivons ces lignes, Bacula est l’une des rares (ou la seule) solutions de sauvegarde et de restauration de niveau entreprise capable d’effectuer une sauvegarde complète d’un environnement Docker. Elle protège également un large éventail d’autres technologies de conteneurs et est recommandée pour les environnements informatiques exigeants et critiques en raison de son évolutivité, de sa fiabilité et de sa résilience.

Globalement, la disponibilité d’autres solutions de sauvegarde Docker spécialisées, combinée à la solution intégrée de Docker, ainsi qu’au module Docker de Bacula, signifie qu’il existe une gamme de choix disponibles pour les responsables informatiques à la recherche d’un moyen de sauvegarder leur déploiement Docker de production.

À propos de l’auteur
Rob Morrison
Rob Morrison est le directeur marketing de Bacula Systems. Il a commencé sa carrière dans le marketing informatique chez Silicon Graphics en Suisse, où il a obtenu de bons résultats dans divers rôles de gestion du marketing pendant près de 10 ans. Au cours des 10 années suivantes, Rob a également occupé divers postes de gestion du marketing chez JBoss, Red Hat et Pentaho, assurant la croissance des parts de marché de ces sociétés bien connues. Il est diplômé de l'université de Plymouth, titulaire d'un diplôme spécialisé en médias et communications numériques, et a suivi un programme d'études à l'étranger.
Laissez un commentaire

Votre adresse email ne sera pas publiée. Les champs requis sont indiqués *