web-dev-qa-db-ger.com

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

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

Ich bin es gewohnt, in VirtualBox ein eigenes Image zu spielen und zu erstellen, und wenn es fertig ist, versuche ich, es auf anderen Computern bereitzustellen, um es wirklich zu nutzen.

Da es auf einem eigenen Image (wie Red Hat Linux) basiert, kann es nicht aus einem Dockerfile neu erstellt werden.

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

Es scheint, dass Speichern/Export einen ähnlichen Zweck erfüllen kann, siehe Was ist der Unterschied zwischen Speichern und Exportieren in Docker?, und ich bevorzuge den Befehl save für meinen Fall.

898
Larry Cai

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

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

Kopieren Sie dann Ihr Image mit regulären Dateiübertragungswerkzeugen wie cp oder scp auf ein neues System. Danach müssen Sie das Image in Docker laden:

docker load -i <path to image tar file>

PS: Möglicherweise müssen Sie Sudo alle Befehle eingeben.

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

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

Übertragen eines Docker-Images über SSH, wobei der Inhalt "on the fly" umgeleitet wird:

docker save <image> | bzip2 | \
     ssh [email protected] 'bunzip2 | docker load'

Es ist auch eine gute Idee, pv in die Mitte der Pipe zu setzen, um zu sehen, wie die Übertragung verläuft:

docker save <image> | bzip2 | pv | \
     ssh [email protected] 'bunzip2 | docker load'

(Weitere Informationen zu pv: Homepage , Manpage ).

446
kolypto

Um ein Image in einem beliebigen Dateipfad oder in einem freigegebenen NFS-Bereich zu speichern, siehe folgendes Beispiel.

Rufen Sie die Bild-ID ab, indem Sie Folgendes tun:

Sudo docker images

Angenommen, Sie haben ein Bild mit der ID "Matrix-Daten".

Speichern Sie das Bild mit der ID:

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

Kopieren Sie das Bild aus dem Pfad auf einen beliebigen Host. Importieren Sie jetzt in Ihre lokale Docker-Installation mit:

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

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
21
Damodaran

Lauf

docker images

um eine Liste der Bilder auf dem Host anzuzeigen. Nehmen wir an, Sie haben ein Bild namens awesomesauce. In Ihrem Terminal cd in das Verzeichnis, in das Sie das Image exportieren möchten. Jetzt ausführen:

docker save awesomesauce:latest > awesomesauce.tar

Kopieren Sie die tar-Datei auf ein USB-Laufwerk oder ein anderes Laufwerk und kopieren Sie sie dann auf den neuen Host-Computer.

Jetzt vom neuen Host aus:

docker load < awesomesauce.tar

Jetzt einen Kaffee trinken und lesen Hacker News ...

20
Neil Girardi

Bei Verwendung von Docker-Maschinen können Sie Bilder zwischen Maschinen mach1 Und mach2 Kopieren mit:

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

Und natürlich können Sie auch pv in die Mitte stecken, um eine Fortschrittsanzeige zu erhalten:

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

Sie können auch eine der Unterschalen docker-machine config Weglassen, um Ihren aktuellen Standard-Docker-Host zu verwenden.

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

bild vom aktuellen Docker-Host nach mach kopieren

oder

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

kopieren von mach auf den aktuellen Docker-Host.

14
matlehmann

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

docker export CONTAINER_ID > my_container.tar

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

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

[email protected]:~$ 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 Bildarchivname in einer TAR-Datei. Ich werde den /media/sf_docker_vm/ verwenden, um das Bild zu speichern.

[email protected]:~$ docker save imageID > /media/sf_docker_vm/archiveName.tar

Kopieren Sie die Datei archiveName.tar in Ihre neue Docker-Instanz. Verwenden Sie dabei eine beliebige Methode in Ihrer Umgebung, z. B. FTP, SCP usw.

Führen Sie den Befehl docker load in Ihrer neuen Docker-Instanz aus und geben Sie den Speicherort der Bild-Tar-Datei an.

[email protected]:~$ docker load < /media/sf_docker_vm/archiveName.tar

Führen Sie schließlich den Befehl docker images aus, um zu prüfen, ob das Bild jetzt verfügbar ist.

[email protected]:~$ 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 diese ausführliche Post .

9
tk_

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

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

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

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

  1. Speichern Sie Ihre Bilder mit docker save wie:

    docker save -o docker-images.tar app-web
    
  2. Bilder kopieren mit docker-machine scp

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

Angenommen, Ihre Remote-Docker-Maschine ist remote-machine und das Verzeichnis, in dem sich die tar-Datei befinden soll, ist /home/ubuntu.

  1. Laden Sie das Docker-Image

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

docker-Push-ssh ist ein Befehlszeilenprogramm nur für dieses Szenario.

Es richtet eine temporäre private Docker-Registrierung auf dem Server ein, erstellt einen SSH-Tunnel von Ihrem localhost, überträgt Ihr Image und bereinigt sich danach.

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

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

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

Installieren:

pip install docker-Push-ssh

Beispiel:

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

Der größte Nachteil ist, dass Sie Ihren localhost manuell zur insecure_registries-Konfiguration von Docker 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): https://stackoverflow.com/questions/32808215/where-to-set-the-insecure-registry-flag-on-mac-os

Wo sollte ich unter Mac OS das Flag "--insecure-registry" setzen?

3
brthornbury

Sie können sshfs verwenden:

$ sshfs [email protected]:/<remote-path> <local-mount-path>
$ docker save <image-id> > <local-mount-path>/myImage.tar
0
Chu

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 erhält OUT alle Tags, jedoch getrennt durch neue Zeilen. Zweitens OUTPUT ruft alle Tags in einem Array ab. Der dritte $(echo "${OUTPUT[*]}") setzt alle Tags für einen einzigen docker save-Befehl, sodass alle Bilder in einem einzigen Tar liegen.

Zusätzlich kann dieser mit gzip gepackt werden. Führen Sie das Ziel aus:

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

Die -O-Option für tar setzt den Inhalt auf stdin, den Sie mit docker load aufrufen können.

0
Vikram