Volume-Daten zwischen Hosts migrieren - Container-Daten umziehen

Volume-Daten zwischen Hosts migrieren - Container-Daten umziehen

Einen Container von Server A nach Server B umziehen ist einfach – die Daten mitzunehmen erfordert etwas mehr Sorgfalt.

Vorbereitung: Container stoppen

Immer zuerst den Container stoppen bevor man Daten kopiert. Läuft eine Datenbank während des Exports, können die Daten inkonsistent sein.

docker compose stop app db

Methode 1: tar-Export und -Import

Die universellste Methode funktioniert mit jedem Volume-Typ.

Auf dem Quell-Host exportieren:

# Volume-Inhalt als tar.gz archivieren
docker run --rm \
  -v myvolume:/data \
  -v $(pwd):/backup \
  alpine tar czf /backup/volume-backup.tar.gz -C /data .

Das erzeugt volume-backup.tar.gz im aktuellen Verzeichnis. Die Datei auf den Ziel-Host übertragen:

scp volume-backup.tar.gz user@zielserver:/tmp/

Auf dem Ziel-Host importieren:

# Ziel-Volume anlegen
docker volume create myvolume

# Daten einspielen
docker run --rm \
  -v myvolume:/data \
  -v /tmp:/backup \
  alpine tar xzf /backup/volume-backup.tar.gz -C /data

Danach Container starten und prüfen ob alles stimmt.

Methode 2: rsync über den Host-Pfad

Wenn man direkten Zugriff auf den Host-Pfad hat (z.B. als root):

# Mountpoint ermitteln
docker volume inspect myvolume --format '{{.Mountpoint}}'
# → /var/lib/docker/volumes/myvolume/_data

# Mit rsync zum Zielserver synchronisieren
rsync -avz --progress \
  /var/lib/docker/volumes/myvolume/_data/ \
  user@zielserver:/var/lib/docker/volumes/myvolume/_data/

Das Ziel-Volume muss vorher existieren. Diese Methode eignet sich gut für inkrementelle Synchronisierungen.

Methode 3: Datenbank-Dump (bevorzugt für DBs)

Für Datenbanken ist immer der native Dump-Mechanismus die sicherste Wahl. Er ist konsistent, portabel und unabhängig vom Speicher-Backend.

PostgreSQL:

# Dump auf dem Quell-Host
docker exec -t mypostgres pg_dumpall -U postgres > dump.sql

# Wiederherstellen auf dem Ziel-Host
cat dump.sql | docker exec -i mypostgres psql -U postgres

MySQL/MariaDB:

# Dump
docker exec mydb mysqldump -u root -psecret --all-databases > dump.sql

# Wiederherstellen
cat dump.sql | docker exec -i mydb mysql -u root -psecret

MongoDB:

docker exec mymongo mongodump --archive --gzip > mongo-backup.gz
cat mongo-backup.gz | docker exec -i mymongo mongorestore --archive --gzip

Welche Methode wählen?

| Szenario | Methode |
|---|---|
| Datenbank (MySQL, Postgres, Mongo) | Nativer Dump |
| Beliebige Dateien/Upload-Ordner | tar-Export |
| Regelmäßige Synchronisierung | rsync |
| Volumes auf NFS/Cloud-Backend | Backend direkt nutzen |

Integrität prüfen

Nach dem Import nicht vergessen zu prüfen:

# Container starten und Logs beobachten
docker compose up -d
docker compose logs -f db

Für Datenbanken: Tabellen zählen, wichtige Datensätze manuell kontrollieren, Applikation testen.