Question Comment puis-je sauvegarder un conteneur Docker avec ses volumes de données?


J'ai utilisé cette image Docker tutum / wordpress faire la démonstration d'un site 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 souhaite 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 y avoir un moyen simple de sauvegarder mon conteneur et ses volumes de données, mais je ne le trouve pas nulle part.


72
2017-10-13 01:09


origine


Réponses:


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 d'utilisation de docker, volumes de données sont destinés à conserver les données en dehors d'un système de fichiers conteneur. Cela facilite également le partage de données entre plusieurs conteneurs.

Alors que Docker ne supprimera jamais les données dans les volumes (sauf si vous supprimez le conteneur associé avec docker rm -v), les volumes qui ne sont référencés par aucun conteneur de docker sont appelés volumes pendants. Ceux volumes pendants 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 instable et son contenu difficile à accéder.

Pour éviter ces volumes en suspens, l'astuce consiste à créer un conteneur Docker supplémentaire en utilisant le volume de données que vous souhaitez conserver; de sorte qu'il y aura toujours au moins ce conteneur de docker faisant référence au volume. De cette façon, vous pouvez supprimer le conteneur Docker exécutant l'application wordpress sans perdre la facilité d'accès à ce contenu de volume de données.

De tels conteneurs sont appelés conteneurs de volume de données.

Il doit y avoir un moyen simple de sauvegarder mon conteneur plus les données de volume, mais je ne peux le trouver nulle part.

images de sauvegarde docker

Pour sauvegarder des images de docker, utilisez le docker sauver commande qui produira une archive tar utilisable ultérieurement pour créer une nouvelle image de charge de docker commander.

conteneurs de sauvegarde

Vous pouvez sauvegarder un conteneur de docker par différents moyens

  • en validant une nouvelle image de docker basée sur l’état actuel du conteneur Docker à l’aide du docker commettre commander
  • en exportant le système de fichiers du conteneur docker en tant qu'archive tar à l'aide du exportation de docker commander. Vous pourrez plus tard créer une nouvelle image de docker à partir de cette archive tar avec le importation de docker commander.

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

sauvegarde des volumes de données du docker

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

Dans votre cas particulier, le volume de données est utilisé pour stocker les données pour un serveur MySQL. Donc, si vous voulez 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 façon consiste à se connecter à distance au serveur MySQL pour produire une base de données avec le mysqldump commander. Cependant, pour que cela fonctionne, votre serveur MySQL doit être configuré pour accepter les connexions distantes et un utilisateur est autorisé à se connecter à distance. Cela peut ne pas être le cas avec l'image Docker wordpress que vous utilisez.


modifier

Docker a récemment introduit Plugins de volume Docker qui permettent de déléguer la gestion des volumes aux plugins implémentés par les fournisseurs.

le docker run commande a un nouveau comportement pour le -v option. Il est maintenant possible de passer un nom du volume. Les volumes ainsi créés sont nommé et facile à référencer plus tard, soulageant les problèmes avec volumes pendants.

Modifier 2

Docker a présenté le docker volume prune commande pour supprimer tous les volumes en suspens facilement.


82
2017-10-13 12:18



MISE À JOUR 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 ceci:

$ 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 le même entre les conteneurs.

METTRE À JOUR

Il me semble que le retour en arrière des volumes des conteneurs n'est pas différent de celui des volumes de conteneurs de données.

Les volumes ne sont rien d'autre que des chemins d'accès liés à un conteneur. Le processus est donc identique.

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

FIN MISE À JOUR

Il existe un outil très pratique qui vous permet de sauvegarder et de restaurer les conteneurs de volumes Docker:

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

Si vous avez un conteneur lié à certains volumes de conteneur comme celui-ci:

$ 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 ceci:

$ 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?


19
2017-10-13 12:19



Si vous avez seulement besoin de sauvegarder des volumes montés, vous pouvez simplement copier des dossiers de votre Dockerhost.

Note: Si vous êtes sur Ubuntu, Dockerhost est votre machine locale. Si vous êtes sur Mac, Dockerhost est votre machine virtuelle.

Sur Ubuntu

Vous pouvez trouver tous les dossiers avec des volumes ici: /var/lib/docker/volumes/ vous pouvez donc les copier et les archiver où vous voulez.

Sur MAC

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

Voici un script expliquant comment copier tous les dossiers contenant des volumes depuis une machine virtuelle (où le serveur Docker est exécuté) vers votre ordinateur local. Nous supposons que votre VM Docker-Machine nommée 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 copiez tous les volumes dans ce dossier.

Voici un script expliquant comment copier tous les volumes enregistrés à partir de votre répertoire local (./backup_volumes) à 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

10
2018-03-10 14:55



Je sais que c'est vieux, mais je me rends compte qu'il n'y a pas de solution bien documentée pour pousser un conteneur de données (en tant que sauvegarde) vers le concentrateur de docker. Je viens de publier un court exemple sur la façon de le faire à https://dzone.com/articles/docker-backup-your-data-volumes-to-docker-hub

Voici la ligne de fond

Le didacticiel Docker suggère de pouvoir sauvegarder et restaurer le volume de données localement. Nous allons utiliser cette technique, ajouter quelques lignes supplémentaires pour que cette sauvegarde soit propulsée dans le concentrateur Docker pour une restauration ultérieure facile à n'importe quel endroit. Alors, commençons. Voici 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 dans le cadre de 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 l'étiquette souhaitée ($ 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 référentiel qui est simplement un système de fichiers avec les fichiers et dossiers de sauvegarde. Pour utiliser cette image (aka restaurer à partir d'une sauvegarde), nous procédons comme suit:

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

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

Exécuter votre image whatEver avec les volumes du conteneur de données

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

C'est tout.

J'ai été surpris par l'absence de documentation pour ce travail. J'espère que quelqu'un trouvera cela utile. Je sais que cela m'a pris du temps pour y réfléchir.


6
2017-12-22 09:31



Disons que votre nom de volume est data_volume. Vous pouvez utiliser les commandes suivantes pour sauvegarder et restaurer le volume depuis et vers une image 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-

6
2018-01-05 11:45



La commande suivante exécute tar dans un conteneur avec tous les volumes de données nommés montés et redirige 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 l'archive obtenue en cas de problème:

tar -tjf data-volumes.tar.bz2

2
2017-10-31 20:14



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

Il est principalement écrit dans Bash car il est principalement orchestré. 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 dans YAML décrivant ce qu'il faut sauvegarder et où, et c'est parti!

Pour les conteneurs de données, il monte automatiquement les volumes partagés par votre conteneur pour les sauvegarder et les traiter. Pour les conteneurs mysql, il les lie et exécute un mysqldump groupé 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 du moteur de docker et parce que je voulais adopter le mode Docker en n'incluant aucun processus de sauvegarde dans mes conteneurs d'applications.


2
2018-04-25 07:52



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

Étape 1: Ajouter un hôte Docker à un nuage Comme expliqué dans un tutoriel sur le site de support Morpheus, vous pouvez ajouter un hôte Docker au cloud de votre choix en quelques secondes. Commencez par choisir Infrastructure sur 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 du conteneur" en haut à droite.

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

Choisissez un type d'hôte de 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 Volume, Mémoire et Nombre de processeurs seront visibles uniquement si les options personnalisées du plan que vous sélectionnez sont activées.

Vous pouvez ici ajouter et dimensionner les 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 les flux de travaux d'automatisation (facultatif). Enfin, vérifiez vos paramètres et cliquez sur Terminer pour les enregistrer.

Étape 2: Ajouter l'intégration du registre Docker à des nuages ​​publics ou privés Adam Hicks décrit dans un autre tutoriel de Morpheus à quel point il est simple de l'intégrer à un registre Docker privé. (Aucune configuration supplémentaire n'est requise pour utiliser Morpheus afin de provisionner des images avec le concentrateur public de Docker utilisant 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 d'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é. Fournissez 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 cloud 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 Docker Registry sous l'onglet Configurer, puis continuez comme s'il s'agissait d'un conteneur Docker.

Étape 3: Gérer les sauvegardes Une fois que vous avez ajouté l'hôte Docker et intégré le registre, une sauvegarde sera configurée et exécutée automatiquement pour chaque instance que vous fournissez. Le support Morpheus fournit des instructions pour afficher les sauvegardes, créer une sauvegarde d'instance et créer une sauvegarde du serveur.


1
2018-03-03 15:38



Si vous avez un cas aussi simple que le mien, vous pouvez faire ce qui suit:

  1. Créez un fichier Dockerfile 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 en utilisant ADD folder destination
  3. Terminé!

Par exemple, en supposant que vous avez les données des volumes sur votre répertoire personnel, par exemple à /home/mydata vous pouvez exécuter ce qui suit:

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 <example@gmail.com>

WORKDIR /opt/data
ADD mydata .

Le reste du matériel est hérité de l'image de base. Vous pouvez maintenant transférer cette image vers le docker cloud et vos utilisateurs disposeront des données directement sur leurs conteneurs.


0
2018-01-04 13:34