web-dev-qa-db-fra.com

Comment sauvegarder un conteneur Docker avec ses volumes de données?

J'utilise cette image Docker tutum/wordpress pour illustrer un site Web Wordpress. Récemment, j'ai découvert que l'image utilise des volumes pour les données MySQL.

Le problème est donc le suivant: si je veux sauvegarder et restaurer le conteneur, je peux essayer de valider une image, puis supprimer ultérieurement le conteneur et créer un nouveau conteneur à partir de l'image validée. Mais si je le fais, le volume est supprimé et toutes mes données ont disparu.

Il doit exister un moyen simple de sauvegarder mon conteneur ainsi que ses données de volume, mais je ne le trouve nulle part.

115
pguardiario

si je veux rétablir le conteneur, je peux essayer de valider une image, puis supprimer le conteneur et créer un nouveau conteneur à partir de l'image validée. Mais si je le fais, le volume est supprimé et toutes mes données ont disparu

Comme l'explique le guide de l'utilisateur de docker, volumes de données sont destinés à conserver des données en dehors d'un système de fichiers conteneur. Cela facilite également le partage de données entre plusieurs conteneurs.

Bien que Docker ne supprime jamais les données des volumes (à moins que vous ne supprimiez le conteneur associé avec _docker rm -v_), les volumes qui ne sont référencés par aucun conteneur docker sont appelés volumes suspendus. Ces volumes en suspens sont difficiles à éliminer et difficiles d'accès.

Cela signifie que dès que le dernier conteneur utilisant un volume est supprimé, le volume de données devient suspendu et son contenu difficile d'accès.

Afin d'éviter ces volumes pendants, l'astuce consiste à créer un conteneur Docker supplémentaire à l'aide du volume de données que vous souhaitez conserver. afin qu'il y ait toujours au moins ce conteneur docker référençant le volume. De cette manière, vous pouvez supprimer le conteneur Docker exécutant l'application wordpress sans perdre la facilité d'accès au contenu de ce volume de données.

Ces conteneurs sont appelés conteneurs de volumes de données .

Il doit exister un moyen simple de sauvegarder mon conteneur ainsi que les données de volume, mais je ne les trouve nulle part.

images de menu fixe de sauvegarde

Pour sauvegarder des images du menu fixe, utilisez la commande sauvegarde du menu fixe qui générera une archive tar pouvant être utilisée ultérieurement pour créer une nouvelle image du menu fixe avec la commande chargement du menu fixe .

conteneurs de menu fixe

Vous pouvez sauvegarder un conteneur de menu fixe de différentes manières

  • en validant une nouvelle image de menu fixe basée sur l'état actuel du conteneur de menu fixe à l'aide de la commande validation du menu fixe
  • en exportant le système de fichiers du conteneur Docker en tant qu’archive tar à l’aide de la commande exportation Docker . Vous pouvez créer ultérieurement une nouvelle image de menu fixe à partir de cette archive tar avec la commande importation de menu fixe .

Sachez que ces commandes ne font que sauvegarder le système de fichiers en couches du conteneur docker. Ceci exclut les volumes de données .

volumes de données du docker de sauvegarde

Pour sauvegarder un volume de données, vous pouvez exécuter un nouveau conteneur en utilisant le volume que vous souhaitez sauvegarder et en exécutant la commande tar pour générer une archive du contenu du volume, comme décrit dans le guide de l'utilisateur de docker .

Dans votre cas particulier, le volume de données est utilisé pour stocker les données pour un serveur MySQL. Donc, si vous souhaitez exporter une archive tar pour ce volume, vous devez d'abord arrêter le serveur MySQL. Pour ce faire, vous devrez arrêter le conteneur wordpress.

sauvegarder les données MySQL

Une autre méthode consiste à vous connecter à distance au serveur MySQL pour générer un vidage de la base de données avec la commande mysqldump . Cependant, pour que cela fonctionne, votre serveur MySQL doit être configuré pour accepter les connexions distantes et également pour un utilisateur autorisé à se connecter à distance. Ce n'est peut-être pas le cas avec l'image de docker wordpress que vous utilisez.


Modifier

Docker a récemment introduit plugins de volume Docker qui permettent de déléguer le traitement des volumes à des plugins implémentés par les fournisseurs.

La commande _docker run_ a un nouveau comportement pour l'option -v . Il est maintenant possible de lui passer un nom du volume. Les volumes créés de cette manière sont nommés et faciles à référencer plus tard, ce qui facilite les problèmes avec volumes suspendus.

Modifier 2

Docker a introduit la commande docker volume Prune pour supprimer facilement tous les volumes suspendus.

112
Thomasleveil

UPDATE 2

Script de sauvegarde de volume unique brut:

#!/bin/bash
# This script allows you to backup a single volume from a container
# Data in given volume is saved in the current directory in a tar archive.
CONTAINER_NAME=$1
VOLUME_NAME=$2

usage() {
  echo "Usage: $0 [container name] [volume name]"
  exit 1
}

if [ -z $CONTAINER_NAME ]
then
  echo "Error: missing container name parameter."
  usage
fi

if [ -z $VOLUME_NAME ]
then
  echo "Error: missing volume name parameter."
  usage
fi

Sudo docker run -rm --volumes-from $CONTAINER_NAME -v $(pwd):/backup busybox tar cvf /backup/backup.tar $VOLUME_NAME

Script de restauration de volume unique brut:

#!/bin/bash
# This script allows you to restore a single volume from a container
# Data in restored in volume with same backupped path
NEW_CONTAINER_NAME=$1

usage() {
  echo "Usage: $0 [container name]"
  exit 1
}

if [ -z $NEW_CONTAINER_NAME ]
then
  echo "Error: missing container name parameter."
  usage
fi

Sudo docker run -rm --volumes-from $NEW_CONTAINER_NAME -v $(pwd):/backup busybox tar xvf /backup/backup.tar

L'utilisation peut être comme ça:

$ volume_backup.sh old_container /srv/www
$ Sudo docker stop old_container && Sudo docker rm old_container
$ Sudo docker run -d --name new_container myrepo/new_container
$ volume_restore.sh new_container

Les hypothèses sont les suivantes: le fichier de sauvegarde s'appelle backup.tar, il réside dans le même répertoire que le script de sauvegarde et de restauration, le nom du volume est identique entre les conteneurs.

UPDATE

Il me semble que les volumes de backupping des conteneurs ne diffèrent pas de ceux des conteneurs de données.

Les volumes ne sont rien d’autre que des chemins liés à un conteneur, le processus est donc le même.

Je ne sais pas si docker-backup fonctionne également pour les mêmes volumes de conteneur, mais vous pouvez utiliser:

Sudo docker run -rm --volumes-from yourcontainer -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data

et:

Sudo docker run -rm --volumes-from yournewcontainer -v $(pwd):/backup busybox tar xvf /backup/backup.tar

END UPDATE

Il y a cet outil Nice disponible qui vous permet de sauvegarder et de restaurer des conteneurs de volumes de menu fixe:

https://github.com/discordianfish/docker-backup

si vous avez un conteneur lié à certains volumes de conteneur comme ceci:

$ docker run --volumes-from=my-data-container --name my-server ...

vous pouvez sauvegarder tous les volumes comme ceci:

$ docker-backup store my-server-backup.tar my-server

et restaurer comme ça:

$ docker-backup restore my-server-backup.tar

Ou vous pouvez suivre la voie officielle:

Comment transférer des volumes de données uniquement d'un hôte à un autre?

26
tommasop

Si vous ne devez sauvegarder que des volumes montés, vous pouvez simplement copier des dossiers de votre Dockerhost .

Remarque: Si vous êtes sur bunt, Dockerhost est votre ordinateur local. Si vous êtes sur Mac, Dockerhost est votre machine virtuelle.

sur Ubunt

Vous pouvez trouver tous les dossiers avec des volumes ici: /var/lib/docker/volumes/ afin que vous puissiez les copier et les archiver où vous le souhaitez.

sur MAC

Ce n'est pas si facile que sur Ubuntu. Vous devez copier les fichiers de la VM.

Voici un script expliquant comment copier tous les dossiers contenant des volumes de la machine virtuelle (où le serveur Docker est en cours d'exécution) sur votre machine locale. Nous supposons que votre machine docker VM nommée par défaut.

docker-machine ssh default Sudo cp -v -R /var/lib/docker/volumes/ /home/docker/volumes

docker-machine ssh default Sudo chmod -R 777 /home/docker/volumes

docker-machine scp -R default:/home/docker/volumes ./backup_volumes

docker-machine ssh default Sudo rm -r /home/docker/volumes

Il va créer un dossier ./ backup_volumes dans votre répertoire actuel et copier tous les volumes dans ce dossier.

Voici un script expliquant comment copier tous les volumes enregistrés de votre répertoire local (./ backup_volumes) sur la machine Dockerhost

docker-machine scp -r ./backup_volumes default:/home/docker

docker-machine ssh default Sudo mv -f /home/docker/backup_volumes /home/docker/volumes

docker-machine ssh default Sudo chmod -R 777 /home/docker/volumes

docker-machine ssh default Sudo cp -v -R /home/docker/volumes /var/lib/docker/

docker-machine ssh default Sudo rm -r /home/docker/volumes

Maintenant, vous pouvez vérifier si cela fonctionne par:

docker volume ls
13
Andrii Dvoiak

Disons que votre nom de volume est data_volume. Vous pouvez utiliser les commandes suivantes pour sauvegarder et restaurer le volume vers et depuis une image de menu fixe nommée data_image:

Pour sauvegarder:

docker run --rm --mount source=data_volume,destination=/data Alpine tar -c -f- data | docker run -i --name data_container Alpine tar -x -f-
docker container commit data_container data_image
docker rm data_container

à restaurer:

docker run --rm data_image tar -c -f- data | docker run -i --rm --mount source=data_volume,destination=/data Alpine tar -x -f-
9
Sahil Ahuja

Je sais que cela est ancien, mais je me rends compte qu’il n’existe pas de solution bien documentée pour transférer un conteneur de données (en tant que sauvegarde) sur le hub Docker. Je viens de publier un court exemple sur la façon de le faire sur https://dzone.com/articles/docker-backup-your-data-volumes-to-docker-hub

Ce qui suit est la ligne de fond

Le didacticiel de docker suggère que vous pouvez sauvegarder et restaurer le volume de données localement. Nous allons utiliser cette technique, ajouter quelques lignes supplémentaires pour que cette sauvegarde soit insérée dans le docker hub pour une restauration ultérieure aisée vers n’importe quel emplacement souhaité. Alors, commençons. Ce sont les étapes à suivre:

Sauvegardez le volume de données à partir du conteneur de données nommé data-container-to-backup

docker run --rm --volumes-from data-container-backup --name tmp-backup -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /folderToBackup

Développez ce fichier tar dans un nouveau conteneur afin que nous puissions le valider avec son image

docker run -d -v $(pwd):/backup --name data-backup ubuntu /bin/sh -c "cd / && tar xvf /backup/backup.tar"

Valider et pousser l'image avec le tag désiré ($ VERSION)

docker commit data-backup repo/data-backup:$VERSION
docker Push repo/data-backup:$VERSION

Enfin, permet de nettoyer

docker rm data-backup
docker rmi $(docker images -f "dangling=true" -q)

Nous avons maintenant une image nommée data-backup dans notre dépôt qui est simplement un système de fichiers avec les fichiers et les dossiers de sauvegarde. Pour utiliser cette image (restauration de sauvegarde), nous procédons comme suit:

Exécuter le conteneur de données avec l'image de sauvegarde des données

run -v /folderToBackup --entrypoint "bin/sh" --name data-container repo/data-backup:${VERSION}

Exécutez votre image whatEver avec les volumes du conainter de données

docker run --volumes-from=data-container repo/whatEver

C'est ça.

J'ai été surpris qu'il n'y ait pas de documentation pour ce travail. J'espère que quelqu'un trouvera cela utile. Je sais qu'il m'a fallu un certain temps pour y penser.

8
z-star

La commande suivante va lancer tar dans un conteneur avec tous les volumes de données nommés montés, puis rediriger la sortie dans un fichier:

docker run --rm `docker volume list -q | egrep -v '^.{64}$' | awk '{print "-v " $1 ":/mnt/" $1}'` Alpine tar -C /mnt -cj . > data-volumes.tar.bz2

Assurez-vous de tester les archives résultantes en cas de problème:

tar -tjf data-volumes.tar.bz2
4
konrad

Si vous avez juste besoin d'une simple sauvegarde sur une archive, vous pouvez essayer mon petit utilitaire: https://github.com/loomchild/volume-backup

Exemple

Sauvegarde:

docker run -v some_volume:/volume -v /tmp:/backup --rm loomchild/volume-backup backup archive1

archivera le volume nommé some_volume dans le fichier d’archivage /tmp/archive1.tar.bz2

Restaurer:

docker run -v some_volume:/volume -v /tmp:/backup --rm loomchild/volume-backup restore archive1

va effacer et restaurer le volume nommé some_volume à partir de /tmp/archive1.tar.bz2 fichier archive.

Plus d'infos: https://medium.com/@loomchild/backup-restore-docker-named-volumes-350397b8e362

3
loomchild

J'ai créé un outil pour orchestrer et lancer la sauvegarde des données et des conteneurs mysql, simplement appelé docker-backup . Il y a même un image prête à l'emploi sur le concentrateur de docker .

Il est principalement écrit en Bash car il s’agit principalement d’orchestration. Il utilise duplicity pour le moteur de sauvegarde actuel. Vous pouvez actuellement sauvegarder sur FTP (S) et Amazon S3.

La configuration est assez simple: écrivez un fichier de configuration en YAML décrivant ce qu’il faut sauvegarder et où, et voilà!

Pour les conteneurs de données, il monte automatiquement les volumes partagés par votre conteneur afin de le sauvegarder et de le traiter. Pour les conteneurs mysql, il les lie, exécute un mysqldump fourni avec votre conteneur et traite le résultat.

Je l'ai écrit parce que j'utilise Docker-Cloud, qui n'est pas à jour avec les dernières versions de docker-engine, et parce que je voulais adopter la méthode Docker en n'incluant aucun processus de sauvegarde dans mes conteneurs d'applications.

2
Arnaud de Mouhy

Si votre projet utilise docker-compos, voici une approche pour la sauvegarde et la restauration de vos volumes.

docker-compose.yml

En gros, vous ajoutez les services db-backup et db-restore à votre fichier docker-compose.yml, puis vous l’adaptez au nom de votre volume. Mon volume s'appelle dbdata dans cet exemple.

version: "3"

services:
  db:
    image: percona:5.7
    volumes:
      - dbdata:/var/lib/mysql

  db-backup:
    image: Alpine    
    tty: false
    environment:
      - TARGET=dbdata
    volumes:
      - ./backup:/backup
      - dbdata:/volume
    command: sh -c "tar -cjf /backup/$${TARGET}.tar.bz2 -C /volume ./"

  db-restore:
    image: Alpine    
    environment:
      - SOURCE=dbdata
    volumes:
      - ./backup:/backup
      - dbdata:/volume
    command: sh -c "rm -rf /volume/* /volume/..?* /volume/.[!.]* ; tar -C /volume/ -xjf /backup/$${SOURCE}.tar.bz2"

Éviter la corruption

Pour la cohérence des données, arrêtez votre conteneur de base de données avant de sauvegarder ou de restaurer

docker-compose stop db

Sauvegarde

Pour sauvegarder vers la destination par défaut (backup/dbdata.tar.bz2):

docker-compose run --rm db-backup

Ou, si vous souhaitez spécifier un autre nom de cible, faites:

docker-compose run --rm -e TARGET=mybackup db-backup

La restauration

Pour restaurer à partir de backup/dbdata.tar.bz2, procédez comme suit:

docker-compose run --rm db-restore

Ou restaurer à partir d'un fichier spécifique en utilisant:

docker-compose run --rm -e SOURCE=mybackup db-restore

J'ai adapté les commandes de https://loomchild.net/2017/03/26/backup-restore-docker-named-volumes/ pour créer cette approche.

2
jdhildeb

Si vous aimez entrer des opérateurs mystérieux à partir de la ligne de commande, vous allez adorer ces techniques de sauvegarde manuelle des conteneurs. N'oubliez pas qu'il existe un moyen plus rapide et plus efficace de sauvegarder des conteneurs tout aussi efficaces. J'ai écrit des instructions ici: https://www.morpheusdata.com/blog/2017-03-02-how-to-create-a-docker-backup-with-morpheus

Étape 1: Ajouter un hôte Docker à n’importe quel nuage Comme expliqué dans un tutoriel sur le site de support de Morpheus, vous pouvez ajouter un hôte Docker au nuage de votre choix en quelques secondes. Commencez par choisir Infrastructure dans la barre de navigation principale de Morpheus. Sélectionnez Hôtes en haut de la fenêtre Infrastructure, puis cliquez sur le bouton “+ Hôtes de conteneur” en haut à droite.

Pour sauvegarder un hôte Docker sur un nuage via Morpheus, accédez à l'écran Infrastructure et ouvrez le menu "Hôtes du conteneur".

Choisissez un type d’hôte conteneur dans le menu, sélectionnez un groupe, puis entrez des données dans les cinq champs: Nom, Description, Visibilité, Sélectionner un nuage et Entrer des balises (facultatif). Cliquez sur Suivant, puis configurez les options de l'hôte en choisissant un plan de service. Notez que les champs Nombre, Mémoire et Nombre de processeurs ne sont visibles que si les options personnalisées sont activées dans le plan sélectionné.

Vous pouvez ajouter et dimensionner des volumes, définir la taille de la mémoire et le nombre de processeurs, puis choisir un réseau. Vous pouvez également configurer le nom d'utilisateur et le mot de passe du système d'exploitation, le nom de domaine et le nom d'hôte, qui est par défaut le nom du conteneur que vous avez entré précédemment. Cliquez sur Suivant, puis ajoutez des flux de travail d'automatisation (facultatif). Enfin, passez en revue vos paramètres et cliquez sur Terminer pour les enregistrer.

Étape 2: Ajout de l'intégration du registre Docker aux clouds publics ou privés Adam Hicks décrit dans un autre tutoriel de Morpheus à quel point il est simple de s'intégrer à un registre privé Docker. (Aucune configuration supplémentaire n'est requise pour utiliser Morpheus afin de provisionner des images avec le concentrateur public de Docker à l'aide de l'API Docker publique.)

Sélectionnez Intégrations sous l'onglet Admin de la barre de navigation principale, puis choisissez le bouton "+ Nouvelle intégration" sur le côté droit de l'écran. Dans la fenêtre Intégration qui apparaît, sélectionnez Référentiel Docker dans le menu déroulant Type, entrez un nom et ajoutez le point de terminaison de l'API de registre privé. Indiquez un nom d'utilisateur et un mot de passe pour le registre que vous utilisez, puis cliquez sur le bouton Enregistrer les modifications.

Intégrez un registre Docker à un nuage privé via la boîte de dialogue "Nouvelle intégration" de Morpheus.

Pour provisionner l'intégration que vous venez de créer, choisissez Docker sous Type dans la boîte de dialogue Créer une instance, sélectionnez le registre dans le menu déroulant Registre de Docker sous l'onglet Configurer, puis continuez à provisionner comme vous le feriez avec n'importe quel conteneur Docker.

Étape 3: Gestion des sauvegardes Une fois que vous avez ajouté l'hôte Docker et intégré le registre, une sauvegarde est configurée et exécutée automatiquement pour chaque instance que vous configurez. L'assistance de Morpheus fournit des instructions pour afficher les sauvegardes, créer une sauvegarde d'instance et créer une sauvegarde de serveur.

1
thelefty07

Si vous avez un cas aussi simple que le mien, vous pouvez procéder comme suit:

  1. Créez un fichier Docker qui étend l'image de base de votre conteneur
  2. Je suppose que vos volumes sont mappés sur votre système de fichiers, vous pouvez donc simplement ajouter ces fichiers/dossiers à votre image à l'aide de ADD folder destination
  3. Terminé!

Par exemple, en supposant que les données des volumes se trouvent dans votre répertoire de base, par exemple sous /home/mydata, vous pouvez exécuter les opérations suivantes:

DOCKERFILE=/home/dockerfile.bk-myimage
docker build --rm --no-cache -t $IMAGENAME:$TAG -f $DOCKERFILE /home/pirate

Où votre DOCKERFILE pointe vers un fichier comme celui-ci:

FROM user/myimage
MAINTAINER Danielo Rodríguez Rivero <[email protected]>

WORKDIR /opt/data
ADD mydata .

Le reste des éléments est hérité de l'image de base. Vous pouvez maintenant transmettre cette image au nuage de docker et vos utilisateurs disposeront des données directement sur leurs conteneurs.

0
Danielo515

Si vous souhaitez une sauvegarde complète, vous devrez effectuer quelques étapes:

  1. Engager le conteneur dans une image
  2. Sauvegarder l'image
  3. Sauvegardez le volume du conteneur en créant un fichier tar contenant le point de montage du volume dans le conteneur.
  4. Répétez les étapes 1 à 3 pour le conteneur de base de données.

Notez que le fait de valider un conteneur Docker du conteneur sur une image n'inclut PAS les volumes attachés au conteneur (réf: documentation de validation de Docker ).

" L'opération de validation n'inclut aucune donnée contenue dans des volumes montés à l'intérieur du conteneur. "

0
eaglet3d