So kopieren/verschieben Sie einen Docker-Container auf einen anderen Host
Da es sich bei Docker-Containern sozusagen um kleine Softwarekästen handelt, können Sie sie kopieren und von Computer zu Computer verschieben. Dies wird jedoch nicht oft diskutiert, wahrscheinlich weil größere Organisationen ihre eigenen Repositories einrichten, in denen sie ihre eigenen Bilder 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 transportieren 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 vielleicht möchten Sie Ihren benutzerdefinierten Container einfach auf mehreren Computern bereitstellen, ihn kopieren und dort einfügen. In anderen Fällen sind Sie möglicherweise mit einem Cloud-Computing-Anbieter unzufrieden und möchten zu einem anderen wechseln. Was auch immer die Situation sein mag, es gibt ein ziemlich einfaches Verfahren, das weiter unten beschrieben wird.
Lesen Sie auch: So richten Sie WordPress mit Docker in Ubuntu ein
Container-Image vom Quellhost speichern
Es ist nicht erforderlich, den Container zuerst zu stoppen, es wird jedoch dringend empfohlen, dies zu tun. Sie erstellen einen Snapshot 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 den Befehl docker commit
aus. Der Upload wird dann fortgesetzt, aber wenn Sie dieses Docker-Image auf einem anderen Host wiederherstellen, sind möglicherweise nur 250 MB der 500 MB verfügbar.
Wenn Sie können, stoppen Sie also zunächst die Instanz.
docker stop NAME_OF_INSTANCE
Ein Docker-Container wird aus einem generischen Ausgangsbild erstellt. Im Laufe der Zeit fügen Sie diesem Basisbild Ihre eigenen Änderungen hinzu. Innerhalb des Containers laufende Prozesse können auch ihre eigenen Daten speichern oder andere Änderungen vornehmen. Um all dies beizubehalten, können Sie diesen neuen Zustand auf ein neues Image übertragen.
Beachten Sie, dass diese Aktion, wenn die Instanz gerade ausgeführt wird, sie anhält, während ihr Inhalt gespeichert wird. Wenn Sie viele Daten zu Ihrem Container hinzugefügt haben, dauert der Abschluss dieses Vorgangs länger. Wenn dies ein Problem darstellt, können Sie diese Pause vermeiden, indem Sie anstelle des nächsten Befehls docker commit -p=false NAME_OF_INSTANCE mycontainerimage
eingeben. Tun Sie dies jedoch nur, wenn dies unbedingt erforderlich ist. In diesem Fall steigt die Wahrscheinlichkeit, dass ein Bild mit inkonsistenten/unvollständigen Daten erstellt wird.
In diesem Tutorial wurde ein generischer Name für das resultierende Bild gewä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, in denen es auftritt.
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 mycontainerimage.tar.gz
auf den 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 noch nicht mit docker start
starten. Geben Sie stattdessen denselben Befehl aus, 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 zuvor verwendeten Bildes verwenden.
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. (Als Sie das Image zum ersten Mal ausgeführt haben, waren keine besonderen Parameter erforderlich.)
docker run -d --name=PICK_NAME_FOR_CONTAINER mycontainerimage
Im Gegensatz dazu ist das Folgende ein Beispiel für einen Befehl, bei dem der Parameter --publish
erforderlich war, um Port 80 auf dem Host-Computer an Port 80 auf dem Container weiterzuleiten:
docker run -d --name=http-server --publish 80:80 mycontainerimage
Anschließend können Sie diesen Container normal mit den Befehlen docker stop
und docker start
stoppen und starten.
Bild übertragen, ohne eine Datei zu erstellen
Manchmal möchten Sie möglicherweise die Erstellung einer mycontainerimage.tar.gz
-Datei überspringen. Möglicherweise verfügen Sie nicht über genügend Speicherplatz, da der Container viele Daten enthält. Sie können das Bild mit einem Befehl speichern, komprimieren, übertragen, dekomprimieren und auf den Zielhost laden. Nachdem Sie den im ersten Abschnitt besprochenen Befehl docker commit
ausgeführt haben, können Sie Folgendes verwenden:
docker save mycontainerimage | gzip | ssh root@203.0.113.1 'gunzip | docker load'
Es sollte auch unter Windows funktionieren, da es jetzt über einen integrierten SSH-Client verfügt (PuTTY nicht mehr erforderlich).
Fahren Sie anschließend mit dem für Ihre Situation zutreffenden Befehl docker run
fort.
Abschluss
docker save
und docker Load
eignen sich hervorragend als Ad-hoc-Lösung für das gelegentliche Verschieben von Containern. Aber denken Sie daran: Wenn Sie dies häufig tun, möchten Sie vielleicht stattdessen Ihr eigenes privates Repository einrichten.
Bildnachweis: Sanitätsdienst der Luftwaffe