web-dev-qa-db-fra.com

Comment copier des images Docker d'un hôte à un autre sans utiliser de référentiel

Comment transférer une image Docker d'une machine à une autre sans utiliser de référentiel, privé ou public?

Je suis habitué à jouer et à créer ma propre image dans VirtualBox. Une fois celle-ci terminée, j'essaie de la déployer sur d'autres machines pour qu'elle soit réellement utilisée.

Comme il est basé sur une image propre (telle que Red Hat Linux), il ne peut pas être recréé à partir d'un fichier Docker.

Existe-t-il des commandes simples que je peux utiliser? Ou une autre solution?

Il semble que la sauvegarde/exportation puisse atteindre un objectif similaire, voir Quelle est la différence entre sauvegarder et exporter dans Docker?, et je préfère la commande save pour mon cas.

898
Larry Cai

Vous devrez enregistrer l'image Docker en tant que fichier tar:

docker save -o <path for generated tar file> <image name>

Copiez ensuite votre image sur un nouveau système à l'aide d'outils de transfert de fichiers classiques tels que cp ou scp. Après cela, vous devrez charger l'image dans Docker:

docker load -i <path to image tar file>

PS: Vous devrez peut-être Sudo toutes les commandes.

EDIT: Vous devez ajouter le nom de fichier (pas seulement le répertoire) avec -o, par exemple:

docker save -o c:/myfile.tar centos:16
1598
Daiwei

Transférer une image Docker via SSH, bzipper le contenu à la volée:

docker save <image> | bzip2 | \
     ssh user@Host 'bunzip2 | docker load'

C'est aussi une bonne idée de mettre pv au milieu du tuyau pour voir comment se passe le transfert:

docker save <image> | bzip2 | pv | \
     ssh user@Host 'bunzip2 | docker load'

(Plus d'infos sur pv: page d'accueil , page de manuel ).

446
kolypto

Pour enregistrer une image dans un chemin de fichier ou un emplacement NFS partagé, voir l'exemple suivant.

Obtenez l'image id en faisant:

Sudo docker images

Supposons que vous ayez une image avec l'id "matrice-données".

Enregistrez l'image avec l'identifiant:

Sudo docker save -o /home/matrix/matrix-data.tar matrix-data

Copiez l'image du chemin d'accès sur n'importe quel hôte. Importez maintenant dans votre installation Docker locale en utilisant:

Sudo docker load -i <path to copied image file>
78
Sohan

Commencez par enregistrer l’image Docker dans un fichier Zip:

docker save <docker image name> | gzip > <docker image name>.tar.gz

Chargez ensuite l'image exportée dans Docker à l'aide de la commande ci-dessous:

zcat <docker image name>.tar.gz | docker load
21
Damodaran

Courir

docker images

pour voir une liste des images sur l'hôte. Disons que vous avez une image appelée awesomesauce. Dans votre terminal, cd dans le répertoire dans lequel vous voulez exporter l'image. Maintenant, lancez:

docker save awesomesauce:latest > awesomesauce.tar

Copiez le fichier tar sur une clé USB ou autre, puis copiez-le sur le nouvel ordinateur hôte.

Maintenant, à partir du nouvel hôte, faites:

docker load < awesomesauce.tar

Maintenant, allez prendre un café et lisez Hacker News ...

20
Neil Girardi

Lorsque vous utilisez docker-machine, vous pouvez utiliser docker $(docker-machine config <mach1>) save <image> | docker $(docker-machine config <mach2>) load pour copier des images entre les machines mach1 et mach2.

Et bien sûr, vous pouvez aussi coller pv au milieu pour obtenir un indicateur de progression:

docker $(docker-machine config <mach1>) save <image> | pv | docker $(docker-machine config <mach2>) load.

Vous pouvez également omettre l’un des sous-shells docker-machine config pour utiliser votre hôte de docker par défaut actuel.

docker save <image> | docker $(docker-machine config <mach>) load pour copier l'image du docker-host actuel vers mach

ou 

docker $(docker-machine config <mach>) save <image> | docker load pour copier de mach vers l'hôte de docker actuel.

13
matlehmann

Pour une exportation aplatie du système de fichiers d'un conteneur, utilisez; 

docker export CONTAINER_ID > my_container.tar

Utilisez cat my_container.tar | docker import - pour importer ladite image.

Je suppose que vous devez enregistrer couchdb-cartridge qui a un identifiant d'image de 7ebc8510bc2c:

stratos@Dev-PC:~$ docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
couchdb-cartridge                      latest              7ebc8510bc2c        17 hours ago        1.102 GB
192.168.57.30:5042/couchdb-cartridge   latest              7ebc8510bc2c        17 hours ago        1.102 GB
ubuntu                                 14.04               53bf7a53e890        3 days ago          221.3 MB

Enregistrez l'image archiveName dans un fichier tar. Je vais utiliser le /media/sf_docker_vm/ pour enregistrer l'image.

stratos@Dev-PC:~$ docker save imageID > /media/sf_docker_vm/archiveName.tar

Copiez le fichier nom_archive.tar dans votre nouvelle instance Docker en utilisant la méthode qui convient dans votre environnement, par exemple FTP, SCP, etc.

Exécutez la commande docker load sur votre nouvelle instance Docker et spécifiez l'emplacement du fichier tar de l'image.

stratos@Dev-PC:~$ docker load < /media/sf_docker_vm/archiveName.tar

Enfin, exécutez la commande docker images pour vérifier que l’image est maintenant disponible.

stratos@Dev-PC:~$ docker images
REPOSITORY                             TAG        IMAGE ID         CREATED             VIRTUAL SIZE
couchdb-cartridge                      latest     7ebc8510bc2c     17 hours ago        1.102 GB
192.168.57.30:5042/couchdb-cartridge   latest     bc8510bc2c       17 hours ago        1.102 GB
ubuntu                                 14.04      4d2eab1c0b9a     3 days ago          221.3 MB

S'il vous plaît trouver ce post détaillé .

9
tk_

Pour transférer des images de votre installation Docker locale vers une machine virtuelle minikube:

docker save <image> | (eval $(minikube docker-env) && docker load)
7
Bryan Larsen

Toutes les autres réponses sont très utiles. Je viens de passer par le même problème et trouver un moyen facile avec docker machine scp.

Depuis Docker Machine v0.3.0, scp a été introduit pour copier des fichiers d’un ordinateur Docker à un autre. Cela est très pratique si vous souhaitez copier un fichier de votre ordinateur local vers un ordinateur Docker distant tel que AWS EC2 ou Digital Ocean, car Docker Machine s'occupe des informations d'identification SSH pour vous.

  1. Enregistrez vos images en utilisant docker save comme:

    docker save -o docker-images.tar app-web
    
  2. Copier des images avec docker-machine scp

    docker-machine scp ./docker-images.tar remote-machine:/home/ubuntu
    

Supposons que votre machine Docker distante est remote-machine et que le répertoire dans lequel vous souhaitez placer le fichier tar est /home/ubuntu.

  1. Charger l'image de Docker

    docker-machine ssh remote-machine Sudo docker load -i docker-images.tar
    
7
Peng

docker-Push-ssh est un utilitaire de ligne de commande uniquement pour ce scénario.

Il configure un registre Docker privé temporaire sur le serveur, établit un tunnel SSH à partir de votre hôte local, pousse votre image, puis nettoie après.

L'avantage de cette approche par rapport à docker save (au moment de la rédaction de cet article, la plupart des réponses utilisent cette méthode) est que seules les nouvelles couches sont placées sur le serveur, ce qui accélère considérablement le téléchargement.

Souvent, utiliser un registre intermédiaire comme dockerhub est indésirable et fastidieux.

https://github.com/coherenceapi/docker-Push-ssh

Installer:

pip install docker-Push-ssh

Exemple:

docker-Push-ssh -i ~/my_ssh_key [email protected] my-docker-image

Le plus gros inconvénient est que vous devez ajouter manuellement votre hôte local à la configuration insecure_registries de Docker. Exécutez l'outil une fois et cela vous donnera une erreur informative:

Error Pushing Image: Ensure localhost:5000 is added to your insecure registries.
More Details (OS X): https://stackoverflow.com/questions/32808215/where-to-set-the-insecure-registry-flag-on-mac-os

Où dois-je définir le drapeau '--insecure-registry' sur Mac OS?

3
brthornbury

Vous pouvez utiliser sshfs:

$ sshfs user@ip:/<remote-path> <local-mount-path>
$ docker save <image-id> > <local-mount-path>/myImage.tar
0
Chu

Je veux déplacer toutes les images avec des balises.

```
OUT=$(docker images --format '{{.Repository}}:{{.Tag}}')
OUTPUT=($OUT)
docker save $(echo "${OUTPUT[*]}") -o /dir/images.tar
``` 

Explication:

La première OUT obtient toutes les balises mais séparées par de nouvelles lignes. La seconde OUTPUT obtient toutes les balises d'un tableau. La troisième $(echo "${OUTPUT[*]}") place toutes les balises pour une seule commande docker save de sorte que toutes les images se trouvent dans un seul tar.

De plus, cela peut être compressé avec gzip. Sur la cible, lancez:

tar xvf images.tar.gz -O | docker load

L'option -O dans tar place le contenu sur stdin qui peut être récupéré par docker load.

0
Vikram