Carstens Blog

Daten von Docker Containern sichern

Veröffentlicht in Blog.

Als ich nach einer Möglichkeit suchte, von Docker die sogenannten named volumes zu sichern, musste ich zu meiner Überraschung feststellen, dass es keine Standardmethode für diesen Prozess gibt. In der offiziellen Dokumentation gibt es nur einen Hinweis auf die Verwendung von data volume containern und eine Option --volumes-from. Es gibt auch noch den Docker cp-Befehl, aber er erfordert, dass man den Pfad verwendet, der innerhalb des Containers benutzt wird, was ihn weniger generisch macht.

Nach ein wenig Recherche stellte sich heraus, dass es eigentlich recht einfach ist, volumes mithilfe von volume mounts und einem tar-Dienstprogramm zu sichern. Um zum Beispiel wordpress_data nach /tmp/wordpress_archive.tar.bz2 zu sichern, kann man einfach folgendes ausführen:

docker run --rm -v wordpress_data:/volume -v /tmp:/backup alpine tar -cjf /backup/wordpress_archive.tar.bz2 -C /volume ./

Erklärung:

  • docker run --rm startet einen Container, der sich nach Beendigung selbst löscht.
  • -v wordpress_data:/volume verbindet das Volume unserer WordPressinstallation mit dem neuen Container
  • -v /tmp:/backup verbindet das lokale Verzeichnis /tmp mit dem Verzeichnis /backup im Container
  • alpine ist das Image, welches wir verwenden
  • tar -cjf /backup/wordpress_archive.tar.bz2 -C /volume ./ ist das Kommando welches ein Archiv von unseren Daten erzeugt

Wenn tar mit dem archivieren fertig ist, löscht sich der Container von selbst und in /tmp liegt unsere Backupdatei.

Um die Daten wieder herzustellen, muss man folgendes ausführen:

docker run --rm -v wordpress_data:/volume -v /tmp:/backup alpine sh -c "rm -rf /volume/* /volume/..?* /volume/.[!.]* ; tar -C /volume/ -xjf /backup/wordpress_archive.tar.bz2"

Erklärung:

  • docker run --rm startet einen Container, der sich nach Beendigung selbst löscht.
  • -v wordpress_data:/volume verbindet das Volume unserer WordPressinstallation mit dem neuen Container
  • -v /tmp:/backup verbindet das lokale Verzeichnis /tmp mit dem Verzeichnis /backup im Container
  • alpine ist das Image, welches wir verwenden
  • sh -c starte ein shell und führe folgenden, durch Semikolon getrennte Kommandos aus
    • rm -rf /volume/* /volume/..?* /volume/.[!.]* ; hiermit löschen wir alle Dateien, inklusive der versteckten, innerhalb des verbundenen Zielordners
    • tar -C /volume/ -xjf /backup/wordpress_archive.tar.bz2 um anschließend das Archiv im Zielordner zu entpacken

Hinweis: Als Vorsichtsmaßnahme empfehle ich Ihnen, alle Container zu stoppen, die den zu sichernden oder wiederherzustellenden Datenträger verwenden, da sonst ein inkonsistenter Zwischenzustand archiviert oder wiederhergestellt werden könnte.