Da Docker-Container sozusagen kleine Software-Boxen sind, können Sie sie kopieren und von Computer zu Computer verschieben. Dies wird jedoch nicht oft diskutiert, wahrscheinlich weil größere Organisationen ihre eigenen Repositorys einrichten, in denen sie ihre eigenen Images anpassen und nach Belieben auf ihren Servern verteilen können. Sie sollten sich jedoch nicht die Mühe machen müssen, eine eigene Vertriebslinie einzurichten, wenn Sie gelegentlich einen oder mehrere Container bewegen müssen.
Möglicherweise haben Sie an einer Docker-Instanz auf Ihrem lokalen Computer gearbeitet und beschlossen, diese auf einen leistungsstärkeren Server zu verschieben. Oder Sie möchten Ihren benutzerdefinierten Container einfach auf mehreren Computern bereitstellen, kopieren und einfügen. In anderen Fällen sind Sie möglicherweise mit einem Cloud-Computing-Anbieter unzufrieden und möchten zu einem anderen wechseln. Unabhängig von der Situation gibt es ein ziemlich einfaches Verfahren, das im Folgenden detailliert beschrieben wird.
Speichern Sie das Container-Image vom Quellhost
Es ist nicht erforderlich, den Container zuerst anzuhalten, es wird jedoch dringend empfohlen, dies zu tun. Sie erstellen eine Momentaufnahme der Daten in Ihrer Docker-Instanz. Wenn es währenddessen ausgeführt wird, besteht eine geringe Wahrscheinlichkeit, dass einige Dateien in Ihrem Snapshot unvollständig sind. Stellen Sie sich vor, jemand lädt eine 500-MB-Datei hoch. Wenn 250 MB hochgeladen wurden, geben Sie die aus docker commit
Befehl. Der Upload wird dann fortgesetzt, aber wenn Sie dieses Docker-Image auf einem anderen Host wiederherstellen, sind möglicherweise nur 250 MB von den 500 MB verfügbar.
Wenn Sie können, stoppen Sie zuerst die Instanz.
docker stop NAME_OF_INSTANCE
Ein Docker-Container besteht aus einem generischen Anfangsbild. Im Laufe der Zeit fügen Sie diesem Basis-Image Ihre eigenen Änderungen hinzu. Prozesse, die im Container ausgeführt werden, speichern möglicherweise auch ihre eigenen Daten oder nehmen andere Änderungen vor. Um all dies beizubehalten, können Sie diesen neuen Status einem neuen Image zuweisen.
Wenn die Instanz gerade ausgeführt wird, wird sie durch diese Aktion angehalten, während der Inhalt gespeichert wird. Wenn Sie Ihrem Container viele Daten hinzugefügt haben, dauert dieser Vorgang länger. Wenn dies ein Problem ist, können Sie diese Pause durch Eingabe vermeiden docker commit -p=false NAME_OF_INSTANCE mycontainerimage
anstelle des nächsten Befehls. Tun Sie dies jedoch nur, wenn dies unbedingt erforderlich ist. In diesem Fall steigt die Wahrscheinlichkeit, ein Bild mit inkonsistenten / unvollständigen Daten zu erstellen.
In diesem Tutorial wurde ein generischer Name für das resultierende Bild ausgewählt. mycontainerimage
. Sie können diesen Namen ändern, wenn Sie möchten. Wenn Sie dies tun, denken Sie daran, es in allen nachfolgenden Befehlen zu ersetzen, auf die Sie stoßen.
docker commit NAME_OF_INSTANCE mycontainerimage
Speichern Sie dieses Bild nun in einer Datei und komprimieren Sie es.
docker save mycontainerimage | gzip > mycontainerimage.tar.gz
Verwenden Sie als Nächstes Ihre bevorzugte Dateiübertragungsmethode und kopieren Sie sie mycontainerimage.tar.gz
zu dem Host, auf den Sie Ihren Container migrieren möchten.
Laden Sie das Container-Image auf den Zielhost
Nachdem Sie sich bei dem Host angemeldet haben, auf den Sie das Image übertragen haben, importieren Sie es in Docker.
gunzip -c mycontainerimage.tar.gz | docker load
Da Sie diesen Container hier nie initialisiert haben, können Sie ihn nicht starten docker start
noch. Geben Sie stattdessen denselben Befehl ein, den Sie in der Vergangenheit verwendet haben, als Sie diese Docker-Instanz zum ersten Mal ausgeführt haben. Der einzige Unterschied besteht jetzt darin, dass Sie am Ende “mycontainerimage” anstelle des Bildes verwenden, das Sie in der Vergangenheit verwendet haben.
Der nächste Befehl ist nur ein Beispiel. Kopieren Sie dies nicht und fügen Sie es nicht ein, es sei denn, es trifft auf Sie zu. (Beim ersten Ausführen des Bildes waren keine speziellen Parameter erforderlich.)
docker run -d --name=PICK_NAME_FOR_CONTAINER mycontainerimage
Im Gegensatz dazu ist das Folgende ein Beispiel für einen Befehl where-Parameter --publish
war erforderlich, um Port 80 auf dem Host-Computer an Port 80 auf dem Container weiterzuleiten:
docker run -d --name=http-server --publish 80:80 mycontainerimage
Danach können Sie diesen Container normal stoppen und starten, mit docker stop
und docker start
Befehle.
Bild übertragen, ohne eine Datei zu erstellen
Manchmal möchten Sie möglicherweise das Erstellen eines überspringen mycontainerimage.tar.gz
Datei. Möglicherweise haben Sie nicht genügend Speicherplatz, da der Container viele Daten enthält. Sie können das Image mit einem Befehl speichern, komprimieren, übertragen, dekomprimieren und auf den Zielhost laden. Nach dem Ausführen der docker commit
Befehl im ersten Abschnitt besprochen, können Sie diesen verwenden:
docker save mycontainerimage | gzip | ssh root@203.0.113.1 'gunzip | docker load'
Es sollte auch unter Windows funktionieren, da es jetzt einen eingebauten SSH-Client hat (PuTTY nicht mehr erforderlich).
Fahren Sie anschließend mit dem fort docker run
Befehl, der auf Ihre Situation zutrifft.
Fazit
docker save
und docker load
eignen sich hervorragend als Ad-hoc-Lösung für das gelegentliche Bewegen von Containern. Denken Sie jedoch daran, dass Sie, wenn Sie dies häufig tun, stattdessen möglicherweise Ihr eigenes privates Repository einrichten möchten.
Bildnachweis: Medizinischer Dienst der Luftwaffe