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.
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
Ü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'
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>
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
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 ...
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.
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 .
So übertragen Sie Bilder von Ihrer lokalen Docker-Installation auf eine Minikube-VM:
docker save <image> | (eval $(minikube docker-env) && docker load)
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.
Speichern Sie Ihre Bilder mit docker save
wie:
docker save -o docker-images.tar app-web
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
.
Laden Sie das Docker-Image
docker-machine ssh remote-machine Sudo docker load -i docker-images.tar
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?
Sie können sshfs
verwenden:
$ sshfs [email protected]:/<remote-path> <local-mount-path>
$ docker save <image-id> > <local-mount-path>/myImage.tar
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.