web-dev-qa-db-fra.com

Comment déplacer des conteneurs Docker entre différents hôtes?

Je ne trouve pas le moyen de déplacer un conteneur en cours d'exécution d'un hôte à un autre.

Existe-t-il un moyen de transférer mes conteneurs dans des référentiels comme nous le faisons pour les images? Certaines données se trouvent donc dans des conteneurs, ce que je veux conserver avant de redéfinir la configuration.

67
Dinesh Reddy

Vous ne pouvez pas déplacer un conteneur de menu fixe en cours d'exécution d'un hôte à un autre.

Vous pouvez valider les modifications apportées au conteneur dans une image avec docker commit, déplacer l'image sur un nouvel hôte, puis démarrer un nouveau conteneur avec docker run. Cela préservera toutes les données créées par votre application dans le conteneur.

Nb: Il ne conserve pas les données stockées dans les volumes; vous devez déplacer manuellement les volumes de données vers un nouvel hôte.

39
larsks

sinon, si vous ne souhaitez pas utiliser Push vers un référentiel:

1) Exporter le conteneur dans une archive

     docker export <CONTAINER ID> > /home/export.tar

2) Déplacez votre archive vers une nouvelle machine

3) le réimporter

     cat /home/export.tar | docker import - some-name:latest
71
aholt

Ce qui a finalement fonctionné pour moi, après de nombreux manuels déroutants et des tutoriels déroutants, puisque Docker est évidemment au moment où j'écris à un aperçu des attentes exagérées , est la suivante:

  1. Enregistrez l'image du menu fixe dans une archive:
    docker save image_name > image_name.tar 
  2. copier sur une autre machine 
  3. sur cette autre machine de docker, exécutez la charge de docker de la manière suivante:
    cat image_name.tar | docker load

L'exportation et l'importation, comme proposé dans d'autres réponses, n'exportent pas les ports et les variables pouvant être nécessaires à l'exécution de votre conteneur. Et vous pourriez vous retrouver avec des choses comme "Aucune commande spécifiée" etc ... lorsque vous essayez de le charger sur une autre machine.

Donc, la différence entre enregistrer et exporter réside dans le fait que la commande save enregistre l’ensemble de l’image avec l’historique et les métadonnées, tandis que la commande export n’exporte que la structure des fichiers (sans historique ni métadonnées).

16

De la documentation Docker:

docker export n'exporte pas le contenu des volumes associés avec le conteneur. Si un volume est monté sur un fichier existant répertoire dans le conteneur, docker export exportera le contenu du répertoire sous-jacent, pas le contenu du volume. Référer vers Sauvegarder, restaurer ou migrer des données volumes dans le guide de l’utilisateur pour des exemples d’exportation de données dans un volume.

Autres outils externes: Pour déplacer un conteneur avec son volume de données associé, vous pouvez utiliser Flocker https://clusterhq.com/flocker/introduction/

14
Antonio De Marinis

J'ai essayé beaucoup de solutions pour cela, et c'est celle qui a fonctionné pour moi:

1.commit/save conteneur à la nouvelle image:

  1. ++ commit le conteneur:
    # arrêt docker
    # docker commit CONTAINER_NAME
    # docker save --output IMAGE_NAME.tar IMAGE_NAME: TAG


ps: "Notre conteneur CONTAINER_NAME a un volume monté dans '/ var/home'" (vous devez inspecter votre conteneur pour spécifier son chemin de volume: # docker inspecter CONTAINER_NAME)

  1. ++ enregistrer son volume: nous allons utiliser une image ubuntu pour le faire.
    # mkdir backup
    # docker run --rm --volumes-from CONTAINER_NAME -v $ {pwd}/backup:/backup ubuntu bash -c “cd/var/home && tar cvf /backup/volume_backup.tar.”.

Maintenant, lorsque vous regardez $ {pwd}/backup, vous trouverez notre volume au format tar.
Jusqu'à présent, nous avons l'image de notre conatainer 'IMAGE_NAME.tar' et son volume 'volume_backup.tar'.

Maintenant, vous pouvez recréer le même ancien conteneur sur un nouvel hôte.

0
Houssam Ezzoukh

Utilisez ce script: https://github.com/ricardobranco777/docker-volumes.sh

Ceci conserve les données en volumes.

Exemple d'utilisation:

# Stop the container   
docker stop $CONTAINER

# Create a new image   
docker commit $CONTAINER $CONTAINER

# Save image
docker save -o $CONTAINER.tar $CONTAINER

# Save the volumes (use ".tar.gz" if you want compression)
docker-volumes.sh $CONTAINER save $CONTAINER-volumes.tar

# Copy image and volumes to another Host
scp $CONTAINER.tar $CONTAINER-volumes.tar $USER@$Host:

# On the other Host:
docker load -i $CONTAINER.tar
docker create --name $CONTAINER [<PREVIOUS CONTAINER OPTIONS>] $CONTAINER

# Load the volumes
docker-volumes.sh $CONTAINER load $CONTAINER-volumes.tar

# Start container
docker start $CONTAINER
0
Ricardo Branco