Ich verwende Docker, um einige Dienste auf einem CentOS 6.4-Server bereitzustellen, und versuche herauszufinden, wie die von ihnen generierten Daten ordnungsgemäß gesichert werden können.
Einer der Dienste ist beispielsweise eine Webanwendung, über die Benutzer Dateien hochladen können. Für diesen Container habe ich ein /files
Volume, das ich sichern möchte. Host-Reittiere scheinen etwas verpönt zu sein, da solche Reittiere in keiner Weise portabel sind - wie in diesem Blog-Beitrag und in der Docker-Dokumentation für Volumes beschrieben .
Ich weiß aus demselben Blog-Beitrag, dass ich keinen Host-Mount benötige , um auf die Dateien in einem Volume zuzugreifen. Mit diesem kann ich docker inspect
herausfinden, wo sich die Dateien befinden.
Aber hier ist mein Problem: Ich dachte darüber nach, nur die Dockerdateien zu sichern, die zum Erstellen der Container und der damit verbundenen Volumes erforderlich sind. In dem wahrscheinlichen Fall, dass ich alles von der Sicherung wiederherstellen muss, wie würde ich vorgehen, um zu wissen, welches Volume-Verzeichnis welchem Container entspricht? Beim erneuten Erstellen des Containers ändern sich die ID und der Volume-Pfad. Daher würde ich einige zusätzliche Informationen benötigen, um sie abzugleichen. Was sollte ich sonst noch sichern, um tatsächlich alles wiederherstellen zu können?
docker inspect
in Templating wie so gebaut s:VOLUME=$( docker inspect -f '{{index .Volumes "/path/in/container"}}' "${NAME}-data" )
. Es ist wahrscheinlich auch ratsam, die Benutzer daran zu erinnern, dass sie nicht erwarten, Dateien auf diese Weise zu sichern, während sie aktiv verwendet werden (z. B. Datenbanken).Volumes
sind weg und gibt esMounts
stattdessen mit unterschiedlicher Struktur. Wir müssen ein bisschen mehr arbeitenrange
, um den Mount Point zu finden, an dem wir interessiert sindVOLUME=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/path/in/container" }}{{ .Source }}{{ end }}{{ end }}' "${NAME}-data")
In neueren Docker (getestet in
1.9.1, build 9894698
) können Sie dencp
Befehl verwenden .Hier ist ein Beispiel, wie ein Verzeichnis vom Container auf den Host kopiert wird:
Hier ist ein Beispiel, wie Sie ein Verzeichnis aus dem Container in eine
tar
Datei kopieren :Last but not least ein Beispiel, wie man ein Verzeichnis aus dem Container in eine
tar.gz
Datei kopiert :quelle
docker cp
sendet alles über das Netzwerk. Dies ist etwas, das Sie vermeiden möchten, insbesondere wenn Ihr Docker-Volume bereits ein BTRFS-Volume ist.docker cp
wäre schön.