it-swarm.com.de

Wie kann ich einen Docker-Container mit seinen Datenmengen sichern?

Ich habe dieses Docker-Image tutum/wordpress verwendet, um eine Wordpress Website zu demonstrieren. Kürzlich habe ich herausgefunden, dass das Image 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 und 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 ihn nirgendwo finden.

115
pguardiario

wenn ich den Container zurücksetzen möchte, kann ich versuchen, ein Image festzuschreiben, und den Container später löschen und einen neuen Container aus dem festgeschriebenen Image erstellen. Aber wenn ich das tue, wird das Volume gelöscht und alle meine Daten sind weg

Wie im Docker-Benutzerhandbuch erläutert, sollen Datenmengen 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), Volumes, auf die kein Docker-Container verweist, heißen baumelnde Volumes. Diese baumelnden Bände sind schwer zu entfernen und schwer zugänglich.

Dies bedeutet, dass sobald der letzte Container, der ein Volume verwendet, gelöscht wird, das Datenvolumen baumelt und sein Inhalt schwer zugänglich ist.

Um diese baumelnden Volumes zu verhindern, müssen Sie einen zusätzlichen Docker-Container mit dem Daten-Volume erstellen, das Sie beibehalten möchten. damit es immer mindestens diesen Docker-Container gibt, der auf das Volume verweist. Auf diese Weise können Sie den Docker-Container löschen, in dem die App wordpress=) ausgeführt wird, ohne den einfachen Zugriff auf den Inhalt dieses Datenvolumens zu verlieren.

Solche Container heißen Data Volume Container .

Es muss eine einfache Möglichkeit geben, meine Container- und Volumendaten zu sichern, aber ich kann sie nirgendwo finden.

docker-Images sichern

Verwenden Sie zum Sichern von Docker-Images den Befehl Docker-Speichern , um ein Tar-Archiv zu erstellen, das später zum Erstellen eines neuen Docker-Images mit dem Befehl Docker-Laden verwendet werden kann.

docker-Backup-Container

Sie können einen Docker-Container auf verschiedene Weise sichern

  • durch Festschreiben eines neuen Docker-Images basierend auf dem aktuellen Status des Docker-Containers mit dem Befehl Docker-Festschreiben
  • durch Exportieren des Docker-Container-Dateisystems als Tar-Archiv mit dem Befehl Docker-Export . Sie können später mit dem Befehl Docker-Import ein neues Docker-Image aus diesem Tar-Archiv erstellen.

Beachten Sie, dass diese Befehle nur das mehrschichtige Dateisystem des Docker-Containers sichern. Dies schließt die Datenmengen aus.

backup Docker-Datenvolumes

Zum Sichern eines Datenvolumes können Sie einen neuen Container mit dem zu sichernden Volume ausführen 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 anhalten.

sichern Sie die MySQL-Daten

Eine andere Möglichkeit besteht darin, eine Remoteverbindung zum MySQL-Server herzustellen, um mit dem Befehl mysqldump einen Datenbank-Dump zu erstellen. Damit dies jedoch funktioniert, muss Ihr MySQL-Server so konfiguriert sein, dass er Remoteverbindungen akzeptiert und über einen Benutzer verfügt, der Remoteverbindungen herstellen kann. Dies ist möglicherweise nicht der Fall bei dem von Ihnen verwendeten Docker-Image wordpress=).


Bearbeiten

Docker hat kürzlich Docker Volume Plugins eingeführt, mit dessen Hilfe die Handhabung von Volumes an Plugins delegiert werden kann, die von Anbietern implementiert wurden.

Das docker run Befehl hat ein neues Verhalten für die -v Option. Es ist jetzt möglich, einen Datenträgernamen zu übergeben. Auf diese Weise erstellte Volumes sind named und später leicht zu referenzieren, wodurch die Probleme mit dangling volume behoben werden.

Bearbeiten 2

Docker stellte das docker volume Prune Befehl zum einfachen Löschen aller baumelnden Volumes.

112
Thomasleveil

UPDATE 2

Rohes Backup-Skript für ein einzelnes Volume:

#!/bin/bash
# This script allows you to backup a single volume from a container
# Data in given volume is saved in the current directory in a tar archive.
CONTAINER_NAME=$1
VOLUME_NAME=$2

usage() {
  echo "Usage: $0 [container name] [volume name]"
  exit 1
}

if [ -z $CONTAINER_NAME ]
then
  echo "Error: missing container name parameter."
  usage
fi

if [ -z $VOLUME_NAME ]
then
  echo "Error: missing volume name parameter."
  usage
fi

Sudo docker run -rm --volumes-from $CONTAINER_NAME -v $(pwd):/backup busybox tar cvf /backup/backup.tar $VOLUME_NAME

Raw Single Volume Restore Script:

#!/bin/bash
# This script allows you to restore a single volume from a container
# Data in restored in volume with same backupped path
NEW_CONTAINER_NAME=$1

usage() {
  echo "Usage: $0 [container name]"
  exit 1
}

if [ -z $NEW_CONTAINER_NAME ]
then
  echo "Error: missing container name parameter."
  usage
fi

Sudo docker run -rm --volumes-from $NEW_CONTAINER_NAME -v $(pwd):/backup busybox tar xvf /backup/backup.tar

Die Verwendung kann folgendermaßen aussehen:

$ volume_backup.sh old_container /srv/www
$ Sudo docker stop old_container && Sudo docker rm old_container
$ Sudo docker run -d --name new_container myrepo/new_container
$ volume_restore.sh new_container

Annahmen sind: Die Sicherungsdatei heißt backup.tar und befindet sich im selben Verzeichnis wie das Sicherungs- und Wiederherstellungsskript. Der Datenträgername ist für die Container identisch.

[~ # ~] Update [~ # ~]

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, sodass der Prozess derselbe ist.

Ich weiß nicht, ob Docker-Backup auch für dieselben Container-Volumes funktioniert, aber Sie können Folgendes verwenden:

Sudo docker run -rm --volumes-from yourcontainer -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data

und:

Sudo docker run -rm --volumes-from yournewcontainer -v $(pwd):/backup busybox tar xvf /backup/backup.tar

END UPDATE

Es gibt dieses Nice-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 folgt verknüpft ist:

$ docker run --volumes-from=my-data-container --name my-server ...

sie können alle Volumes folgendermaßen sichern:

$ docker-backup store my-server-backup.tar my-server

und so wiederherstellen:

$ docker-backup restore my-server-backup.tar

Oder Sie können den offiziellen Weg folgen:

Wie portiere ich Datenträger nur von einem Host auf einen anderen?

26
tommasop

Wenn Sie nur gemountete Volumes sichern müssen, können Sie einfach Ordner von Ihrem Dockerhost kopieren.

Hinweis: Wenn Sie mit bunt arbeiten, ist Dockerhost Ihr lokaler Computer. Wenn Sie mit Mac arbeiten, ist Dockerhost Ihre virtuelle Maschine.

nter Ubunt

Sie finden alle Ordner mit Volumes hier: /var/lib/docker/volumes/ so können Sie sie kopieren und archivieren, wo immer Sie wollen.

Auf MAC

Es ist nicht so einfach wie bei Ubuntu. Sie müssen Dateien von der VM kopieren.

Hier ist 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-Maschine VM benannt Standard.

docker-machine ssh default Sudo cp -v -R /var/lib/docker/volumes/ /home/docker/volumes

docker-machine ssh default Sudo chmod -R 777 /home/docker/volumes

docker-machine scp -R default:/home/docker/volumes ./backup_volumes

docker-machine ssh default Sudo rm -r /home/docker/volumes

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 .

docker-machine scp -r ./backup_volumes default:/home/docker

docker-machine ssh default Sudo mv -f /home/docker/backup_volumes /home/docker/volumes

docker-machine ssh default Sudo chmod -R 777 /home/docker/volumes

docker-machine ssh default Sudo cp -v -R /home/docker/volumes /var/lib/docker/

docker-machine ssh default Sudo rm -r /home/docker/volumes

Jetzt können Sie überprüfen, ob es funktioniert:

docker volume ls
13
Andrii Dvoiak

Angenommen, Ihr Volume-Name lautet data_volume. Mit den folgenden Befehlen können Sie das Volume in und aus einem Docker-Image mit dem Namen data_image Sichern und wiederherstellen:

Zum Sichern:

docker run --rm --mount source=data_volume,destination=/data Alpine tar -c -f- data | docker run -i --name data_container Alpine tar -x -f-
docker container commit data_container data_image
docker rm data_container

Wiederherstellen:

docker run --rm data_image tar -c -f- data | docker run -i --rm --mount source=data_volume,destination=/data Alpine tar -x -f-
9
Sahil Ahuja

Ich weiß, dass dies alt ist, aber mir ist klar, dass es keine gut dokumentierte Lösung gibt, um einen Datencontainer (als Backup) in den 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 die Quintessenz

Das Docker-Tutorial schlägt vor, dass Sie das Datenvolumen lokal sichern und wiederherstellen können. Wir werden diese Technik anwenden und noch ein paar Zeilen hinzufügen, um dieses Backup in den Docker-Hub zu verschieben, damit es später an jedem gewünschten Ort problemlos 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

docker run --rm --volumes-from data-container-backup --name tmp-backup -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /folderToBackup

Erweitern Sie diese TAR-Datei in einen neuen Container, damit wir sie als Teil ihres Images festschreiben können

docker run -d -v $(pwd):/backup --name data-backup ubuntu /bin/sh -c "cd / && tar xvf /backup/backup.tar"

Übernehmen Sie und verschieben Sie das Bild mit einem gewünschten Tag ($ VERSION)

docker commit data-backup repo/data-backup:$VERSION
docker Push repo/data-backup:$VERSION

Zum Schluss lass uns aufräumen

docker rm data-backup
docker rmi $(docker images -f "dangling=true" -q)

Jetzt haben wir ein Image mit dem Namen data-backup in unserem Repo, das einfach ein Dateisystem mit den Sicherungsdateien und -ordnern ist. Um dieses Image zu verwenden (oder von einem Backup wiederherzustellen), gehen wir wie folgt vor:

Führen Sie den Datencontainer mit dem Datensicherungsimage aus

run -v /folderToBackup --entrypoint "bin/sh" --name data-container repo/data-backup:${VERSION}

Führen Sie Ihr whatEver-Image mit Volumes aus dem Datencontainer aus

docker run --volumes-from=data-container repo/whatEver

Das ist es.

Ich war überrascht, dass es für diese Arbeit keine Dokumentation gibt. Ich hoffe jemand findet das hilfreich. Ich weiß, dass ich eine Weile gebraucht habe, um darüber nachzudenken.

8
z-star

Mit dem folgenden Befehl wird tar in einem Container mit allen angegebenen Datenträgern ausgeführt und die Ausgabe in eine Datei umgeleitet:

docker run --rm `docker volume list -q | egrep -v '^.{64}$' | awk '{print "-v " $1 ":/mnt/" $1}'` Alpine tar -C /mnt -cj . > data-volumes.tar.bz2

Stellen Sie sicher, dass Sie das resultierende Archiv testen, falls etwas schief gelaufen ist:

tar -tjf data-volumes.tar.bz2
4
konrad

Wenn Sie nur ein einfaches Backup für ein Archiv benötigen, können Sie mein kleines Hilfsprogramm ausprobieren: https://github.com/loomchild/volume-backup

Beispiel

Backup:

docker run -v some_volume:/volume -v /tmp:/backup --rm loomchild/volume-backup backup archive1

archiviert das Volume mit dem Namen some_volume in die Archivdatei /tmp/archive1.tar.bz2

Wiederherstellen:

docker run -v some_volume:/volume -v /tmp:/backup --rm loomchild/volume-backup restore archive1

löscht und stellt das Volume mit dem Namen some_volume aus der Archivdatei /tmp/archive1.tar.bz2 wieder her.

Weitere Informationen: https://medium.com/@loomchild/backup-restore-docker-named-volumes-350397b8e362

3
loomchild

Ich habe ein Tool erstellt, um die Sicherung von Daten und MySQL-Containern zu orchestrieren und zu starten. Es heißt einfach Docker-Backup . Es gibt sogar ein gebrauchsfertiges Bild auf dem Docker-Hub .

Es ist hauptsächlich in Bash geschrieben, da es sich hauptsächlich um Orchestrierung handelt. Es verwendet duplicity für die eigentliche Backup-Engine. Sie können derzeit auf FTP (S) und Amazon S3 sichern.

Die Konfiguration ist ganz einfach: Schreiben Sie eine Konfigurationsdatei in YAML, die beschreibt, 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. Für MySQL-Container werden sie verknüpft und ein MySQL-Speicherauszug ausgeführt, der mit Ihrem Container gebündelt ist, und das Ergebnis verarbeitet.

Ich habe es geschrieben, weil ich Docker-Cloud verwende, die nicht auf dem neuesten Stand der Docker-Engine-Versionen ist, und weil ich die Docker-Methode nutzen wollte, indem ich keinen Sicherungsvorgang in meine Anwendungscontainer einbezog.

2
Arnaud de Mouhy

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 db-backup und db-restore an Ihre docker-compose.yml-Datei an und passen Sie sie an den Namen Ihres Volumes an. Mein Volume heißt in diesem Beispiel dbdata.

version: "3"

services:
  db:
    image: percona:5.7
    volumes:
      - dbdata:/var/lib/mysql

  db-backup:
    image: Alpine    
    tty: false
    environment:
      - TARGET=dbdata
    volumes:
      - ./backup:/backup
      - dbdata:/volume
    command: sh -c "tar -cjf /backup/$${TARGET}.tar.bz2 -C /volume ./"

  db-restore:
    image: Alpine    
    environment:
      - SOURCE=dbdata
    volumes:
      - ./backup:/backup
      - dbdata:/volume
    command: sh -c "rm -rf /volume/* /volume/..?* /volume/.[!.]* ; tar -C /volume/ -xjf /backup/$${SOURCE}.tar.bz2"

Vermeiden Sie Korruption

Stoppen Sie aus Gründen der Datenkonsistenz Ihren Datenbankcontainer, bevor Sie eine Sicherungskopie erstellen oder eine Wiederherstellung durchführen

docker-compose stop db

Sichern

So sichern Sie zum Standardziel (backup/dbdata.tar.bz2):

docker-compose run --rm db-backup

Wenn Sie einen alternativen Zielnamen angeben möchten, gehen Sie wie folgt vor:

docker-compose run --rm -e TARGET=mybackup db-backup

Wiederherstellen

Wiederherstellen von backup/dbdata.tar.bz2, machen:

docker-compose run --rm db-restore

Oder aus einer bestimmten Datei wiederherstellen mit:

docker-compose run --rm -e SOURCE=mybackup db-restore

Ich habe die Befehle von https://loomchild.net/2017/03/26/backup-restore-docker-named-volumes/ angepasst, um diesen Ansatz zu erstellen.

2
jdhildeb

Wenn Sie arkane Operatoren über die Befehlszeile eingeben möchten, werden Sie diese manuellen Container-Sicherungstechniken lieben. Denken Sie daran, es gibt eine schnellere und effizientere Methode zum Sichern von Containern, 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 Tutorial auf der Morpheus-Support-Website erläutert, können Sie der Cloud Ihres Docker-Hosts hinzufügen Wahl in wenigen Sekunden. Beginnen Sie mit der Auswahl von Infrastruktur in der Hauptnavigationsleiste von Morpheus. Wählen Sie oben im Fenster "Infrastruktur" die Option "Hosts" 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 einen Container-Hosttyp im Menü aus, wählen Sie eine Gruppe aus und geben Sie dann 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, bei denen es sich standardmäßig um den zuvor eingegebenen Containernamen handelt. Klicken Sie auf Weiter und fügen Sie anschließend alle optionalen Automatisierungsworkflows hinzu. Überprüfen Sie abschließend Ihre Einstellungen und klicken Sie auf Fertig stellen, um sie zu speichern.

Schritt 2: Hinzufügen der Docker-Registry-Integration zu öffentlichen oder privaten Clouds Adam Hicks beschreibt in einem anderen Morpheus-Tutorial, wie einfach die Integration in eine private Docker-Registry ist. (Es ist keine zusätzliche Konfiguration erforderlich, um mit Morpheus Images mit dem öffentlichen Docker-Hub von Docker über die öffentliche Docker-API bereitzustellen.)

Wählen Sie auf der Registerkarte "Admin" der Hauptnavigationsleiste die Option "Integrationen" aus und klicken Sie dann auf die Schaltfläche "+ Neue Integration" auf der rechten Seite des Bildschirms. Wählen Sie im angezeigten Fenster Integration 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 Docker unter Typ im Dialogfeld Instanz erstellen, 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 ausgeführt. Die Unterstützung von Morpheus enthält Anweisungen zum Anzeigen von Sicherungen, Erstellen einer Instanzsicherung und Erstellen einer Serversicherung.

1
thelefty07

Wenn Sie einen so einfachen Fall wie meinen haben, können Sie Folgendes tun:

  1. Erstellen Sie eine Docker-Datei, die das Basis-Image Ihres Containers erweitert
  2. Ich gehe davon aus, dass Ihre Volumes Ihrem Dateisystem zugeordnet sind, sodass Sie diese Dateien/Ordner einfach mit ADD folder destination Zu Ihrem Image hinzufügen können.
  3. Getan!

Angenommen, Sie haben die Daten von den Datenträgern in Ihrem Ausgangsverzeichnis, z. B. bei /home/mydata, Können Sie Folgendes ausführen:

DOCKERFILE=/home/dockerfile.bk-myimage
docker build --rm --no-cache -t $IMAGENAME:$TAG -f $DOCKERFILE /home/pirate

Wo Ihre DOCKERFILE auf eine Datei wie diese verweist:

FROM user/myimage
MAINTAINER Danielo Rodríguez Rivero <[email protected]>

WORKDIR /opt/data
ADD mydata .

Der Rest des Materials wird vom Basisimage geerbt. Sie können das Bild jetzt in die Docker-Cloud verschieben, und Ihre Benutzer haben die Daten direkt auf ihren Containern verfügbar

0
Danielo515

Wenn Sie eine vollständige Sicherung wünschen, müssen Sie einige Schritte ausführen:

  1. Übernehmen Sie den Container zu einem Bild
  2. Speichern Sie das Bild
  3. Sichern Sie das Volume des Containers, indem Sie eine Tar-Datei des Mount-Punkts des Volumes im Container erstellen.
  4. Wiederholen Sie die Schritte 1-3 auch für den Datenbankcontainer.

Beachten Sie, dass nur ein Docker-Commit des Containers für ein Image KEINE Volumes enthält, die an den Container angehängt sind (ref: Docker-Commit-Dokumentation ).

" Die Festschreibungsoperation enthält keine Daten in Datenträgern, die im Container bereitgestellt sind. "

0
eaglet3d