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.
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.
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 .
Vous pouvez sauvegarder un conteneur de menu fixe de différentes manières
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 .
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.
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.
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.
Docker a introduit la commande docker volume Prune
pour supprimer facilement tous les volumes suspendus.
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?
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
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-
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.
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
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
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.
Si votre projet utilise docker-compos, voici une approche pour la sauvegarde et la restauration de vos volumes.
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"
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
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
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.
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.
Si vous avez un cas aussi simple que le mien, vous pouvez procéder comme suit:
ADD folder destination
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.
Si vous souhaitez une sauvegarde complète, vous devrez effectuer quelques étapes:
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. "