Wie man einen Docker-Container auf einen anderen Host kopiert/bewegt

Ein Foto einer Person, die an einem Schreibtisch mit Computer arbeitet.

Da Docker-Container kleine Softwarekästen sind, können Sie sie problemlos von Computer zu Computer kopieren und bewegen. Möglicherweise haben Sie an einer Docker-Instanz auf Ihrem lokalen Computer gearbeitet und sich entschieden, sie auf einen leistungsstärkeren Server zu verschieben. Oder Sie möchten einfach Ihren benutzerdefinierten Container auf mehreren Computern bereitstellen, ihn „kopieren und einfügen“. Manchmal sind Sie möglicherweise mit einem Cloud-Computing-Anbieter unzufrieden und möchten zu einem anderen wechseln. Hier zeigen wir Ihnen, wie Sie Ihr vorhandenes Docker-Container-Image und die Datenvolumes von einem Linux-Host auf einen anderen übertragen.

Inhaltsverzeichnis

  • Container-Image vom Quell-Host speichern
  • Einen Docker-Volume aus Ihrem Container exportieren
  • Container-Image auf dem Ziel-Host laden
  • Ein Docker-Volume in Ihren Container importieren
  • Image ohne Erstellen einer Datei übertragen
  • Docker Compose verwenden, um eine gesamte Docker-Bereitstellung zu verschieben

Gut zu wissen: Fangen Sie mit Containern an, indem Sie Docker auf Ihrer Linux-Distro installieren.

Container-Image vom Quell-Host speichern

Starten Sie, indem Sie die verfügbaren Docker-Container auf Ihrem System auflisten. In meinem Fall möchte ich meinen Nginx-Docker-Container auf eine neue Maschine exportieren:

docker ps

Ein Terminal, das die verfügbaren Docker-Container für ein System hervorhebt.

Finden Sie den Container, den Sie kopieren möchten, und stoppen Sie die Instanz:

docker stop NAME_OF_INSTANCE

Ein Terminal, das die Ausgabe des Befehls docker stop anzeigt.

Ein Docker-Container besteht aus einem generischen, ursprünglichen Bild. Im Laufe der Zeit fügen Sie Ihre eigenen Änderungen zu diesem Basisbild hinzu. Prozesse, die innerhalb des Containers ausgeführt werden, können auch ihre eigenen Daten speichern oder andere Änderungen vornehmen. Um all dies zu bewahren, speichern Sie den aktuellen Zustand Ihres Containers in einem neuen Image:

docker commit NAME_OF_INSTANCE mycontainerimage

Ein Terminal, das die Ausgabe des Befehls docker commit anzeigt, der ein neues Bild aus dem momentan laufenden erstellt.

Beachten Sie, dass diese Aktion den Container anhalten wird, während seine Inhalte gespeichert werden, wenn die Instanz derzeit läuft. Wenn dies ein Problem darstellt, können Sie diese Pause vermeiden, indem Sie stattdessen docker commit -p=false NAME_OF_INSTANCE mycontainerimage eingeben. Tun Sie dies jedoch nur, wenn es unbedingt notwendig ist. Die Wahrscheinlichkeit, ein Bild mit inkonsistenten/unvollständigen Daten zu erstellen, steigt in diesem Fall.

Speichern Sie nun Ihr neu erstelltes Docker-Container-Image in einer Archivdatei:

docker save -o mycontainerimage.tar mycontainerimage

Verwenden Sie Ihre bevorzugte Methode zur Dateiübertragung und kopieren Sie Ihre .tar-Datei auf den Host, auf dem Sie Ihren Docker-Container verschieben möchten. Zum Beispiel überträgt der folgende Befehl mein Nginx-Docker-Image mit scp:

scp ./mycontainerimage.tar [email protected]:/home/ramces/

Einen Docker-Volume aus Ihrem Container exportieren

Einer der Nachteile des Speicherns eines Docker-Images besteht darin, dass es nicht mit den Docker-Zubehörteilen geliefert wird, die Sie neben Ihrem Container eingerichtet haben. Dazu gehören alle Netzwerkbindemounts und die Volumes, die Sie erstellt haben, um Ihre persistente Daten zu speichern.

Um Ihr Datenvolumen ordnungsgemäß zu exportieren, installieren Sie zuerst Git auf Ihrer lokalen Maschine:

sudo apt install git

Führen Sie den folgenden Befehl aus, um das Skript zum Exportieren von Volumes für Docker herunterzuladen:

git clone https://github.com/ricardobranco777/docker-volumes.sh.git

Stellen Sie sicher, dass das Export-Skript die richtigen Berechtigungsbits hat, und kopieren Sie es dann in das Verzeichnis „/usr/local/bin“ Ihrer Maschine:

sudo chmod +x ./docker-volumes.sh/docker-volumes.sh  
sudo cp ./docker-volumes.sh/docker-volumes.sh /usr/local/bin/

Überprüfen Sie, ob Ihr Skript korrekt funktioniert, und extrahieren Sie dann alle zugehörigen Volumes für Ihren Container:

docker-volumes.sh -h  
docker-volumes.sh NAME_OF_INSTANCE save mycontainerimage-volume.tar

Ein Terminal, das den Prozess des Sicherung von zugehörigen Datenvolumes für einen Docker-Container zeigt.

Senden Sie Ihre neu archivierten Docker-Volume-Dateien an Ihre Remote-Maschine:

scp ./mycontainerimage-volume.tar [email protected]:/home/ramces/

Container-Image auf dem Ziel-Host laden

Melden Sie sich bei Ihrem Remote-Host an und führen Sie dann den folgenden Befehl aus, um es in den Docker-Daemon Ihrer Remote-Maschine zu laden:

docker load -i ./mycontainerimage.tar

Verwenden Sie docker create, um Ihr Docker-Container-Image mit seinen ursprünglichen Ausführungsflags von Ihrer Quellmaschine neu zu initialisieren. Zum Beispiel hatte mein Nginx-Docker-Container ursprünglich Port 80, der auf Port 8080 meiner Hostmaschine gemappt war:

docker create --name my-nginx-container -p8080:80 mycontainerimage

Führen Sie Ihren neu importierten Docker-Container aus:

docker start my-nginx-container

Bestätigen Sie, dass Ihr importiertes Image ordnungsgemäß funktioniert, indem Sie alle aktiven Container im System auflisten:

docker ps

Ein Terminal, das dasselbe Docker-Container-Image an einem anderen System zeigt.

FYI: Wandeln Sie Ihren Raspberry Pi in eine leistungsfähige tragbare Fotogalerie um, indem Sie Photoprism mit Docker installieren.

Ein Docker-Volume in Ihren Container importieren

Um eine .tar Docker-Volume-Datei zu importieren, laden Sie zuerst Git auf Ihrem neuen Host herunter:

sudo apt install git

Wie in Ihrem ursprünglichen System, laden Sie das Helferskript „docker-volume.sh“ herunter, setzen die Berechtigungsbits auf „ausführbar“ und kopieren es dann in das Verzeichnis „/usr/local/bin“ Ihres neuen Systems.

Ein Terminal, das den Prozess des Erhaltens und Installierens des Docker-Volume-Skripts zur Sicherung von mit Containern verbundenen Daten zeigt.

Erstellen Sie einen neuen Docker-Container mit Ihrer exportierten Bilddatei:

docker create --name my-nginx-container -v myvol:/usr/share/nginx/html -p8080:80 mycontainerimage

Führen Sie das Skript docker-volume.sh mit Ihrer ursprünglichen .tar-Datei aus, um es in den Docker-Daemon Ihres neuen Systems zu laden:

docker-volumes.sh my-nginx-container load mycontainerimage-volume.tar

Starten Sie Ihren neuen Docker-Container, indem Sie den folgenden Befehl ausführen:

docker start my-nginx-container

Überprüfen Sie, ob Ihr Container Ihr Volume korrekt lädt, indem Sie seine internen Konfigurationsdaten ansehen:

docker inspect -f '{{ .Mounts }}' my-nginx-container

Ein Terminal, das die importierten Volumendaten auf der neuen Maschine hervorhebt.

Image ohne Erstellen einer Datei übertragen

Manchmal möchten Sie möglicherweise das Erstellen einer Datei mycontainerimage.tar.gz überspringen. Vielleicht haben Sie nicht genug Speicherplatz, da der Container viele Daten enthält. Sie können das Image speichern, übertragen und auf dem Ziel-Host in einem Befehl laden. Nachdem Sie den oben besprochenen Befehl docker commit ausgeführt haben, können Sie dies verwenden:

docker save mycontainerimage | ssh [email protected] docker load

Es sollte auch von Windows aus funktionieren, da es jetzt einen eingebauten SSH-Client hat (PuTTY ist nicht mehr notwendig).

Fahren Sie mit dem Befehl docker create fort, der auf Ihre Situation zutrifft.

Hinweis: Stellen Sie sicher, dass Sie alle Docker-Volumes, die zuvor an Ihren Container angehängt waren, ordnungsgemäß gemountet haben, bevor Sie das importierte Image starten.

Starten Sie schließlich Ihren neu importierten Docker-Container, indem Sie docker start gefolgt vom Namen Ihres Containers ausführen.

Ein Terminal, das den Prozess des Starts eines neuen Containers zeigt und bestätigt, dass er ordnungsgemäß funktioniert.

Docker Compose verwenden, um eine gesamte Docker-Bereitstellung zu verschieben

Mit seinem Compose-Plugin macht es Docker möglich, komplexe Programme zu bauen, zu konfigurieren und auszuführen, ohne sich um den zugrunde liegenden Software-Stack des Servers kümmern zu müssen. Dies ermöglicht es Ihnen, reproduzierbare Anwendungsbereitstellungen über verschiedene Linux-Systeme hinweg zu erstellen.

Um Ihre bestehende Docker-Installation auf Docker Compose zu migrieren, stellen Sie zunächst sicher, dass sein Plugin derzeit auf Ihrem System installiert ist:

sudo apt install docker-compose-plugin docker-buildx-plugin

Erstellen Sie einen neuen Ordner in Ihrem Home-Verzeichnis für Ihre Docker-Compose-Installation:

mkdir ~/my-docker-compose && cd ~/my-docker-compose

Verwenden Sie Ihren bevorzugten Texteditor, um eine Datei „docker-compose.yml“ für Ihre Anwendung zu erstellen:

nano ./docker-compose.yml

Fügen Sie den folgenden Block Code in Ihre Compose-Datei ein und passen Sie ihn an Ihre spezifischen Bedürfnisse an:

version: '3'  
  
volumes:  
  myvol: # Ersetzen Sie dies durch den Namen Ihres importierten Volumes.  
  
services:  
  nginx:  
    image: mycontainerimage # Ersetzen Sie dies durch den Namen Ihres importierten Docker-Images.  
    ports:  
      - "8080:80"  
    volumes:  
      - myvol:/usr/share/nginx/html # Ersetzen Sie "myvol" durch den Namen Ihres gemounteten Images.

Speichern Sie Ihre neue Compose-Datei und führen Sie den folgenden Befehl aus, um sie zu starten:

docker compose up -d

Testen Sie schließlich, ob Ihre Compose-Bereitstellung ordnungsgemäß funktioniert. In meinem Fall werde ich meinen Nginx-Docker-Container testen, indem ich einen Webbrowser öffne und zu „localhost:8080“ navigiere.

Ein Screenshot, der den importierten Nginx-Docker-Container zeigt, der auf seinem neuen Maschinen-Host ordnungsgemäß funktioniert.

Zu lernen, wie man seinen Docker-Container auf andere Linux-Hosts kopiert und bewegt, ist nur eine der vielen Aufgaben, die Sie mit Ihrer Maschine erledigen können. Erkunden Sie diese wunderbare Welt des Self-Hostings, indem Sie einen Minecraft-Server auf Linux mit Docker installieren.

Bildnachweis: Max Duzij über Unsplash. Alle Änderungen und Screenshots von Ramces Red.