Ich habe dieses Docker-Image- Tutum / WordPress verwendet , um eine Wordpress-Website zu demonstrieren. Kürzlich habe ich herausgefunden, dass das Bild Volumes für die MySQL-Daten verwendet.
Das Problem ist also folgendes: Wenn ich den Container sichern und wiederherstellen möchte, kann ich versuchen, ein Image festzuschreiben, den Container später zu löschen und einen neuen Container aus dem festgeschriebenen Image zu erstellen. Aber wenn ich das tue, wird das Volume gelöscht und alle meine Daten sind weg.
Es muss eine einfache Möglichkeit geben, meinen Container und seine Volumendaten zu sichern, aber ich kann sie nirgendwo finden.
backup
docker
linux-containers
pguardiario
quelle
quelle
Antworten:
Wie im Docker-Benutzerhandbuch erläutert, sollen Datenvolumes Daten außerhalb eines Container-Dateisystems beibehalten. Dies erleichtert auch die gemeinsame Nutzung von Daten zwischen mehreren Containern.
Während Docker niemals Daten in Volumes löscht (es sei denn, Sie löschen den zugehörigen Container mit
docker rm -v
), werden Volumes, auf die von keinem Docker-Container verwiesen wird, als baumelnde Volumes bezeichnet . Diese baumelnden Bände sind schwer zu entfernen und schwer zugänglich.Dies bedeutet, dass sobald das letzte Container, das ein Volume verwendet, gelöscht wird, das Datenvolumen baumelt und sein Inhalt schwer zugänglich ist.
Um diese baumelnden Volumes zu verhindern, besteht der Trick darin, einen zusätzlichen Docker-Container mit dem Datenvolumen zu erstellen, das Sie behalten möchten. Damit gibt es immer mindestens diesen Docker-Container, der auf das Volume verweist. Auf diese Weise können Sie den Docker-Container löschen, in dem die WordPress-App ausgeführt wird, ohne den einfachen Zugriff auf den Inhalt dieses Datenvolumens zu verlieren.
Solche Container werden als Datenvolumencontainer bezeichnet .
Backup-Docker-Images
Verwenden Sie zum Sichern von Docker-Images den Befehl docker save , mit dem ein Teerarchiv erstellt wird, mit dem später mit dem Befehl docker load ein neues Docker-Image erstellt werden kann .
Backup-Docker-Container
Sie können einen Docker-Container auf verschiedene Arten sichern
Beachten Sie, dass diese Befehle nur das Docker-Container-Layer-Dateisystem sichern. Dies schließt die Datenmengen aus .
Backup-Docker-Datenvolumes
Um ein Datenvolume zu sichern, können Sie einen neuen Container mit dem Volume ausführen, das Sie sichern möchten, und den Befehl tar ausführen, um ein Archiv des Volume-Inhalts zu erstellen, wie im Docker-Benutzerhandbuch beschrieben .
In Ihrem speziellen Fall wird das Datenvolumen zum Speichern der Daten für einen MySQL-Server verwendet. Wenn Sie also ein Tar-Archiv für dieses Volume exportieren möchten, müssen Sie zuerst den MySQL-Server stoppen. Dazu müssen Sie den WordPress-Container stoppen.
Sichern Sie die MySQL-Daten
Eine andere Möglichkeit besteht darin, eine Remoteverbindung zum MySQL-Server herzustellen, um mit dem Befehl mysqldump einen Datenbankspeicherauszug zu erstellen . Damit dies funktioniert, muss Ihr MySQL-Server jedoch so konfiguriert sein, dass er Remoteverbindungen akzeptiert und über einen Benutzer verfügt, der eine Remoteverbindung herstellen darf. Dies ist bei dem von Ihnen verwendeten WordPress-Docker-Image möglicherweise nicht der Fall.
Bearbeiten
Docker hat kürzlich Docker-Volume-Plugins eingeführt, mit denen die Behandlung von Volumes an Plugins delegiert werden kann, die von Anbietern implementiert wurden.
Der
docker run
Befehl hat ein neues Verhalten für die-v
Option. Es ist jetzt möglich, ihm einen Datenträgernamen zu übergeben . Auf diese Weise erstellte Volumes werden benannt und können später leicht referenziert werden, wodurch die Probleme mit baumelnden Volumes behoben werden .Bearbeiten 2
Docker führte den
docker volume prune
Befehl ein, um alle baumelnden Volumes einfach zu löschen.quelle
Data volumes are designed to persist data, independent of the container’s life cycle. Docker therefore never automatically delete volumes when you remove a container, nor will it “garbage collect” volumes that are no longer referenced by a container.
So sind nurmysqldump
. Einfach in den Behälter schälen, entleeren und dann mit kopierendocker cp
.data only container obsolete?
nicht. Der Nur-Daten-Container gibt Ihnen einen Container fürdocker exec data-container tar -czf snapshot.tgz /data
danndocker cp data-container:snapshot.tgz ./snapshot.tgz
und dergleichen. Wenn Sie möchten, dass der Container eine lange Lebensdauer hat, machen Sie seinen Befehl so, als würdetail -f /dev/null
er niemals beendet, und verwenden Sie dabei nur minimale Ressourcen.UPDATE 2
Raw Single Volume Backup Bash-Skript:
Raw Single Volume Restore Bash-Skript:
Die Verwendung kann folgendermaßen aussehen:
Es werden folgende Annahmen getroffen: Die Sicherungsdatei heißt backup.tar und befindet sich im selben Verzeichnis wie das Sicherungs- und Wiederherstellungsskript. Der Datenträgername ist zwischen den Containern identisch.
AKTUALISIEREN
Es scheint mir, dass sich das Backupping von Volumes aus Containern nicht vom Backupping von Volumes aus Datencontainern unterscheidet.
Volumes sind nichts anderes als Pfade, die mit einem Container verknüpft sind. Der Prozess ist also der gleiche.
Ich weiß nicht, ob Docker-Backup auch für dieselben Containervolumes funktioniert, aber Sie können Folgendes verwenden:
und:
END UPDATE
Es gibt dieses nette Tool, mit dem Sie Docker-Volume-Container sichern und wiederherstellen können:
https://github.com/discordianfish/docker-backup
Wenn Sie einen Container haben, der mit einigen Containervolumes wie diesem verknüpft ist:
Sie können alle Volumes wie folgt sichern:
und so wiederherstellen:
Oder Sie können dem offiziellen Weg folgen:
Wie portiere ich nur Datenvolumes von einem Host auf einen anderen?
quelle
unknown shorthand flag: 'r' in -rm.
Sollte es sein--rm
? (Docker Version 18.09.5, Build e8ff056)Wenn Sie nur gemountete Volumes sichern müssen, können Sie einfach Ordner von Ihrem Dockerhost kopieren .
Auf Ubuntu
Hier finden Sie alle Ordner mit Volumes:
/var/lib/docker/volumes/
Sie können sie also kopieren und archivieren, wo immer Sie möchten.Auf MAC
Es ist nicht so einfach wie unter Ubuntu. Sie müssen Dateien von der VM kopieren.
Hier finden Sie ein Skript zum Kopieren aller Ordner mit Volumes von der virtuellen Maschine (auf der der Docker-Server ausgeführt wird) auf Ihren lokalen Computer. Wir gehen davon aus, dass Ihre Docker-Machine-VM den Standard hat .
Es wird ein Ordner ./backup_volumes in Ihrem aktuellen Verzeichnis erstellt und alle Volumes in diesen Ordner kopiert.
Hier ist ein Skript zum Kopieren aller gespeicherten Volumes aus Ihrem lokalen Verzeichnis ( ./backup_volumes ) auf den Dockerhost-Computer
Jetzt können Sie überprüfen, ob es funktioniert durch:
quelle
/var/lib/docker/volumes
unter Ubuntu zu erstellen?Angenommen, Ihr Datenträgername lautet
data_volume
. Mit den folgenden Befehlen können Sie das Volume auf und von einem Docker-Image mit dem Namen sichern und wiederherstellendata_image
:Sichern:
Etwas wiederherstellen:
quelle
Ich weiß, dass dies alt ist, aber mir ist klar, dass es keine gut dokumentierte Lösung gibt, um einen Datencontainer (als Backup) zum Docker-Hub zu verschieben. Ich habe gerade ein kurzes Beispiel dazu unter https://dzone.com/articles/docker-backup-your-data-volumes-to-docker-hub veröffentlicht
Es folgt das Endergebnis
Das Docker-Tutorial schlägt vor, dass Sie das Datenvolumen lokal sichern und wiederherstellen können. Wir werden diese Technik verwenden und ein paar weitere Zeilen hinzufügen, um dieses Backup in den Docker-Hub zu verschieben, damit es in Zukunft problemlos an einem beliebigen Ort wiederhergestellt werden kann. Also lasst uns anfangen. Dies sind die folgenden Schritte:
Sichern Sie das Datenvolumen aus dem Datencontainer mit dem Namen data-container-to-backup
Erweitern Sie diese TAR-Datei in einen neuen Container, damit wir sie als Teil ihres Images festschreiben können
Übernehmen Sie das Bild und verschieben Sie es mit einem gewünschten Tag ($ VERSION).
Lassen Sie uns zum Schluss aufräumen
Jetzt haben wir ein Image namens Datensicherung in unserem Repo, das einfach ein Dateisystem mit den Sicherungsdateien und Ordnern ist. Um dieses Image zu verwenden (auch als Wiederherstellung aus dem Backup bezeichnet), gehen wir wie folgt vor:
Führen Sie den Datencontainer mit dem Datensicherungsimage aus
Führen Sie Ihr whatEver-Image mit Volumes aus dem Daten-Conainter aus
Das ist es.
Ich war überrascht, dass es für diese Problemumgehung keine Dokumentation gibt. Ich hoffe jemand findet das hilfreich. Ich weiß, ich habe eine Weile gebraucht, um darüber nachzudenken.
quelle
Wenn Ihr Projekt Docker-Compose verwendet, finden Sie hier einen Ansatz zum Sichern und Wiederherstellen Ihrer Volumes.
docker-compose.yml
Grundsätzlich fügen Sie Ihrer Datei docker-compose.yml
db-backup
unddb-restore
Services hinzu und passen sie an den Namen Ihres Volumes an. Mein Volume wirddbdata
in diesem Beispiel benannt.Vermeiden Sie Korruption
Stoppen Sie aus Gründen der Datenkonsistenz Ihren Datenbankcontainer, bevor Sie eine Sicherungskopie erstellen oder wiederherstellen
Sichern
So sichern Sie das Standardziel (
backup/dbdata.tar.bz2
):Wenn Sie einen alternativen Zielnamen angeben möchten, gehen Sie wie folgt vor:
Wiederherstellen
Führen Sie zum Wiederherstellen Folgendes aus
backup/dbdata.tar.bz2
:Oder stellen Sie eine Wiederherstellung aus einer bestimmten Datei her, indem Sie:
Ich habe Befehle von https://loomchild.net/2017/03/26/backup-restore-docker-named-volumes/ angepasst , um diesen Ansatz zu erstellen.
quelle
Der folgende Befehl führt tar in einem Container mit allen bereitgestellten benannten Datenvolumes aus und leitet die Ausgabe in eine Datei um:
Stellen Sie sicher, dass Sie das resultierende Archiv testen, falls etwas schief geht:
quelle
Wenn Sie nur eine einfache Sicherung in einem Archiv benötigen, können Sie mein kleines Dienstprogramm ausprobieren: https://github.com/loomchild/volume-backup
Beispiel
Backup:
archiviert das
some_volume
in die/tmp/archive1.tar.bz2
Archivdatei benannte VolumeWiederherstellen:
wird abwischen und Volume mit dem Namen wiederherstellen
some_volume
aus/tmp/archive1.tar.bz2
Archivdatei.Weitere Informationen: https://medium.com/@loomchild/backup-restore-docker-named-volumes-350397b8e362
quelle
Ich habe ein Tool zum Orchestrieren und Starten der Sicherung von Daten und MySQL-Containern erstellt, das einfach als Docker-Sicherung bezeichnet wird . Auf dem Docker-Hub befindet sich sogar ein gebrauchsfertiges Image .
Es ist hauptsächlich in Bash geschrieben, da es hauptsächlich Orchestrierung ist. Es wird
duplicity
für die eigentliche Backup-Engine verwendet. Sie können derzeit auf FTP (S) und Amazon S3 sichern.Die Konfiguration ist ganz einfach: Schreiben Sie eine Konfigurationsdatei in YAML, in der beschrieben wird, was und wo gesichert werden soll, und los geht's!
Bei Datencontainern werden die von Ihrem Container gemeinsam genutzten Volumes automatisch bereitgestellt, um sie zu sichern und zu verarbeiten. Bei MySQL-Containern werden diese verknüpft und ein mit Ihrem Container gebündelter MySQL-Dump ausgeführt und das Ergebnis verarbeitet.
Ich habe es geschrieben, weil ich Docker-Cloud verwende, das mit den neuesten Docker-Engine-Versionen nicht auf dem neuesten Stand ist, und weil ich den Docker-Weg nutzen wollte, indem ich keinen Sicherungsprozess in meine Anwendungscontainer einbezog.
quelle
Wenn Sie arkane Operatoren über die Befehlszeile eingeben möchten, werden Sie diese manuellen Containersicherungstechniken lieben. Beachten Sie, dass es eine schnellere und effizientere Möglichkeit gibt, Container zu sichern, die genauso effektiv ist. Ich habe hier Anweisungen geschrieben: https://www.morpheusdata.com/blog/2017-03-02-how-to-create-a-docker-backup-with-morpheus
Schritt 1: Hinzufügen eines Docker-Hosts zu einer beliebigen Cloud Wie in einem Lernprogramm auf der Morpheus-Support-Website erläutert, können Sie der Cloud Ihrer Wahl innerhalb von Sekunden einen Docker-Host hinzufügen. Beginnen Sie mit der Auswahl von Infrastruktur in der Hauptnavigationsleiste von Morpheus. Wählen Sie oben im Infrastrukturfenster Hosts aus und klicken Sie oben rechts auf die Schaltfläche „+ Container-Hosts“.
Um einen Docker-Host über Morpheus in einer Cloud zu sichern, navigieren Sie zum Bildschirm Infrastruktur und öffnen Sie das Menü „+ Container-Hosts“.
Wählen Sie im Menü einen Container-Host-Typ aus, wählen Sie eine Gruppe aus und geben Sie Daten in die fünf Felder ein: Name, Beschreibung, Sichtbarkeit, Cloud auswählen und Tags eingeben (optional). Klicken Sie auf Weiter und konfigurieren Sie die Hostoptionen, indem Sie einen Serviceplan auswählen. Beachten Sie, dass die Felder Volume, Memory und CPU Count nur sichtbar sind, wenn für den ausgewählten Plan benutzerdefinierte Optionen aktiviert sind.
Hier können Sie Volumes hinzufügen und skalieren, die Speichergröße und die CPU-Anzahl festlegen und ein Netzwerk auswählen. Sie können auch den Benutzernamen und das Kennwort des Betriebssystems, den Domänennamen und den Hostnamen konfigurieren. Dies ist standardmäßig der zuvor eingegebene Containername. Klicken Sie auf Weiter und fügen Sie dann alle Automatisierungsworkflows hinzu (optional). Überprüfen Sie abschließend Ihre Einstellungen und klicken Sie auf Fertig stellen, um sie zu speichern.
Schritt 2: Hinzufügen der Docker-Registrierungsintegration zu öffentlichen oder privaten Clouds Adam Hicks beschreibt in einem anderen Morpheus-Tutorial, wie einfach die Integration in eine private Docker-Registrierung ist. (Für die Verwendung von Morpheus zum Bereitstellen von Images mit dem öffentlichen Hub von Docker mithilfe der öffentlichen Docker-API ist keine zusätzliche Konfiguration erforderlich.)
Wählen Sie auf der Registerkarte "Admin" der Hauptnavigationsleiste "Integrationen" aus und klicken Sie dann auf der rechten Seite des Bildschirms auf die Schaltfläche "+ Neue Integration". Wählen Sie im angezeigten Integrationsfenster im Dropdown-Menü Typ die Option Docker-Repository aus, geben Sie einen Namen ein und fügen Sie den API-Endpunkt für die private Registrierung hinzu. Geben Sie einen Benutzernamen und ein Kennwort für die von Ihnen verwendete Registrierung ein und klicken Sie auf die Schaltfläche Änderungen speichern.
Integrieren Sie eine Docker-Registrierung in eine private Cloud über das Dialogfeld „Neue Integration“ von Morpheus.
Um die soeben erstellte Integration bereitzustellen, wählen Sie im Dialogfeld "Instanz erstellen" unter "Typ" die Option "Docker" aus, wählen Sie die Registrierung im Dropdown-Menü "Docker-Registrierung" auf der Registerkarte "Konfigurieren" aus und setzen Sie die Bereitstellung wie bei jedem Docker-Container fort.
Schritt 3: Verwalten von Sicherungen Nachdem Sie den Docker-Host hinzugefügt und die Registrierung integriert haben, wird für jede von Ihnen bereitgestellte Instanz automatisch eine Sicherung konfiguriert und durchgeführt. Die Morpheus-Unterstützung enthält Anweisungen zum Anzeigen von Sicherungen, zum Erstellen einer Instanzsicherung und zum Erstellen einer Serversicherung.
quelle
Wenn Sie eine vollständige Sicherung wünschen, müssen Sie einige Schritte ausführen:
Beachten Sie, dass nur ein Docker-Commit des Containers für ein Image KEINE an den Container angehängten Volumes enthält (siehe Docker-Commit-Dokumentation ).
" Die Festschreibungsoperation enthält keine Daten, die in im Container bereitgestellten Volumes enthalten sind. "
quelle
Wenn Sie einen so einfachen Fall wie meinen haben, können Sie Folgendes tun:
ADD folder destination
Angenommen, Sie haben die Daten von den Volumes in Ihrem Home-Verzeichnis,
/home/mydata
können Sie beispielsweise Folgendes ausführen:Wo Ihre DOCKERFILE auf eine Datei wie diese zeigt:
Der Rest des Materials wird vom Basis-Image geerbt. Sie können dieses Image jetzt in die Docker-Cloud übertragen, und Ihre Benutzer haben die Daten direkt in ihren Containern verfügbar
quelle
docker cp
.Das Problem : Sie möchten Ihren Image-Container mit den darin enthaltenen Datenvolumes sichern, aber diese Option ist nicht sofort einsatzbereit. Der einfache und triviale Weg wäre, den Volume-Pfad zu kopieren und das Docker-Image zu sichern, es neu zu laden und zu verknüpfen beide zusammen. Diese Lösung scheint jedoch ungeschickt und nicht nachhaltig und wartbar zu sein. Sie müssten einen Cron-Job erstellen, der diesen Fluss jedes Mal zum Laufen bringt.
Lösung : Verwenden von Dockup - Docker-Image zum Sichern Ihrer Docker-Containervolumes und Hochladen auf s3 (Docker + Backup = Dockup). Dockup verwendet Ihre AWS-Anmeldeinformationen, um einen neuen Bucket mit dem Namen gemäß der Umgebungsvariablen zu erstellen, ruft die konfigurierten Volumes ab und wird tarballiert, komprimiert, mit einem Zeitstempel versehen und in den S3-Bucket hochgeladen.
Schritte :
docker-compose.yml
und hängen Sie dieenv.txt
Konfigurationsdatei daran an. Die Daten sollten in einen dedizierten gesicherten S3-Bucket hochgeladen und bereit sein, bei DRP-Ausführungen neu geladen zu werden. Um zu überprüfen, welcher Volume-Pfad konfiguriert werden soll, führen Siedocker inspect <service-name>
die Volumes aus und suchen Sie sie :Bearbeiten Sie den Inhalt der Konfigurationsdatei
env.txt
und platzieren Sie ihn im Projektpfad:Führen Sie den Dockup-Container aus
quelle
Dies ist eine Sicherungsmethode für Volume-Ordner.
Wenn Sie eine Docker-Registrierung haben, ist diese Methode sehr hilfreich.
Dies verwendet die Docker-Registrierung zum einfachen Verschieben der Zip-Datei.
Auf einem anderen Server
Führen Sie Ihr Image aus, das diesen Volume-Ordner verwendet.
Sie können problemlos ein Image erstellen, das sowohl ein Run-Image als auch eine Volume-Zip-Datei enthält.
Ich habe jedoch aus verschiedenen Gründen (Bildgröße, Eingabebefehl, ..) nicht empfohlen.
quelle