Comment copier des images Docker d'un hôte à un autre sans utiliser un dépôt

Comment transférer une image Docker d'une machine à une autre sans utiliser un dépôt, privé ou public?

j'ai l'habitude de jouer et de créer ma propre image dans VirtualBox, et quand elle est terminée, j'essaie de la déployer sur d'autres machines pour une utilisation réelle.

Puisqu'il est basé sur une image propre (comme Red Hat Linux), il ne peut pas être recréé à partir d'un fichier Dockerfile.

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

Il semble enregistrer/exporter peut atteindre un but similaire, voir Quelle est la différence entre l'enregistrement et l'exportation dans le Panneau? , et je préfère la commande save pour mon cas.

778
demandé sur Peter Mortensen 2014-05-29 17:57:18

16 réponses

vous aurez besoin de sauvegarder l'image du Docker dans un fichier tar:

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

puis copiez votre image dans un nouveau système avec des outils de transfert de fichiers réguliers 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 pouvez avoir besoin de sudo toutes les commandes.

1384
répondu Daiwei 2018-08-14 17:11:53

le Transfert d'une image Docker via SSH, bzipping 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 va le transfert:

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

(Plus d'info à propos de pv : page d'accueil , l'homme page ).

399
répondu kolypto 2018-09-22 15:08:59

pour sauvegarder une image sur un chemin de fichier ou un emplacement NFS partagé, voir l'exemple suivant.

obtenir le code d'identification d'image en faisant:

sudo docker images

dites que vous avez une image avec un id "matrix-data".

Enregistrer l'image avec l'id:

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

Copiez l'image à partir du chemin vers n'importe quel hôte. Maintenant, importez dans votre installation Docker locale en utilisant:

sudo docker load -i <path to copied image file>
75
répondu Sohan 2018-08-14 17:18:54

sauvegardez D'abord l'image du Docker dans un fichier zip:

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

ensuite, chargez L'image exportée vers Docker en utilisant la commande suivante:

zcat <docker image name>.tar.gz | docker load
19
répondu Damodaran 2018-08-14 17:22:24

Exécuter

docker images

pour voir la liste des images sur l'hôte. Disons que vous avez une image appelée awesomesauce . Dans votre terminal, cd vers le répertoire où 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 du nouvel hôte font:

docker load < awesomesauce.tar

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

13
répondu Neil Girardi 2018-08-14 17:24:00

Pour aplatie à l'exportation d'un conteneur de système de fichiers, utilisez;

docker export CONTAINER_ID > my_container.tar

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

12
répondu Panagiotis Moustafellos 2016-01-07 14:32:32

lorsque vous utilisez docker-machine, vous pouvez faire 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 progrès:

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 Docker-host par défaut.

docker save <image> | docker $(docker-machine config <mach>) load pour copier l'image du courant docker-hôte mach

ou

docker $(docker-machine config <mach>) save <image> | docker load copier mach actuels docker-hôte.

11
répondu matlehmann 2016-10-14 09:53:06

je suppose que vous devez sauvegarder couchdb-cartridge qui a un id 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

Sauvegardez l'image archiveName dans un fichier tar. J'utiliserai le /media/sf_docker_vm/ pour sauvegarder l'image.

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

Copiez l'archive.fichier tar de votre nouveau menu fixe instance à l'aide de n'importe quelle méthode fonctionne dans votre environnement, par exemple FTP , SCP , etc.

lancez la commande docker load sur votre nouveau Docker instance et spécifier l'emplacement du fichier image tar.

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

enfin, lancez 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

vous trouverez ce poste détaillée .

8
répondu tk_ 2018-08-14 17:14:17

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

depuis Docker Machine v0.3.0, scp a été introduit pour copier des fichiers d'une machine Docker à une autre. C'est très pratique si vous voulez copier un fichier de votre ordinateur local vers une machine de Docker à distance comme AWS EC2 ou Digital Ocean parce que la Machine de Docker prend soin des informations d'identification SSH pour vous.

  1. vous Sauver des images à l'aide de docker save comme:

    docker save -o docker-images.tar app-web
    
  2. copier des images en utilisant docker-machine scp

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

supposez que votre machine Docker distante est remote-machine et que le répertoire que vous voulez que le fichier tar soit est /home/ubuntu .

  1. Charger l'image Docker

    docker-machine ssh remote-machine sudo docker load -i docker-images.tar
    
6
répondu Peng 2018-08-14 17:20:26

pour transférer des images de votre installation Docker locale vers une VM minikube:

docker save <image> | (eval $(minikube docker-env) && docker load)
6
répondu Bryan Larsen 2018-08-14 18:01:18

vous pouvez utiliser sshfs :

$ sshfs user@ip:/<remote-path> <local-mount-path>
$ docker save <image-id> > <local-mount-path>/myImage.tar
0
répondu Chu 2018-05-04 03:41:10

je veux déplacer toutes les images avec des tags.

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

explication:

Première OUT obtient toutes les balises, mais séparés par de nouvelles lignes. Deuxième OUTPUT obtient toutes les balises dans un tableau. Le troisième $(echo "${OUTPUT[*]}") place toutes les balises pour une seule commande docker save de sorte que toutes les images soient dans un seul tar.

en outre, cela peut être zippé en utilisant gzip. Sur la cible, exécutez:

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

L'option -O de tar met du contenu sur stdin qui peut être saisi par docker load .

0
répondu Vikram 2018-08-06 21:01:06

c'est ainsi que vous pouvez déplacer des images Docker entre deux registres/dépôts distants. Il fonctionne avec la version 1.10.2 de Docker, build c3959b1.

docker pull source-registry.com/myProject/myImageName:1.0.0
docker tag source-registry.com/myProject/myImageName:1.0.0 target-remote-registry.com/myProject/myImageName:1.0.0
docker push target-remote-registry.com/myProject/myImageName:1.0.0

c'est une méthode pratique si vous voulez migrer vos images vers un service AWS ECS/ECR.

0
répondu maestr0 2018-08-14 17:21:13

docker-push-ssh est un utilitaire de ligne de commande juste pour ce scénario.

il met en place un registre temporaire de Dockers privés sur le serveur, établit un tunnel SSH à partir de votre serveur local, repousse votre image, puis nettoie après lui-même.

l'avantage de cette approche par rapport à docker save (au moment de la rédaction de la plupart des réponses utilisent cette méthode) est que seules les nouvelles couches sont poussées vers le serveur, ce qui entraîne un téléchargement beaucoup plus rapide.

souvent utiliser un registre intermédiaire comme dockerhub est indésirable, et encombrant.

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

Installation:

pip install docker-push-ssh

exemple:

docker-push-ssh -i ~/my_ssh_key username@myserver.com my-docker-image

la plus grande mise en garde est que vous devez ajouter manuellement votre hébergeur local à la configuration insecure_registries de Docker. Exécutez l'outil une fois et il vous donnera une erreur d'information:

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 mettre le drapeau '--unsafe-registry' sur Mac OS?

0
répondu brthornbury 2018-09-17 18:59:54

tout d'abord, les images Docker ( images Docker ) sont accessibles via le hub D'images Docker (ou utilisez la méthode précédente pour exporter). Par ailleurs, si vous cherchez un moyen de déplacer ou de copier un conteneur Docker ( docker ps-a ). La solution possible est d'utiliser la commande suivante:

docker container export [options] CONTAINER ID -o given-name.tar

par exemple:

docker ps -a

Sample output

docker container export cf54f5423a66 -o cf54f5423a66.tar

En faisant cela, vous êtes en mesure de conserver les modifications dans votre prochain déploiement. Pour plus d'informations, veuillez vous référer à la page the Docker documentation .

-1
répondu Esmaeil Mirzaee 2018-09-17 18:57:21

je pense que la meilleure variante serait de s'inscrire à Docker Hub et de pousser l'image là.

la première partie de votre nom d'image (avant la barre oblique) doit correspondre à votre surnom sur Docker Hub, la deuxième partie est votre nom d'application désiré et que la balise (version).

résultat: brillance643 / nagios: finalv

résultat: vous pourrez accéder à votre image juste à côté de

$docker run -ti -d brilliance643/nagios:finalv

de n'importe quelle partie de l'univers.

-4
répondu Mykola Pelyp 2018-05-03 10:41:09