Automatische Docker Datenbank Backups | Docker DB Backup

Übersicht
In den letzten Beiträgen haben wir ordentlich viele Applikationen und Services in unserem Homelab überwiegend per Docker in Betrieb genommen. Was natürlich nicht fehlen darf ist ein ordentliches Backup, falls doch mal eine Anwendung kaputt geht oder Daten verloren gehen.
Daher wird es in dem heutigen Beitrag um das Thema Backup von Docker Datenbanken gehen. Dabei zeige ich euch, wie ihr mit Hilfe eines Docker Images völlig automatisch eure Datenbank der aller Container sichern könnt. Außerdem werden wir anhand eines Beispiels einen Restore durchspielen.
Das Video zum Beitrag findet ihr hier: https://youtu.be/0JxuFGCaD9Y
Backup
Um eine Datenbank zu sichern wird normalerweise einfach ein aktueller Dump der Datenbank gemacht und dieser gesichert. Dies kann man auch für Datenbanken in Docker machen. Um das ganze noch einfacher und automatischer umzusetzen habe ich vor einer Weile ein Docker Image gefunden, was diesen Task automatisch für euch übernimmt. Dabei scannt er all eure Container auf Datenbank und sichert alle DB´s die er findet automatisch.
Das Image, was wir uns heute anschauen, nennt sich Docker DB Backup.
Setup Docker Container
Als erstes erstellen wir uns einen neuen Docker Container den wir entsprechend mit dem Image konfigurieren. Hierbei stellen wir ein, dass bspw. das Backup jeden Tag um 0:00 Uhr laufen soll und geben an wo die dumps gespeichert werden + die Komprimierung.
Compose
services:
backup:
image: ghcr.io/realorangeone/db-auto-backup:latest
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./backups:/var/backups
environment:
- INCLUDE_LOGS=true
- SCHEDULE=0 0 * * *
- COMPRESSION=gzip
networks: {}
Das war auch schon alles für die Einrichtung. Die Backups bzw. Dumps der DB´s werden nun jeden Tag um die angegebene Uhrzeit gemacht und in dem von euch angegebenen Ort gespeichert.
Restore
Kommen wir nun also zum Restore. Bisher hatte ich in meinem Homelab immer Glück und brauchte noch keins meiner Backups so wirklich. Trotzdem kann der Tag immer kommen und dann ist es wichtig zu wissen, dass auch alles funktioniert und vor allem wie wir die Dumps zum Restoren verwenden können.
Für das Restoren sind nur wenige Schritte nötig. Als erstes solltet ihr die Datenbank komplett leer machen um anschließend die Daten wieder mit dem Dump zu importieren.
Anschließend könnt ihr hier dann mit einem einfachen Befehl euren Dump importieren und die Daten bestehen so wie vorher.
Falls der Restore nicht funktioniert, probiert die Dump Datei vorher in euer Home-Verzeichnis zu kopieren und dann von dort zu Restoren.
Beispiel Restore Postgres
In diesem Beispiel füllen wir eine Postgres Datenbank mit Testdaten, erstellen einen Dump mit dem Docker DB Backup Container, löschen die Daten aus der DB und Restoren diese anschließend mit dem Dump wieder.
- Als erstes erstellen wir uns ein Postgres Docker Cotainer
services:
postgres:
image: postgres:latest
container_name: my_postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_DB: mydatabase
ports:
- 5432:5432
- Wir erstellen eine Datei mit Testdaten auf unserem Host
init_test_data.sql
-- init_test_data.sql
CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
value INT
);
INSERT INTO test_table (name, value) VALUES ('test1', 123), ('test2', 456);
- Nun importieren wir die Daten in unsere Datenbank
cat init_test_data.sql | docker exec -i my_postgres psql -U postgres -d mydatabase
- Mit folgendem Befehl schauen wir, ob die Daten richtig importiert wurden
docker exec -it my_postgres psql -U postgres -d mydatabase -c "SELECT * FROM test_table;"
- Wir starten unseren Docker DB Backup Container einmal an, damit ein Dump von unserer neuen Postgres Datenbank erstellt wird.

- Nun leeren wir die Datenbank
docker exec -it my_postgres psql -U postgres -d mydatabase -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
- Jetzt können wir unseren Dump importieren
cat /path/to/your/dumpfile.gz | docker exec -i my_postgres /bin/bash -c "gunzip | psql -U postgres -d mydatabase"
- Und abschließend prüfen, dass alle Daten wieder da sind
docker exec -it my_postgres psql -U postgres -d mydatabase -c "\dt"
docker exec -it my_postgres psql -U postgres -d mydatabase -c "SELECT * FROM test_table;"