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

152

J'ai utilisé ce tutum / wordpress Docker-image pour démontrer 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 plus tard le conteneur et créer un nouveau conteneur à partir de l'image validée. Mais si je fais cela, le volume est supprimé et toutes mes données ont disparu.

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

pguardiario
la source
Consultez ce script que j'ai écrit et qui sauvegarde absolument tout dans un projet docker, y compris les volumes nommés et sans nom, les images, la configuration, les journaux, le système de fichiers racine du conteneur, les bases de données, etc .: docker-compose-backup.sh .
Nick Sweeting

Réponses:

142

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

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

Alors que Docker ne supprimera jamais les données des volumes (sauf si vous supprimez 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 suspendus sont difficiles à éliminer et d'accès difficile.

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 suspendus, l'astuce consiste à créer un conteneur Docker supplémentaire en utilisant le 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 façon, 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 volume de données .

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

images du docker de sauvegarde

Pour sauvegarder des images docker, utilisez la commande docker save qui produira une archive tar qui pourra être utilisée plus tard pour créer une nouvelle image docker avec la commande docker load .

conteneurs docker de sauvegarde

Vous pouvez sauvegarder un conteneur Docker par différents moyens

  • en validant une nouvelle image docker basée sur l'état actuel du conteneur docker à l'aide de la commande docker commit
  • en exportant le système de fichiers du conteneur docker en tant qu'archive tar à l'aide de la commande docker export . Vous pouvez plus tard créer une nouvelle image docker à partir de cette archive tar avec la commande docker import .

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 en utilisant le volume que vous souhaitez sauvegarder et en exécutant la commande tar pour produire une archive du contenu du volume comme décrit dans le guide de l'utilisateur du docker .

Dans votre cas particulier, le volume de données est utilisé pour stocker les données d'un serveur MySQL. Donc, si vous souhaitez exporter une archive tar pour ce volume, vous devrez 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 est de se connecter à distance au serveur MySQL pour produire 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 à distance et avoir également un utilisateur autorisé à se connecter à distance. Ce n'est peut-être pas le cas avec l'image docker wordpress que vous utilisez.


Éditer

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

La docker runcommande a un nouveau comportement pour l' -voption. Il est maintenant possible de lui passer un nom de volume . Les volumes créés de cette manière sont nommés et faciles à référencer ultérieurement, ce qui simplifie les problèmes liés aux volumes suspendus .

Modifier 2

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

Thomasleveil
la source
34
En fait, je suis plus intéressé par la création d'un conteneur que je peux déplacer facilement, je ne comprends pas l'intérêt d'un conteneur qui ne peut pas être déplacé.
pguardiario
Dans ce cas, vous devriez regarder des outils qui vous aident à gérer le volume de données Docker pour vous, tels que Flocker
Thomasleveil
9
Docker ne supprime pas automatiquement les volumes de données. Data volumes are designed to persist data, independent of the container’s life cycle. Docker therefore never automatically delete volumes when you remove a container, nor will it “garbage collect” volumes that are no longer referenced by a container. donc seuls les conteneurs de données sont hérités
Andrii Zarubin
2
vous n'avez pas besoin d'une connexion à distance pour le mysqldump. Il suffit de décortiquer le conteneur, de le vider, puis de le copier avec docker cp.
jiggunjer le
@AndriiZarubin re: data only container obsolete?Pas du tout. Le conteneur de données uniquement vous donne un conteneur vers docker exec data-container tar -czf snapshot.tgz /dataalors docker cp data-container:snapshot.tgz ./snapshot.tgzet autres. Si vous voulez que le conteneur dure longtemps, faites en sorte que sa commande tail -f /dev/nullne se termine jamais, en utilisant un minimum de ressources.
Jesse Chisholm
31

MISE À JOUR 2

Script bash 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 bash 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 est nommé 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 la sauvegarde de volumes à partir de conteneurs n'est pas différente de la sauvegarde de volumes à partir de 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 conteneurs 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 DE LA MISE À JOUR

Il existe ce bel outil disponible 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 conteneurs 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 restaurez comme ceci:

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

Ou vous pouvez suivre la voie officielle:

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

tommasop
la source
Non, ce n'est pas une situation «--volumes-from», mais les volumes sont définis dans le fichier docker, ce qui empêche les données de persister. Si vous regardez le fichier docker pour tutum / lampe, vous verrez ce que je veux dire.
pguardiario
La réponse que j'ai déjà donnée est bonne pour tout type de volume car les volumes sont des volumes et les conteneurs sont des conteneurs, il n'y a pas de différence si vous utilisez un conteneur comme conteneur de données du point de vue des volumes
tommasop
Le volume défini dans le fichier dockerfile est détruit lorsque le conteneur est détruit. Il n'y a donc aucun moyen de récupérer ces données lorsque vous déplacez le conteneur.
pguardiario
vous devez extraire les données avant de déplacer le conteneur, puis relancer le conteneur et remettre les données
tommasop
1
J'obtiens une erreur: est-ce unknown shorthand flag: 'r' in -rm.que ça devrait l'être --rm? (Docker version 18.09.5, build e8ff056)
kuga
22

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

Remarque: 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 le souhaitez.

Sur MAC

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

Voici un script expliquant comment copier tous les dossiers avec des volumes de la machine virtuelle (sur laquelle le serveur Docker est en cours d'exécution) sur votre machine locale. Nous supposons que votre machine virtuelle docker-machine nommée default .

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 ) vers 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

Vous pouvez maintenant vérifier si cela fonctionne en:

docker volume ls
Andrii Dvoiak
la source
Avons-nous besoin d'arrêter le conteneur pour faire une sauvegarde de ce dossier /var/lib/docker/volumessous Ubuntu?
onknows le
2
Pas nécessaire, vous pouvez copier ce dossier à tout moment.
Andrii Dvoiak
4
Techniquement oui, vous pouvez, mais vous êtes exposé à des problèmes de corruption de données car la copie n'est pas atomique et il peut y avoir des écritures simultanées sur le volume, je préfère arrêter le conteneur en premier.
Alessandro S.
13

Disons que le nom de votre volume est data_volume. Vous pouvez utiliser les commandes suivantes pour sauvegarder et restaurer le volume vers et à partir d'une image Docker 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-
Sahil Ahuja
la source
S'agit-il d'une sauvegarde en temps réel?
Kang Andrew
2
Comme le même volume peut être monté sur plusieurs dockers, oui, il s'agit d'une sauvegarde en temps réel. Par exemple. le volume monté sur un conteneur Mysql peut être sauvegardé (en supposant qu'aucune corruption de données). Mais pour les services qui doivent être arrêtés par peur de la corruption des données, non ce n'est pas en temps réel.
Sahil Ahuja
9

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 docker hub. Je viens de publier un court exemple sur la manière de le faire sur https://dzone.com/articles/docker-backup-your-data-volumes-to-docker-hub

Voici la ligne du bas

Le tutoriel 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 poussée dans le hub docker pour une restauration future facile à n'importe quel emplacement que nous souhaitons. 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"

Validez et transmettez l'image avec la balise souhaitée ($ VERSION)

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

Enfin, nettoyons

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

Maintenant, nous avons 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 restauration à partir d'une sauvegarde), nous procédons comme suit:

Exécutez 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 conteneur de données

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

C'est tout.

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 réfléchir.

étoile z
la source
8

Si votre projet utilise docker-compose, voici une approche pour sauvegarder et restaurer vos volumes.

docker-compose.yml

Fondamentalement , vous ajoutez db-backupet db-restoreservices à votre fichier docker-compose.yml et adaptez le nom de votre volume. Mon volume est nommé dbdatadans 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"

Évitez 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, procédez comme suit:

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

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.

jdhildeb
la source
5

La commande suivante exécutera tar dans un conteneur avec tous les volumes de données nommés montés et redirigera 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 résultante en cas de problème:

tar -tjf data-volumes.tar.bz2
Konrad
la source
4

Si vous avez juste besoin d'une simple sauvegarde dans 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_volumepour /tmp/archive1.tar.bz2archiver le fichier

Restaurer:

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

va effacer et restaurer le volume du nom some_volumede /tmp/archive1.tar.bz2fichier d' archive.

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

métier à tisser
la source
J'ai créé un outil similaire github.com/01e9/docker-backup Il crée des archives de sauvegarde et les ajoute à un répertoire de synchronisation Resilio
Oleg
2

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 une image prête à l'emploi sur le hub docker .

Il est principalement écrit en Bash car il s'agit principalement d'orchestration. Il utilise duplicitypour le moteur de sauvegarde réel. Vous pouvez actuellement effectuer une sauvegarde 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 c'est parti!

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

Arnaud de Mouhy
la source
2

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

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

Notez que faire juste un commit Docker du conteneur sur une image n'inclut PAS les volumes attachés au conteneur (ref: documentation du commit Docker ).

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

eaglet3d
la source
1

Si vous aimez saisir des opérateurs arcanes à partir de la ligne de commande, vous adorerez ces techniques de sauvegarde manuelle des conteneurs. Gardez à l'esprit qu'il existe un moyen plus rapide et plus efficace de sauvegarder des conteneurs qui est tout aussi efficace. 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 cloud 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 dans la barre de navigation principale de Morpheus. Sélectionnez Hôtes en haut de la fenêtre Infrastructure, puis cliquez sur le bouton «+ Container Hosts» en haut à droite.

Pour sauvegarder un hôte Docker sur un cloud via Morpheus, accédez à l'écran Infrastructure et ouvrez le menu «+ Container Hosts».

Choisissez un type d'hôte de conteneur dans le menu, sélectionnez un groupe, puis saisissez des données dans les cinq champs: Nom, Description, Visibilité, Sélectionnez un nuage et Entrez des balises (facultatif). Cliquez sur Suivant, puis configurez les options d'hôte en choisissant un plan de service. Notez que les champs Volume, Mémoire et Nombre de CPU ne seront visibles que si le plan que vous sélectionnez a des options personnalisées activées.

C'est ici que vous ajoutez et redimensionnez des volumes, définissez la taille de la mémoire et le nombre de processeurs, et choisissez 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 par défaut est le nom du conteneur que vous avez entré précédemment. Cliquez sur Suivant, puis ajoutez les flux de travail 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 aux nuages ​​publics ou privés Adam Hicks décrit dans un autre didacticiel Morpheus à quel point il est simple de s'intégrer à un registre Docker privé. (Aucune configuration supplémentaire n'est requise pour utiliser Morpheus pour provisionner des images avec le hub 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 d'intégration qui apparaît, sélectionnez Docker Repository dans le menu déroulant Type, entrez un nom et ajoutez le point de terminaison de l'API du 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 Morpheus «Nouvelle intégration».

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 Docker sous l'onglet Configurer, puis continuez l'approvisionnement comme vous le feriez pour n'importe quel 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 effectuée automatiquement pour chaque instance que vous provisionnez. Le support Morpheus fournit des instructions pour afficher les sauvegardes, créer une sauvegarde d'instance et créer une sauvegarde de serveur.

thelefty07
la source
0

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

  1. Créez un 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 disposez des données des volumes sur votre répertoire de base, par exemple à, /home/mydatavous 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 <[email protected]>

WORKDIR /opt/data
ADD mydata .

Le reste des éléments est hérité de l'image de base. Vous pouvez maintenant pousser cette image vers le cloud docker et vos utilisateurs auront les données disponibles directement sur leurs conteneurs

Danielo515
la source
quel est l'intérêt d'utiliser un volume si vous allez simplement le cuire dans l'image éventuellement.
jiggunjer
@jiggunjer ayant un volume vous permet de remplacer les données dans le conteneur
Danielo515
Je peux aussi remplacer des données sans volume, en utilisant docker cp.
jiggunjer le
0

Le problème : vous voulez sauvegarder votre conteneur d'image AVEC les volumes de données qu'il contient, mais cette option n'est pas prête à l'emploi, le moyen simple et trivial serait de copier le chemin des volumes et de sauvegarder l'image docker 'recharger et lier les deux ensemble. mais cette solution semble être maladroite et non durable et maintenable - Vous auriez besoin de créer un travail cron qui rendrait ce flux à chaque fois.

Solution : Utilisation de dockup - Image Docker pour sauvegarder vos volumes de conteneur Docker et le télécharger sur s3 (Docker + Backup = dockup). dockup utilisera vos informations d'identification AWS pour créer un nouveau compartiment avec le nom de la variable d'environnement, obtiendra les volumes configurés et sera tarballé, gzippé, horodaté et téléchargé dans le compartiment S3.

Étapes :

  1. configurer le docker-compose.ymlet y attacher le env.txtfichier de configuration. Les données doivent être téléchargées dans un compartiment s3 sécurisé dédié et prêtes à être rechargées lors des exécutions DRP. afin de vérifier quel chemin de volumes pour configurer exécuter docker inspect <service-name>et localiser les volumes :

"Volumes": {"/ etc / service-example": {}, "/ service-example": {}},

  1. Modifiez le contenu du fichier de configuration env.txtet placez-le sur le chemin du projet:

    AWS_ACCESS_KEY_ID=<key_here>
    AWS_SECRET_ACCESS_KEY=<secret_here>
    AWS_DEFAULT_REGION=us-east-1
    BACKUP_NAME=service-backup
    PATHS_TO_BACKUP=/etc/service-example /service-example
    S3_BUCKET_NAME=docker-backups.example.com
    RESTORE=false
    
  2. Exécutez le conteneur Dockup

$ docker run --rm \
--env-file env.txt \
--volumes-from <service-name> \
--name dockup tutum/dockup:latest
  1. Vérifiez ensuite que votre bucket s3 contient les données pertinentes
avivamg
la source
-1

Il s'agit d'un moyen de sauvegarde de volume-dossier.
Si vous avez infra de registre docker, cette méthode est très utile.
Cela utilise le registre docker pour déplacer facilement le fichier zip.

#volume folder backup script. !/bin/bash

#common bash variables. set these variable before running scripts
REPO=harbor.otcysk.org:20443/levee
VFOLDER=/data/mariadb
TAG=mariadb1

#zip local folder for volume files
tar cvfz volume-backup.tar.gz $VFOLDER

#copy the zip file to volume-backup container.
#zip file must be in current folder.
docker run -d -v $(pwd):/temp --name volume-backup ubuntu \
       bash -c "cd / && cp /temp/volume-backup.tar.gz ."


#commit for pushing into REPO
docker commit volume-backup $REPO/volume-backup:$TAG

#check gz files in this container
#docker run --rm -it --entrypoint bash --name check-volume-backup \
        $REPO/volume-backup:$TAG

#push into REPO
docker push $REPO/volume-backup:$TAG

Dans un autre serveur

#pull the image in another server
docker pull $REPO/volume-backup:$TAG

#restore files in another server filesystem
docker run --rm -v $VFOLDER:$VFOLDER --name volume-backup $REPO/volume-backup:$TAG \
       bash -c "cd / && tar xvfz volume-backup.tar.gz"

Exécutez votre image qui utilise ce dossier de volume.
Vous pouvez créer facilement une image contenant à la fois une image d'exécution et un fichier zip de volume.
Mais je ne recommande pas pour diverses raisons (taille de l'image, commande de saisie, ..).

Myeongsik Joo
la source