Come copiare le immagini Docker da un host a un altro senza usare un repository


1375

Come posso trasferire un'immagine Docker da una macchina a un'altra senza usare un repository, non importa privato o pubblico?

Creo la mia immagine in VirtualBox e, quando è finito, provo a distribuire su altre macchine per un utilizzo reale.

Poiché è basato sulla mia immagine (come Red Hat Linux), non può essere ricreato da un file Docker. Il mio file docker non è facilmente trasportabile.

Ci sono semplici comandi che posso usare? O un'altra soluzione?

Risposte:


2312

Dovrai salvare l'immagine Docker come file tar:

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

Quindi copia l'immagine su un nuovo sistema con strumenti di trasferimento file regolari come cp, scpo rsync(preferito per file di grandi dimensioni). Successivamente dovrai caricare l'immagine in Docker:

docker load -i <path to image tar file>

PS: potresti aver bisogno di sudotutti i comandi.

EDIT: dovresti aggiungere il nome del file (non solo la directory) con -o, ad esempio:

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

27
Questa è la risposta migliore per le immagini .
Andy,

26
inoltre, è meglio utilizzare repo:tagcome riferimento dell'immagine anziché image id. Se usi image id, l'immagine caricata non manterrà il tag (e dovrai fare un altro passo per contrassegnare l'immagine).
Wisbucky,

1
Ho usato l'id dell'immagine invece del nome: tag Ora sono seduto qui, ho caricato l'immagine e ho un <none> per REPOSITORY e TAG. Qual è il modo giusto per riportare il nome e il tag? @wisbucky
Ulfhetnar il

3
Per taggare, prima identifica l'ID IMMAGINE usando docker images, quindi usa docker tag DESIREDIMAGEID mycompany/myreponame. Se il tuo ID immagine è 591de551d6e4, puoi abbreviare l'ID immagine:docker tag 59 mycompany/myreponame
Junior Mayhé


582

Trasferimento di un'immagine Docker tramite SSH, decompressione al volo del contenuto:

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

È anche una buona idea mettere pval centro del tubo per vedere come sta andando il trasferimento:

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

(Ulteriori informazioni su pv: home page , pagina man ).


19
Quando si utilizza la finestra mobile, è possibile eseguire la docker $(docker-machine config mach1) save <image> | docker $(docker-machine config mach2) loadcopia di immagini tra macchine mach1 e mach2 .
matlehmann,

5
@manojlds eval $(docker-machine env dev)è utile per la comunicazione generale con un singolo docker host ma non per la copia tra due macchine, poiché ciò comporta due diversi docker host / macchine docker.
matlehmann,

14
per fare questo al contrario (da remoto a locale):ssh target_server 'docker save image:latest | bzip2' | pv | bunzip2 | docker load
ThorSummoner,

2
C'è un modo per farlo quando la finestra mobile richiede sudo sul computer di destinazione? Ho provato (senza compressione) docker save my_img:v1 | ssh -t -t my_user@my_machine sudo docker load. Senza l'opzione "-t", sudo si lamenta di sudo: scusa, devi avere un tty per eseguire sudo ; con un "-t" è lo stesso messaggio perché ssh dice che lo pseudo-terminale non verrà allocato perché stdin non è un terminale. e infine, con due "-t", ottengo il contenuto del file tar (cioè l'immagine) sul mio terminale. Qualche idea?
fame

1
@JosefStark Ho dovuto aggiungere "Predefiniti: <nome utente di destinazione>! Requiretty" durante la modifica del file sudoers per interrompere il messaggio "Mi dispiace" da sudo. Non so quanta differenza faccia, ma metto anche tutto tra virgolette user @ host (quindi "[...] | ssh user @ host 'bunzip2 | sudo docker load'").
VirtualWolf,

99

Per salvare un'immagine in qualsiasi percorso di file o posizione NFS condivisa, vedere l'esempio seguente.

Ottieni l'id dell'immagine facendo:

sudo docker images

Supponi di avere un'immagine con ID "dati matrice".

Salva l'immagine con ID:

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

Copia l'immagine dal percorso su qualsiasi host. Ora importa nell'installazione Docker locale usando:

sudo docker load -i <path to copied image file>

34

Prima salva l'immagine Docker in un file zip:

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

Quindi caricare l'immagine esportata su Docker usando il comando seguente:

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

11
Per il caricamento, docker load < my-image.tar.gzè sufficiente. L'immagine viene decompressa automaticamente per gzip, bzip2 e xz.
Flusso

32

Correre

docker images

per visualizzare un elenco delle immagini sull'host. Supponiamo che tu abbia un'immagine chiamata awesomesauce . Nel tuo terminale, cdnella directory in cui vuoi esportare l'immagine. Ora esegui:

docker save awesomesauce:latest > awesomesauce.tar

Copia il file tar su una chiavetta USB o altro, quindi copialo sul nuovo computer host.

Ora dal nuovo host fai:

docker load < awesomesauce.tar

Ora vai a prendere un caffè e leggi Hacker News ...


4
Vale la pena notare che questo funzionerà solo se il salvataggio e il caricamento vengono eseguiti sullo stesso sistema operativo. Usa docker save [image] -o file.tare docker load -i file.tarper evitare questo!
Andreas Forslöw l'

docker save [image] -o file.tarsembra anche essere molto più veloce
ti7

19

Per un'esportazione semplificata del filesystem di un container, usare;

docker export CONTAINER_ID > my_container.tar

Utilizzare cat my_container.tar | docker import -per importare detta immagine.


9
lo sarà cat my_container.tar | docker import - my_container:newse importato localmente secondo cmd help
Larry Cai,

7
Questo è più per il backup di un container in esecuzione che per la distribuzione di un'immagine.
Kousha,

15

Quando si utilizza la finestra mobile, è possibile copiare immagini tra macchine mach1e mach2con:

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

E ovviamente puoi anche rimanere pvnel mezzo per ottenere un indicatore di progresso:

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

Puoi anche omettere una delle docker-machine configsotto-shell, per usare l'attuale docker-host predefinito.

docker save <image> | docker $(docker-machine config <mach>) load

per copiare l'immagine dall'attuale finestra mobile-host in mach

o

docker $(docker-machine config <mach>) save <image> | docker load

per copiare machdall'attuale docker-host.


10

Presumo che sia necessario salvare couchdb-cartridgeche ha un ID immagine di 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

Salvare l'immagine archiveName in un file tar. Userò il /media/sf_docker_vm/per salvare l'immagine.

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

Copiare il file archiveName.tar alla nuova istanza Docker usando qualsiasi metodo funziona nel vostro ambiente, per esempio FTP, SCPe così via

Esegui il docker loadcomando sulla tua nuova istanza Docker e specifica la posizione del file tar dell'immagine.

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

Infine, esegui il docker imagescomando per verificare che l'immagine sia ora disponibile.

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

Si prega di trovare questo post dettagliato .


10

Per trasferire immagini dall'installazione Docker locale su una VM minikube:

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

10

docker-push-ssh è un'utilità della riga di comando che ho creato proprio per questo scenario.

Imposta un registro Docker privato temporaneo sul server, stabilisce un tunnel SSH dal tuo host locale, invia l'immagine, quindi pulisce dopo se stesso.

Il vantaggio di questo approccio rispetto docker save(al momento della stesura della maggior parte delle risposte utilizza questo metodo) è che solo i nuovi layer vengono inviati al server, con un conseguente caricamento MOLTO più rapido.

Spesso l'uso di un registro intermedio come dockerhub è indesiderabile e ingombrante.

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

Installare:

pip install docker-push-ssh

Esempio:

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

Il più grande avvertimento è che devi aggiungere manualmente il tuo host locale alla insecure_registriesconfigurazione di Docker . Esegui lo strumento una volta e ti darà un errore informativo:

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

Dove devo impostare il flag '--insecure-register' su Mac OS?


1
Ho modificato la tua risposta per chiarire che l'utilità che stai raccomandando è stata creata da te. Vedi questa pagina , in particolare: "Pubblica risposte valide e pertinenti e se alcuni (ma non tutti) si verificano sul tuo prodotto o sito Web, va bene. Tuttavia, devi rivelare la tua affiliazione nelle tue risposte."
Louis,

8

Tutte le altre risposte sono molto utili. Ho appena attraversato lo stesso problema e ho trovato un modo semplice con docker machine scp.

Dalla Docker Machine v0.3.0, scp è stato introdotto per copiare i file da una macchina Docker a un'altra. Questo è molto comodo se vuoi copiare un file dal tuo computer locale su una macchina Docker remota come AWS EC2 o Digital Ocean perché Docker Machine si prende cura delle credenziali SSH per te.

  1. Salva le tue immagini usando docker savecome:

    docker save -o docker-images.tar app-web
    
  2. Copia le immagini usando docker-machine scp

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

Supponiamo che la tua macchina Docker remota sia remote-machinee la directory in cui vuoi che sia il file tar /home/ubuntu.

  1. Carica l'immagine Docker

    docker-machine ssh remote-machine sudo docker load -i docker-images.tar
    

5
perché non solo 'scp <source> <remote>'?
Tamas Kalman,

3

Voglio spostare tutte le immagini con i tag.

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

Spiegazione:

Prima OUTottiene tutti i tag ma separati con nuove linee. In secondo luogo OUTPUTottiene tutti i tag in un array. Terzo $(echo "${OUTPUT[*]}")mette tutti i tag per un singolo docker savecomando in modo che tutte le immagini siano in un singolo tar.

Inoltre, questo può essere zippato usando gzip. Sulla destinazione, esegui:

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

-Oopzione per tarmettere contenuti su stdin che possono essere catturati da docker load.


2

Puoi usare sshfs:

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

1

Script per eseguire la funzione di salvataggio e caricamento Docker (provato e testato):

Docker Salva:

#!/bin/bash

#files will be saved in the dir 'Docker_images'
mkdir Docker_images
cd Docker_images
directory=`pwd`
c=0
#save the image names in 'list.txt'
doc= docker images | awk '{print $1}' > list.txt
printf "START \n"
input="$directory/list.txt"
#Check and create the image tar for the docker images
while IFS= read -r line
do
     one=`echo $line | awk '{print $1}'`
     two=`echo $line | awk '{print $1}' | cut -c 1-3`
     if [ "$one" != "<none>" ]; then
             c=$((c+1))
             printf "\n $one \n $two \n"
             docker save -o $two$c'.tar' $one
             printf "Docker image number $c successfully converted:   $two$c \n \n"
     fi
done < "$input"

Carico Docker:

#!/bin/bash

cd Docker_images/
directory=`pwd`
ls | grep tar > files.txt
c=0
printf "START \n"
input="$directory/files.txt"
while IFS= read -r line
do
     c=$((c+1))
     printf "$c) $line \n"
     docker load -i $line
     printf "$c) Successfully created the Docker image $line  \n \n"
done < "$input"

0

È possibile utilizzare un one-liner con DOCKER_HOSTvariabile:

docker save app:1.0 | gzip | DOCKER_HOST=ssh://user@remotehost docker load
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.