Comme décrit dans la documentation Docker sur l'utilisation des volumes, il existe le concept de conteneurs dits uniquement de données , qui fournissent un volume qui peut être monté dans plusieurs autres conteneurs, que le conteneur de données uniquement soit en cours d'exécution ou non.
En gros, cela semble génial. Mais il y a une chose que je ne comprends pas.
Ces volumes (qui ne sont pas explicitement mappés à un dossier sur l'hôte pour des raisons de portabilité, comme l'indique la documentation) sont créés et gérés par Docker dans un dossier interne sur l'hôte ( /var/docker/volumes/…
).
Supposons que j'utilise un tel volume, puis que je doive le migrer d'un hôte à un autre - comment porter le volume? AFAICS, il a un ID unique - puis-je simplement copier le volume et son conteneur de données uniquement sur un nouvel hôte? Comment savoir quels fichiers copier? Ou existe-t-il un support intégré à Docker que je n'ai pas encore découvert?
docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz
cela ne dépend pas des détails d'implémentation des volumes. Et importez les données avec tar sur la deuxième machine.Réponses:
La réponse officielle est disponible dans la section "Sauvegarder, restaurer ou migrer des volumes de données" :
SAUVEGARDE:
--rm
: retirer le conteneur à sa sortie--volumes-from DATA
: attacher aux volumes partagés par le conteneur DATA-v $(pwd):/backup
: bind monte le répertoire courant dans le conteneur; pour écrire le fichier tar dansbusybox
: une petite image plus simple - bonne pour une maintenance rapidetar cvf /backup/backup.tar /data
: crée un fichier tar non compressé de tous les fichiers du répertoire / dataRESTAURER:
la source
docker create
pour les conteneurs de données uniquement afin qu'ils ne soient pas démarrés. Voir l'exemple dans le off. documentation: docs.docker.com/userguide/dockervolumes/…/data
avec/var/lib/postgresql/data
, non ?docker exec
entrer), alors une simple commande esttail -f /dev/null
qui ne se terminera jamais, mais utilise des ressources minimales. Lorsque vous n'en aurez plus besoin,docker stop data-container
je le ferai pour vous. Les volumes restent pour les autres conteneurs.Vous pouvez exporter le volume vers tar et le transférer vers une autre machine. Et importez les données avec tar sur la deuxième machine. Cela ne dépend pas des détails d'implémentation des volumes.
la source
docker run -v /data-volume -name datacointainer busybox true
- vous pouvez l'exécuter n'importe où. Après avoir créé le conteneur de données, vous pouvez importer une archive tar comme expliqué dans la réponse.--cidfile=id.txt
comme paramètre d'exécution. L'ID du conteneur sera stocké dans le fichierid.txt
. J'ai mis à jour la réponse.docker run --rm
place dedocker run --cidfile ... ; docker rm
.En étendant la réponse officielle des documents Docker et la réponse principale ici , vous pouvez avoir les alias suivants dans votre .bashrc ou .zshrc
Notez que la sauvegarde est enregistrée dans
/tmp
, vous pouvez donc déplacer le fichier de sauvegarde qui y est enregistré entre les hôtes du docker.Il existe également deux paires d'alias de sauvegarde / restauration. L'un utilisant la compression et debian: jessie et d'autres sans compression mais avec busybox. Privilégiez l'utilisation de la compression si les fichiers à sauvegarder sont volumineux.
la source
Je vais ajouter ici un autre outil récent d'IBM qui est en fait conçu pour la migration de volume d'un hôte de conteneur à un autre. C'est un projet actuellement en cours. Ainsi, vous trouverez peut-être une version différente avec des fonctionnalités supplémentaires à l'avenir.
Cargo a été développé pour migrer les conteneurs d'un hôte à un autre avec leurs données avec un temps d'arrêt minimal. Cargo utilise les capacités de fédération de données du système de fichiers union pour créer une vue unifiée des données (principalement le système de fichiers racine) sur les hôtes source et cible. Cela permet à Cargo de démarrer un conteneur presque immédiatement (en quelques millisecondes) sur l'hôte cible lorsque les données du système de fichiers racine source sont copiées vers les hôtes cibles à la demande (en utilisant une partition de copie à l'écriture (COW) ) ou paresseux en arrière-plan (en utilisant rsync) .
Les points importants sont: - un
centralized
serveur gère le processus de migrationLe lien vers le projet est donné ici:
la source
Dans le cas où vos machines sont dans des VPC différents ou si vous souhaitez copier depuis / vers une machine locale (comme dans mon cas), vous pouvez utiliser dvsync que j'ai créé. C'est fondamentalement ngrok combiné avec
rsync
plus de SSH emballé dans deux petites images (les deux ~ 25 Mo). Tout d'abord, vous démarrez ledvsync-server
sur une machine à partir de laquelle vous souhaitez copier des données (vous aurez besoin duNGROK_AUTHTOKEN
qui peut être obtenu à partir du tableau de bord ngrok ):Ensuite, vous pouvez démarrer le
dvsync-client
sur la machine sur laquelle vous souhaitez copier les fichiers, en passant leDVSYNC_TOKEN
affiché par le serveur:Une fois la copie terminée, le client quittera. Cela fonctionne également avec Docker CLI, Compose, Swarm et Kubernetes.
la source