So kopieren Sie Docker-Images von einem Host auf einen anderen, ohne ein Repository zu verwenden

1374

Wie übertrage ich ein Docker-Image von einem Computer auf einen anderen, ohne ein Repository zu verwenden, egal ob privat oder öffentlich?

Ich erstelle mein eigenes Image in VirtualBox, und wenn es fertig ist, versuche ich, es auf anderen Computern bereitzustellen, um es wirklich nutzen zu können.

Da es auf meinem eigenen Image basiert (wie Red Hat Linux), kann es nicht aus einer Docker-Datei neu erstellt werden. Meine Docker-Datei ist nicht einfach zu portieren.

Gibt es einfache Befehle, die ich verwenden kann? Oder eine andere Lösung?

Larry Cai
quelle

Antworten:

2308

Sie müssen das Docker-Image als TAR-Datei speichern:

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

Kopieren Sie dann Ihr Bild auf ein neues System mit regelmäßigen Dateitransfer - Tool wie cp, scpoder rsync(für große Dateien bevorzugt). Danach müssen Sie das Image in Docker laden:

docker load -i <path to image tar file>

PS: Möglicherweise müssen Sie sudoalle Befehle ausführen.

BEARBEITEN: Sie sollten den Dateinamen (nicht nur das Verzeichnis) mit -o hinzufügen, zum Beispiel:

docker save -o c:/myfile.tar centos:16
Daiwei
quelle
27
Dies ist die bessere Antwort für Bilder .
Andy
26
Außerdem ist es besser, repo:tagals Bildreferenz zu verwenden, als image id. Wenn Sie verwenden image id, behält das geladene Bild das Tag nicht bei (und Sie müssen einen weiteren Schritt ausführen, um das Bild zu markieren).
wisbucky
1
Ich habe die Bild-ID anstelle des Namens verwendet: tag Jetzt sitze ich hier, habe das Bild geladen und habe eine <keine> für REPOSITORY und TAG. Was ist der richtige Weg, um den Namen und das Tag zurückzubringen? @wisbucky
Ulfhetnar
3
Identifizieren Sie zum Markieren zuerst die BILD-ID mit docker imagesund verwenden Sie dann docker tag DESIREDIMAGEID mycompany/myreponame. Wenn Ihre Bild-ID 591de551d6e4 ist, können Sie die Bild-ID abkürzen:docker tag 59 mycompany/myreponame
Junior Mayhé
@AndiJay Schauen Sie sich an, wie Docker-Bilder von einem Host auf einen anderen kopiert werden.
duct_tape_coder
582

Übertragen eines Docker-Bildes über SSH, Bzippen des Inhalts im laufenden Betrieb:

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

Es ist auch eine gute Idee, pvin die Mitte des Rohrs zu setzen, um zu sehen, wie die Übertragung verläuft:

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

(Weitere Informationen zu pv: Homepage , Manpage ).

kolypto
quelle
19
Bei Verwendung der Docker-Maschine können Sie docker $(docker-machine config mach1) save <image> | docker $(docker-machine config mach2) loadBilder zwischen den Maschinen mach1 und mach2 kopieren .
Matlehmann
5
@manojlds eval $(docker-machine env dev)eignet sich für die allgemeine Kommunikation mit einem einzelnen Docker-Host, jedoch nicht zum Kopieren zwischen zwei Computern, da zwei verschiedene Docker-Hosts / Docker-Computer beteiligt sind.
Matlehmann
14
ssh target_server 'docker save image:latest | bzip2' | pv | bunzip2 | docker load
Um
2
Gibt es eine Möglichkeit, dies zu tun, wenn Docker auf dem Zielcomputer Sudo benötigt? Ich habe es versucht (ohne Komprimierung) docker save my_img:v1 | ssh -t -t my_user@my_machine sudo docker load. Ohne den Schalter "-t" beschwert sich sudo über sudo: Entschuldigung, Sie müssen eine tty haben, um sudo ausführen zu können . mit einem "-t" ist es die gleiche Nachricht, weil ssh sagt, dass Pseudo-Terminal nicht zugewiesen wird, weil stdin kein Terminal ist. und schließlich erhalte ich mit zwei "-t" den Inhalt der TAR-Datei (dh des Bildes) auf meinem Terminal. Irgendwelche Ideen?
Hunger
1
@JosefStark Ich musste beim Bearbeiten der sudoers-Datei "Defaults: <Zielbenutzername>! Requetty" hinzufügen, um die "Sorry" -Nachricht von sudo zu stoppen. Ich weiß nicht, wie viel Unterschied es macht, aber ich setze auch alles nach dem Benutzer @ Host in Anführungszeichen (also "[...] | ssh Benutzer @ Host 'bunzip2 | sudo docker load'").
VirtualWolf
99

Um ein Bild in einem beliebigen Dateipfad oder an einem freigegebenen NFS-Ort zu speichern, sehen Sie sich das folgende Beispiel an.

Holen Sie sich die Bild-ID, indem Sie Folgendes tun:

sudo docker images

Angenommen, Sie haben ein Bild mit der ID "Matrixdaten".

Speichern Sie das Bild mit der ID:

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

Kopieren Sie das Bild vom Pfad auf einen beliebigen Host. Importieren Sie nun in Ihre lokale Docker-Installation mit:

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

Speichern Sie zuerst das Docker-Image in einer Zip-Datei:

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

Laden Sie dann das exportierte Bild mit dem folgenden Befehl in Docker:

zcat <docker image name>.tar.gz | docker load
Damodaran
quelle
11
Zum Laden docker load < my-image.tar.gzist ausreichend. Das Bild wird automatisch für gzip, bzip2 und xz dekomprimiert.
Flux
32

Lauf

docker images

um eine Liste der Bilder auf dem Host zu sehen. Angenommen , Sie haben ein Bild namens awesomesauce . In Ihrem Terminal cdin das Verzeichnis, in das Sie das Bild exportieren möchten. Führen Sie jetzt aus:

docker save awesomesauce:latest > awesomesauce.tar

Kopieren Sie die TAR-Datei auf ein USB-Stick oder was auch immer und kopieren Sie sie dann auf den neuen Host-Computer.

Jetzt vom neuen Host machen:

docker load < awesomesauce.tar

Jetzt geh auf einen Kaffee und lies Hacker News ...

Neil Girardi
quelle
4
Bemerkenswert ist hier, dass dies nur funktioniert, wenn Speichern und Laden auf demselben Betriebssystem ausgeführt werden. Verwenden Sie docker save [image] -o file.tarund docker load -i file.tarum dies zu vermeiden!
Andreas Forslöw
docker save [image] -o file.tarscheint auch wild schneller zu sein
ti7
19

Verwenden Sie für einen reduzierten Export des Dateisystems eines Containers:

docker export CONTAINER_ID > my_container.tar

Verwenden Sie cat my_container.tar | docker import -diese Option, um das Bild zu importieren.

Panagiotis Moustafellos
quelle
9
es soll sein, cat my_container.tar | docker import - my_container:newwenn vor Ort nach cmd Hilfe importiert
Larry Cai
7
Dies dient eher zum Sichern eines laufenden Containers als zum Bereitstellen eines Images.
Kousha
15

Wenn Sie Docker-Maschine verwenden, können Sie Bilder zwischen Maschinen kopieren mach1und mach2mit:

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

Und natürlich können Sie auch pvin der Mitte bleiben , um einen Fortschrittsindikator zu erhalten:

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

Sie können auch eine der docker-machine configSub-Shells weglassen , um Ihren aktuellen Standard-Docker-Host zu verwenden.

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

um das Bild vom aktuellen Docker-Host zu kopieren mach

oder

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

zum Kopieren von machauf den aktuellen Docker-Host.

matlehmann
quelle
10

Ich couchdb-cartridgegehe davon aus, dass Sie speichern müssen, die eine Bild-ID von 7ebc8510bc2c hat:

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

Speichern Sie das Bild archiveName in einer TAR-Datei. Ich werde das verwenden /media/sf_docker_vm/, um das Bild zu speichern.

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

Kopieren Sie die Datei auf Ihre archiveName.tar neue Docker Instanz Egal welche Methode funktioniert in Ihrer Umgebung unter Verwendung von , zum Beispiel FTP, SCPusw.

Führen Sie den docker loadBefehl auf Ihrer neuen Docker-Instanz aus und geben Sie den Speicherort der Image-Tar-Datei an.

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

Führen Sie abschließend den docker imagesBefehl aus, um zu überprüfen, ob das Bild jetzt verfügbar ist.

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

Bitte finden Sie diesen ausführlichen Beitrag .

tk_
quelle
10

So übertragen Sie Bilder von Ihrer lokalen Docker-Installation auf eine Minikube-VM:

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

docker-push-ssh ist ein Befehlszeilenprogramm, das ich nur für dieses Szenario erstellt habe.

Es richtet eine temporäre private Docker-Registrierung auf dem Server ein, richtet einen SSH-Tunnel von Ihrem lokalen Host aus ein, pusht Ihr Image und bereinigt dann nach sich selbst.

Der Vorteil dieses Ansatzes gegenüber docker save(zum Zeitpunkt des Schreibens verwenden die meisten Antworten diese Methode) besteht darin, dass nur die neuen Ebenen auf den Server übertragen werden, was zu einem VIEL schnelleren Upload führt.

Die Verwendung einer Zwischenregistrierung wie Dockerhub ist häufig unerwünscht und umständlich.

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

Installieren:

pip install docker-push-ssh

Beispiel:

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

Die größte Einschränkung besteht darin, dass Sie Ihren lokalen Host manuell zur Docker- insecure_registriesKonfiguration hinzufügen müssen . Führen Sie das Tool einmal aus und Sie erhalten einen informativen Fehler:

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

Wo soll ich unter Mac OS das Flag '--insecure-registry' setzen?

brthornbury
quelle
1
Ich habe Ihre Antwort bearbeitet, um zu verdeutlichen, dass das von Ihnen empfohlene Dienstprogramm von Ihnen erstellt wurde. Siehe diese Seite , insbesondere: "Veröffentlichen Sie gute, relevante Antworten. Wenn sich einige (aber nicht alle) auf Ihr Produkt oder Ihre Website beziehen, ist dies in Ordnung. Sie müssen jedoch Ihre Zugehörigkeit in Ihren Antworten offenlegen."
Louis
8

Alle anderen Antworten sind sehr hilfreich. Ich habe gerade das gleiche Problem durchlaufen und einen einfachen Weg gefunden docker machine scp.

Seit Docker Machine v0.3.0 wurde scp eingeführt, um Dateien von einem Docker-Computer auf einen anderen zu kopieren. Dies ist sehr praktisch, wenn Sie eine Datei von Ihrem lokalen Computer auf einen Remote-Docker-Computer wie AWS EC2 oder Digital Ocean kopieren möchten, da Docker Machine die SSH-Anmeldeinformationen für Sie verwaltet.

  1. Speichern Sie Ihre Bilder mit docker save:

    docker save -o docker-images.tar app-web
    
  2. Kopieren Sie Bilder mit Docker-Machine SCP

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

Angenommen, Ihr Remote-Docker-Computer befindet sich in remote-machinedem Verzeichnis, in dem sich die TAR-Datei befinden soll /home/ubuntu.

  1. Laden Sie das Docker-Image

    docker-machine ssh remote-machine sudo docker load -i docker-images.tar
    
Peng
quelle
5
warum nicht einfach 'scp <source> <remote>'?
Tamas Kalman
3

Ich möchte alle Bilder mit Tags verschieben.

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

Erläuterung:

Zuerst werden OUTalle Tags abgerufen, aber durch neue Zeilen getrennt. Zweitens OUTPUTerhält alle Tags in einem Array. Drittens werden $(echo "${OUTPUT[*]}")alle Tags für einen einzelnen docker saveBefehl eingefügt, sodass sich alle Bilder in einem einzigen Teer befinden.

Zusätzlich kann dies mit gzip komprimiert werden. Führen Sie am Ziel Folgendes aus:

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

-OOption, um tarInhalte auf stdin zu setzen, die von abgerufen werden können docker load.

Vikram
quelle
2

Sie können verwenden sshfs:

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

Skript zum Ausführen der Docker-Funktion zum Speichern und Laden (bewährt):

Docker Speichern:

#!/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"

Docker laden:

#!/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"
Syed Faraz Umar
quelle
0

Sie können einen Einzeiler mit DOCKER_HOSTVariablen verwenden:

docker save app:1.0 | gzip | DOCKER_HOST=ssh://user@remotehost docker load
Vitalets
quelle