Was ist der Unterschied zwischen Speichern und Exportieren in Docker?


157

Ich spiele ein paar Tage mit Docker herum und habe bereits einige Bilder gemacht (was wirklich Spaß gemacht hat!). Jetzt möchte ich meine Arbeit fortsetzen und bin zu den Befehlen saveund gekommen export, aber ich verstehe sie nicht vollständig.

Was ist der Unterschied zwischen saveund exportin Docker?


4
Ich schrieb auch einen Blog-Beitrag darüber unter tuhrig.de/difference-between-save-and-export-in-docker
Thomas Uhrig

Antworten:


169

Die kurze Antwort lautet:

  • saveruft ein Image ab: Für eine VM oder einen physischen Server ist dies das ISO-Image oder die Festplatte der Installation. Das Basisbetriebssystem.

    Es packt die Ebenen und Metadaten aller Ketten, die zum Erstellen des Images erforderlich sind. Sie können diese "gespeicherte" Bildkette dann in eine andere Docker-Instanz laden und Container aus diesen Bildern erstellen.

  • exportholt den gesamten Container ab: wie eine Momentaufnahme einer normalen VM. Speichert natürlich das Betriebssystem, aber auch jede Änderung, die Sie vorgenommen haben, jede Datendatei, die während der Containerlebensdauer geschrieben wurde. Dieser ist eher wie ein traditionelles Backup.

    Sie erhalten ein flaches .tar-Archiv, das das Dateisystem Ihres Containers enthält.

Bearbeiten: Da meine Erklärung immer noch zu Verwirrung führen kann, denke ich, dass es wichtig ist zu verstehen, dass einer dieser Befehle mit Containern funktioniert, während der andere mit Bildern funktioniert.

  • Ein Bild muss als "tot" oder unveränderlich betrachtet werden. Wenn Sie 0 oder 1000 Container starten, ändert sich kein einzelnes Byte. Aus diesem Grund habe ich früher einen Vergleich mit einer Systeminstallations-ISO durchgeführt. Es ist vielleicht sogar näher an einer Live-CD.

  • Ein Container "bootet" das Bild und fügt eine zusätzliche Ebene hinzu. Diese Ebene speichert alle Änderungen im Container (erstellte / geänderte / entfernte Dateien ...).


2
Nur zur Verdeutlichung: Nehmen wir an, ich habe einen laufenden Container, in dem ich einige Änderungen vorgenommen habe (z. B. einen neuen Ordner erstellt habe). Jetzt kann ich ein Bild von diesem Container machen (mit docker commit). Ich kann dann savedas Bild. Oder ich kann exportden Container direkt. Und beide Wege ( savedas Bild und exportder Container) haben das gleiche Ergebnis?
Thomas Uhrig

2
Ja und nein. Das exportgibt Ihnen ein flaches .tar-Archiv, das Ihr Container-Dateisystem enthält. savepackt die Ebenen und Metadaten aller Ketten, die zum Erstellen des Images erforderlich sind. Sie können diese " saved" - Image-Kette dann in eine andere Docker-Instanz laden und Container aus diesen Images erstellen.
Mbarthelemy

7
@ThomasUhrig Mit Export können Sie den Container auf eine Ebene / ein Basisbild "reduzieren". Sie können es auch zum Sichern des Containers verwenden (z. B. Datencontainer). Dies kann aber auch ohne exportFunktion erfolgen.
Jiri

9
Außerdem gehen exportalle Metadaten verloren. Wenn Sie also versuchen, den Container mit diesem Image auszuführen, müssen Sie die CMD und andere Metdaten erneut implementieren. savefunktionierte gut für mich, aber der Export war schmerzhaft
Mirage

1
Ich möchte mein Bild auf die neueste Version aktualisieren. Der jetzt ausgeführte Container hat einige Änderungen am internen Dateisystem vorgenommen. Nach dem Upgrade möchte ich, dass diese Änderungen wiederhergestellt werden. Soweit ich weiß, wird sowohl beim Speichern / Laden als auch beim Exportieren / Importieren ein neues Bild für mich erstellt, was ich nicht möchte. Ich möchte eine neue Version des Images von Dockerhub verwenden, aber Daten aus dem vorhandenen Container wiederherstellen. Was ist die beste Vorgehensweise?
Dmitry z

20

Es gibt zwei Hauptunterschiede zwischen saveund exportBefehlen.

  1. saveDer Befehl speichert das gesamte Bild mit Verlauf und Metadaten, der exportBefehl exportiert jedoch nur die Dateistruktur (ohne Verlauf und Metadaten). Die exportierte TAR-Datei ist also kleiner als die gespeicherte.

  2. Wenn Sie exportierte Dateisystem verwenden , um ein neues Bild dann neu in diesem Bild enthalten wird nicht für die Erstellung USER, EXPOSE, RUNusw. Befehle von Ihrem Dockerfile. Es wird nur die Dateistruktur übertragen. Wenn Sie also die genannten Schlüsselwörter in Ihrer Docker-Datei verwenden, können Sie den Exportbefehl nicht zum Übertragen von Bildern auf einen anderen Computer verwenden. Sie müssen immer den Befehl save verwenden.


4

Für das exportierte Bild werden keine Ebenen- oder Verlaufsinformationen gespeichert, daher ist es kleiner und Sie können kein Rollback durchführen.

Das gespeicherte Bild wird hat Schicht und Verlaufsinformationen, so größer.

Wenn Sie dies einem Kunden geben, lautet die Frage: Möchten Sie diese Ebenen behalten oder nicht?


Ein Export ähnelt also einer TXT-Datei, auf der nichts geschrieben ist, oder? @neil
AATHITH RAJENDRAN

4
Es ist wie eine Textdatei ohne Rückgängig-Puffer 8)
Neil McGill

2

Technisch gesehen funktioniert Speichern / Laden mit Repositorys, bei denen es sich um ein oder mehrere Bilder handeln kann, die auch als Ebenen bezeichnet werden. Ein Bild ist eine einzelne Ebene innerhalb eines Repos. Schließlich ist ein Container ein instanziiertes Bild (läuft oder nicht).


1

Docker speichern Erzeugt ein Tar-Datei-Repo, das alle übergeordneten Ebenen und alle Tags + Versionen oder das angegebene Repo: -Tag für jedes aus dem Bild bereitgestellte Argument enthält .

Docker- Export Erzeugt eine angegebene Datei (kann tar oder tgz sein) mit flachem Inhalt ohne Inhalt der angegebenen Volumes aus Container .

Docker Save muss für Docker-Image verwendet werden, während Docker- Export für Container verwendet werden muss (genau wie das Ausführen von Image).

Nutzung speichern

Docker speichern [OPTIONEN] BILD [BILD ...]

Speichern Sie ein Bild in einem Teerarchiv (standardmäßig in STDOUT gestreamt).

--help = false Drucknutzung -o, --output = "" In eine Datei anstelle von STDOUT schreiben

Verwendung exportieren

Docker-Export [OPTIONEN] CONTAINER

Exportieren Sie den Inhalt des Dateisystems eines Containers als Tar-Archiv

--help = false Drucknutzung -o, --output = "" In eine Datei anstelle von STDOUT schreiben


1
Bei der Frage geht es um den Unterschied zwischen zwei Befehlen, nicht um die allgemeine Definition und Verwendung!
Abu Shumon

0

export: container (filesystem)-> image tar.
import: exported image tar-> image. Nur eine Schicht.

save: image-> image tar.
load: saved image tar-> image. Alle Schichten werden wiederhergestellt.

Von Docker in Aktion, Zweite Ausgabe S. 190.

Überlagerte Bilder behalten den Verlauf des Bildes, Metadaten zur Containererstellung und alte Dateien bei, die möglicherweise gelöscht oder überschrieben wurden.

Reduzierte Bilder enthalten nur den aktuellen Satz von Dateien im Dateisystem.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.