Docker Backup und Restore - eine kleine Anleitung

Aus Laub-Home.de Wiki
Zur Navigation springen Zur Suche springen

Das Sichern von Docker Containern und dessen Volumes sollte man auf jeden Fall nicht dem Zufall überlassen. Ein Restore Test ist ebenfalls obligatorisch, denn was nutzt das beste Backup wenn man es im Ernstfall nicht schnell und einfach zurückspielen kann. In der Theorie sieht ein Backup Szenario bei Docker so aus, dass man Volumes mittels "Hilfskontainer" via tar sichert. Datenbanken können entweder über den eigenen Container, oder auch über einen "Hilfskontainer" mit den gängigen DUMP-Befehlen gesichert werden. Zusätzlich sollte man alle Projekt spezifischen Dateien, zum Beispiel das docker-compose.yml oder das .env File gesichert werden. Sämtliche andere Konfigurationsdateien, die man in den Container mountet sollten ebenfalls gesichert werden. Diese liegen alle normalerweise im Docker Compose Projekt Ordner, also ist es ein Anfang diesen einfach weg zusichern. Wichtig beim Backup ist ebenfalls, es sollte nicht auf dem selben System liegen, oder bleiben. Am besten hat man eine Kopie des lokalen Backup Ordners noch irgendwo auf einem zweit System, oder auf irgendeinem Cloud Laufwerk. Einfach an einem Ort der bei einem Systemcrash und am besten auch bei einem RZ Ausfall noch verfügbar ist. Mehrere Versionen der Backups aufzuheben macht es einfach, falls man aus Versehen etwas geändert hat und es wieder Rückgängig machen möchte.
Zusammengefasst heißt das:

  • Volumes via Hilfskontainer und TAR sichern
  • Datenbanken via Container und Dump- (Datenbank Sicherungs-) Tool sichern
  • Docker Compose Projekt Ordner sichern
  • Optional: Docker Container bzw. Image sichern
  • Optional: Dateien, die außerhalb des Compose Projekt Ordners liegen und in einen Container gemountet sind, sichern.

Manuelles Backup und Restore

Hier ein paar Tips wie man manuell Docker Container bzw. deren Applikationen sichert und wiederherstellt.

Docker Volume

Zuerst sollte man wissen wie das zu sichernde Docker Volume heißt. Eine Übersicht ergibt der folgende Befehl:

docker volume ls

Ich möchte das Volume mit dem Namen test-data sichern, mein Backup Verzeichnis soll /backup/volumes/ sein, welches vorher angelegt werden muss:

mkdir -p /backup/volumes/
docker run --rm \
        -v /backup/volumes:/backup \
        -v test-data:/data:ro \
        debian:stretch-slim bash -c "cd /data && /bin/tar -czvf /backup/test-data.tar.gz ."

Zum Restore das Ganze einfach umdrehen.

docker run --rm \
        -v /backup/volumes:/backup \
        -v test-data:/data \
        debian:stretch-slim bash -c "cd /data && /bin/tar -xzvf /backup/test-data.tar.gz"

Nun sollten wieder alle Dateien an Ort und Stelle sein. Falls Dateien am Ort vorhanden sind, werden diese mit den Dateien aus dem Backup überschrieben.

MySQL / MariaDB

So kann man ganz einfach eine MySQL oder eine MariaDB mittels mysqldump und mysql Sichern und Wiederherstellen:

# Backup (Sichern)
docker exec CONTAINERNAME /usr/bin/mysqldump -u root --password=ROOTPASSWORD DATABASE > backup.sql

# Restore (Wiederherstellen)
cat backup.sql | docker exec -i CONTAINERNAME /usr/bin/mysql -u root --password=ROOTPASSWORD DATABASENAME

und das Ganze nun noch komprimiert mit gzip:

# Backup (Sichern)
docker exec CONTAINERNAME /usr/bin/mysqldump -u root --password=ROOTPASSWORD DATABASE | gzip > backup.sql.gz

# Restore (Wiederherstellen)
zcat backup.sql.gz | docker exec -i CONTAINERNAME /usr/bin/mysql -u root --password=ROOTPASSWORD DATABASENAME

PostgreSQL

Baustelle-100px.png Work in Progress:
Diese Seite wird erst noch aufgebaut. Bitte noch keine Änderungen vornehmen, ohne mit dem ursprünglichen Author zu sprechen!
Vielen Dank.

Docker Compose Projekt Ordners

Um ein Compose Projekt zu sichern ist es am besten einfach ein tar.gz des gesamten Ordners zu erstellen:

mkdir /opt/backup-compose-projects/
cd /opt/composeproject1
tar -czvf /opt/backup-compose-projects/composeproject1.tar.gz .

Der Restore erfolgt dann durch Entpacken des tar.gz

mkdir /opt/composeproject1
cd /opt/composeproject1
tar -xzvf /opt/backup-compose-projects/composeproject1.tar.gz

schon ist alles wieder an Ort und Stelle.

Docker Container bzw. Image

Auch Docker Container oder Images selbst kann man sichern und wiederherstellen, oder besser gesagt, man kann so den Status eines Containers in ein Image abspeichern (wie einen Snapshot). Das erstellte Image bzw. der Snapshot kann dann gesichert werden. Dies kann Sinn machen, wenn man zu Debugging Zwecken einen Container mit dem aktuellen Stand in eine Testumgebung kopieren möchte, um dort dann ausgiebig zu troubleshooten.
Wir wollen nun wissen wie unser Container heißt, mit diesem Befehl bekommt man eine Übersicht aller laufender Container:

docker ps

nun sucht man sich den zu sichernden Container heraus und nutzt entweder dessen CONTAINER ID oder den Namen:

docker commit -p CONTAINER-ID BACKUP-NAME

verifizieren kann man das nun mit folgendem Befehl, in der Liste sollte nun irgendwo der BACKUP-NAME auftauchen

docker image ls

Um das Image nun auf der Festplatte abzuspeichern:

docker save -o backup-name.tar BACKUP-NAME

komprimieren kann man die Datei zum Schluss ebenfalls noch

gzip backup-name.tar

Nun hat man eine komprimierte Version des Docker Containers.

Der Restore des Images erfolgt dann mit docker load:

docker load -i backup-name.tar

Um den Container wieder herzustellen, kann dann einfach das Image mit docker run gestartet werden:

docker run -d --name NEWCONTAINERNAME BACKUP-NAME

Backup via Script

Restore Test auf Raspberry Pi

Ich habe um die ganzen Backup Scripte und Backup Dateien zu testen einen Restore Test auf einem Raspberry Pi durchgeführt. Wie ja alle wissen, ein Backup ist nur so gut wie der anschließende Restore.

Quellen