Wie man Docker-Volumes auf einen anderen Host migriert

DockerDockerBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Docker-Volumes bieten persistenten Speicher für containerisierte Anwendungen und ermöglichen es, dass Daten auch dann erhalten bleiben, wenn Container gestoppt oder entfernt werden. Mit der Weiterentwicklung Ihrer Infrastruktur kann es erforderlich sein, diese Volumes auf verschiedene Hosts zu migrieren, um Skalierung, Upgrades oder die Verlagerung Ihrer Dienste zu unterstützen.

Dieses Tutorial führt Sie durch den Prozess der Migration von Docker-Volumes zwischen Hosts. Sie lernen, wie Sie Volumes erstellen, sie mit Daten füllen, sie sichern und sie auf einem neuen Host wiederherstellen. Am Ende dieses Labs werden Sie ein klares Verständnis der Docker-Volume-Migrationsmethoden haben, um die Datenkontinuität in Ihren containerisierten Umgebungen sicherzustellen.

Docker-Volumes verstehen und erstellen

Docker-Volumes bieten persistenten Speicher für Ihre Container. Bevor Sie Volumes migrieren, müssen Sie verstehen, was sie sind und wie man sie erstellt.

Was sind Docker-Volumes?

Docker-Volumes sind der bevorzugte Mechanismus zur Persistenz von Daten, die von Docker-Containern generiert und verwendet werden. Im Gegensatz zu Daten, die in der beschreibbaren Schicht eines Containers gespeichert werden und beim Entfernen des Containers verloren gehen, werden Volumes vollständig von Docker verwaltet und existieren unabhängig von Containern.

Einige wichtige Vorteile von Docker-Volumes sind:

  • Datenpersistenz über Container-Lebenszyklen hinweg
  • Fähigkeit, Daten zwischen Containern auszutauschen
  • Bessere Leistung als das Dateisystem des Containers
  • Unabhängige Verwaltung von Containern

Erstellen Ihres ersten Docker-Volumes

Beginnen wir mit der Erstellung eines einfachen Docker-Volumes:

docker volume create my-data-volume

Wenn Sie diesen Befehl ausführen, erstellt Docker ein neues Volume mit dem Namen my-data-volume. Sie sollten den Volumenamen im Terminal sehen:

my-data-volume

Sie können alle Docker-Volumes auf Ihrem System mit dem folgenden Befehl auflisten:

docker volume ls

Dies zeigt eine Tabelle aller Volumes an:

DRIVER    VOLUME NAME
local     my-data-volume

Untersuchen eines Docker-Volumes

Um weitere Details zu Ihrem Volume zu erhalten, verwenden Sie den Befehl inspect:

docker volume inspect my-data-volume

Sie sehen detaillierte Informationen über das Volume im JSON-Format:

[
  {
    "CreatedAt": "2023-10-01T12:34:56Z",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/my-data-volume/_data",
    "Name": "my-data-volume",
    "Options": {},
    "Scope": "local"
  }
]

Beachten Sie den Wert Mountpoint – hier speichert Docker die Volumendaten auf dem Host-System.

Verwenden eines Docker-Volumes mit einem Container

Nachdem Sie ein Volume erstellt haben, verwenden wir es mit einem Container. Wir erstellen einen einfachen Container, der das Volume einbindet und einige Daten hinzufügt:

docker run --name my-container -v my-data-volume:/data ubuntu /bin/bash -c "echo 'Hello from Docker volume' > /data/test.txt"

Dieser Befehl:

  • Erstellt einen Container mit dem Namen my-container
  • Bindet my-data-volume in das Verzeichnis /data innerhalb des Containers ein
  • Führt einen einfachen Befehl aus, um Text in eine Datei in diesem Verzeichnis zu schreiben

Lassen Sie uns überprüfen, ob die Daten in das Volume geschrieben wurden, indem wir einen anderen Container erstellen, der dasselbe Volume einbindet:

docker run --rm -v my-data-volume:/data ubuntu cat /data/test.txt

Sie sollten die Ausgabe sehen:

Hello from Docker volume

Dies zeigt, dass die Daten im Volume erhalten bleiben und von verschiedenen Containern abgerufen werden können.

Vorbereitung der Volume-Migration

Bevor wir ein Docker-Volume auf einen anderen Host migrieren, müssen wir unsere Quelldaten vorbereiten und den Migrationsprozess verstehen. In diesem Schritt fügen wir unserem Volume weitere Daten hinzu und bereiten es für die Migration vor.

Hinzufügen weiterer Daten zum Volume

Erstellen wir einen Container, der unserem Volume weitere Daten hinzufügt. Dies hilft zu demonstrieren, dass alle Volumendaten ordnungsgemäß migriert werden:

docker run --name data-generator -v my-data-volume:/data ubuntu /bin/bash -c "mkdir -p /data/config && echo 'database_url=postgres://user:password@db:5432/mydb' > /data/config/settings.conf && echo 'This is important data' > /data/important.txt"

Dieser Befehl erstellt Verzeichnisse und Dateien mit Beispielinhalten in unserem Volume.

Überprüfen wir die Datenstruktur in unserem Volume:

docker run --rm -v my-data-volume:/data ubuntu ls -la /data

Sie sollten eine ähnliche Ausgabe sehen:

total 12
drwxr-xr-x 3 root root 4096 Oct  1 12:34 .
drwxr-xr-x 1 root root 4096 Oct  1 12:34 ..
drwxr-xr-x 2 root root 4096 Oct  1 12:34 config
-rw-r--r-- 1 root root   21 Oct  1 12:34 important.txt
-rw-r--r-- 1 root root   24 Oct  1 12:34 test.txt

Überprüfen wir auch den Inhalt einer unserer Dateien:

docker run --rm -v my-data-volume:/data ubuntu cat /data/important.txt

Ausgabe:

This is important data

Verständnis der Volume-Migrationsansätze

Es gibt verschiedene Ansätze zur Migration von Docker-Volumes:

  1. Direkte Host-zu-Host-Kopie (Direct host-to-host copy): Direktes Kopieren der Volumendaten zwischen Hosts
  2. Backup und Wiederherstellung (Backup and restore): Erstellen eines Backup-Archivs und Wiederherstellen auf dem neuen Host
  3. Verwendung von Docker-Plugins (Using Docker plugins): Einige Speicher-Plugins verfügen über integrierte Replikationsfunktionen

Für dieses Lab verwenden wir den Backup- und Wiederherstellungsansatz, der in den meisten Umgebungen funktioniert und keine speziellen Plugins erfordert.

Erstellen eines Backups des Volumes

Um ein Backup unseres Volumes zu erstellen, verwenden wir einen Docker-Container, um den Volume-Inhalt zu archivieren:

docker run --rm -v my-data-volume:/source -v $(pwd):/backup ubuntu tar cvf /backup/my-data-volume-backup.tar -C /source .

Dieser Befehl:

  • Bindet unser Volume unter /source im Container ein
  • Bindet das aktuelle Verzeichnis unter /backup im Container ein
  • Erstellt ein Tar-Archiv von allem im Verzeichnis /source und speichert es unter /backup/my-data-volume-backup.tar

Überprüfen Sie, ob die Backup-Datei erstellt wurde:

ls -lh my-data-volume-backup.tar

Sie sollten so etwas sehen:

-rw-r--r-- 1 labex labex 10K Oct  1 12:34 my-data-volume-backup.tar

Untersuchen wir den Inhalt der Backup-Datei, um sicherzustellen, dass alles ordnungsgemäß archiviert wurde:

tar -tf my-data-volume-backup.tar

Die Ausgabe sollte Folgendes enthalten:

./
./config/
./config/settings.conf
./important.txt
./test.txt

Nachdem wir nun ein Backup unseres Volumes erstellt haben, sind wir bereit, die Migration auf einen neuen Host zu simulieren.

Simulieren der Volume-Migration auf einen neuen Host

In einem realen Szenario würden Sie die Backup-Datei mit Tools wie scp, rsync oder einem File-Sharing-Dienst auf einen neuen Host übertragen. Für dieses Lab simulieren wir eine Migration, indem wir unser ursprüngliches Volume entfernen und ein neues erstellen, um unsere Daten wiederherzustellen.

Simulieren einer neuen Host-Umgebung

Zuerst bereinigen wir unsere alten Container, um den Umzug in eine neue Umgebung zu simulieren:

docker rm -f my-container data-generator

Entfernen wir nun unser ursprüngliches Volume, um einen Neustart auf einem neuen Host zu simulieren:

docker volume rm my-data-volume

Erstellen Sie ein neues Volume, das unser Volume auf dem "neuen Host" darstellt:

docker volume create my-new-host-volume

Wiederherstellen des Volumes aus dem Backup

Nun stellen wir unser Backup auf dem neuen Volume wieder her:

docker run --rm -v my-new-host-volume:/destination -v $(pwd):/backup ubuntu bash -c "cd /destination && tar xvf /backup/my-data-volume-backup.tar"

Dieser Befehl:

  • Erstellt einen temporären Container
  • Bindet unser neues Volume unter /destination ein
  • Bindet das aktuelle Verzeichnis (in dem sich unser Backup befindet) unter /backup ein
  • Extrahiert das Tar-Archiv in das Verzeichnis /destination

Überprüfen der wiederhergestellten Daten

Überprüfen wir, ob alle unsere Daten ordnungsgemäß auf dem neuen Volume wiederhergestellt wurden:

docker run --rm -v my-new-host-volume:/data ubuntu ls -la /data

Sie sollten die gleiche Dateistruktur wie zuvor sehen:

total 12
drwxr-xr-x 3 root root 4096 Oct  1 12:34 .
drwxr-xr-x 1 root root 4096 Oct  1 12:34 ..
drwxr-xr-x 2 root root 4096 Oct  1 12:34 config
-rw-r--r-- 1 root root   21 Oct  1 12:34 important.txt
-rw-r--r-- 1 root root   24 Oct  1 12:34 test.txt

Überprüfen Sie den Inhalt einer unserer Dateien, um sicherzustellen, dass die Daten intakt sind:

docker run --rm -v my-new-host-volume:/data ubuntu cat /data/important.txt

Ausgabe:

This is important data

Überprüfen Sie auch die Konfigurationsdatei:

docker run --rm -v my-new-host-volume:/data ubuntu cat /data/config/settings.conf

Ausgabe:

database_url=postgres://user:password@db:5432/mydb

Verwenden des wiederhergestellten Volumes mit einem neuen Container

Nachdem wir unser Volume erfolgreich "migriert" haben, verwenden wir es mit einem neuen Container:

docker run --name my-new-container -v my-new-host-volume:/app/data -d nginx

Dies erstellt einen neuen Nginx-Container, der unser wiederhergestelltes Volume unter /app/data einbindet.

Überprüfen wir, ob der Container auf die Volumendaten zugreifen kann:

docker exec my-new-container ls -la /app/data

Sie sollten die gleichen Dateien wie zuvor sehen, was bestätigt, dass die Migration erfolgreich war.

Aktualisieren von Anwendungen zur Verwendung des neuen Volumes

In einem realen Szenario müssten Sie nach der Migration von Volumes auf einen neuen Host Ihre Docker Compose-Dateien oder Container-Ausführungsbefehle aktualisieren, um die neuen Volumennamen oder -pfade zu verwenden. Wenn Sie beispielsweise Docker Compose verwenden, könnten Sie Ihre docker-compose.yml-Datei wie folgt aktualisieren:

version: "3"
services:
  webapp:
    image: nginx
    volumes:
      - my-new-host-volume:/app/data
volumes:
  my-new-host-volume:
    external: true

Dies weist Docker an, das extern erstellte Volume mit dem Namen my-new-host-volume zu verwenden.

Der Migrationsprozess ist nun abgeschlossen! Sie haben erfolgreich:

  1. Ein Docker-Volume erstellt und Daten hinzugefügt
  2. Die Volumendaten gesichert
  3. Ein neues Volume auf einem simulierten "neuen Host" erstellt
  4. Die Backup-Daten auf dem neuen Volume wiederhergestellt
  5. Die Datenintegrität überprüft
  6. Einen neuen Container mit dem migrierten Volume verbunden

Best Practices und erweiterte Migrationstechniken

Nachdem Sie die Grundlagen der Docker-Volume-Migration verstanden haben, wollen wir uns einige Best Practices und erweiterte Techniken ansehen, um Ihre Volume-Migrationen effizienter und robuster zu gestalten.

Planung der Volume-Migration

Berücksichtigen Sie bei der Planung der Volume-Migration folgende Faktoren:

  1. Volume-Größe (Volume Size): Größere Volumes benötigen mehr Zeit für die Übertragung und erfordern möglicherweise eine spezielle Behandlung.
  2. Ausfallzeitanforderungen (Downtime Requirements): Bestimmen Sie, wie viel Ausfallzeit Ihre Anwendung tolerieren kann.
  3. Datenempfindlichkeit (Data Sensitivity): Stellen Sie sicher, dass sensible Daten während der Übertragung ordnungsgemäß gesichert werden.
  4. Netzwerkbandbreite (Network Bandwidth): Berücksichtigen Sie die verfügbare Bandbreite zwischen den Hosts.

Automatisierung des Migrationsprozesses

Für häufige Migrationen oder Migrationen mehrerer Volumes kann die Automatisierung Zeit sparen und Fehler reduzieren. Erstellen wir ein einfaches Shell-Skript, das den Backup- und Wiederherstellungsprozess automatisiert:

nano migrate-volume.sh

Fügen Sie dem Skript den folgenden Inhalt hinzu:

#!/bin/bash
## Simple Docker volume migration script

if [ $## -ne 2 ]; then
  echo "Usage: $0 <source_volume> <destination_volume>"
  exit 1
fi

SOURCE_VOLUME=$1
DEST_VOLUME=$2
BACKUP_FILE="/tmp/${SOURCE_VOLUME}-backup.tar"

echo "Creating backup of ${SOURCE_VOLUME}..."
docker run --rm -v ${SOURCE_VOLUME}:/source -v /tmp:/backup ubuntu tar cf /backup/${SOURCE_VOLUME}-backup.tar -C /source .

echo "Creating destination volume ${DEST_VOLUME}..."
docker volume create ${DEST_VOLUME}

echo "Restoring backup to ${DEST_VOLUME}..."
docker run --rm -v ${DEST_VOLUME}:/destination -v /tmp:/backup ubuntu bash -c "cd /destination && tar xf /backup/${SOURCE_VOLUME}-backup.tar"

echo "Migration complete. Verifying volume contents..."
docker run --rm -v ${DEST_VOLUME}:/data ubuntu ls -la /data

echo "Done!"

Speichern Sie die Datei (Strg+O, dann Eingabe) und beenden Sie sie (Strg+X).

Machen Sie das Skript ausführbar:

chmod +x migrate-volume.sh

Jetzt können Sie Volumes mit einem einzigen Befehl migrieren:

./migrate-volume.sh my-new-host-volume another-volume

Dadurch wird ein Backup von my-new-host-volume erstellt, ein neues Volume namens another-volume erstellt und das Backup darauf wiederhergestellt.

Umgang mit großen Volumes

Für große Volumes ist der grundlegende Tar-Ansatz möglicherweise ineffizient. Hier sind einige Alternativen:

  1. Inkrementelle Backups (Incremental Backups): Übertragen Sie nur Änderungen seit dem letzten Backup.
  2. Komprimierung (Compression): Verwenden Sie die Komprimierung, um die Größe des Backups zu reduzieren.
  3. Direkte Kopie (Direct Copy): Verwenden Sie rsync, um direkt zwischen Hosts zu kopieren.

Implementieren wir einen Ansatz mit komprimiertem Backup:

docker run --rm -v my-new-host-volume:/source -v $(pwd):/backup ubuntu tar czf /backup/compressed-backup.tar.gz -C /source .

Die Option z, die zu tar hinzugefügt wurde, aktiviert die Komprimierung, was zu einer kleineren Backup-Datei führt. Dies ist besonders nützlich für textlastige Daten.

So stellen Sie aus einem komprimierten Backup wieder her:

docker volume create compressed-volume
docker run --rm -v compressed-volume:/destination -v $(pwd):/backup ubuntu bash -c "cd /destination && tar xzf /backup/compressed-backup.tar.gz"

Volume-Migration in Produktionsumgebungen

In Produktionsumgebungen können Sie diese zusätzlichen Ansätze in Betracht ziehen:

  1. Speichertreiber-Replikation (Storage Driver Replication): Einige Speichertreiber unterstützen die integrierte Replikation.
  2. Docker Volume-Plugins (Docker Volume Plugins): Verwenden Sie spezielle Plugins für Ihr Speichersystem.
  3. Datenbank-Backups (Database Backups): Verwenden Sie für Datenbank-Volumes die nativen Backup-Tools der Datenbank.
  4. Geplante Migrationen (Scheduled Migrations): Verwenden Sie Tools wie Cron, um regelmäßige Backups zu planen.

Bereinigung

Bevor wir dieses Lab beenden, wollen wir unsere Ressourcen bereinigen:

docker rm -f my-new-container
docker volume rm my-new-host-volume another-volume compressed-volume
rm my-data-volume-backup.tar compressed-backup.tar.gz migrate-volume.sh

Dies schließt Ihre Reise durch die Docker-Volume-Migration ab. Sie verfügen nun über das Wissen und die Werkzeuge, um Docker-Volumes zwischen Hosts effektiv zu migrieren und sicherzustellen, dass die Daten Ihrer containerisierten Anwendungen während Infrastrukturänderungen intakt bleiben.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie man Docker-Volumes zwischen Hosts migriert, was eine wesentliche Fähigkeit für die Verwaltung containerisierter Anwendungen ist. Sie haben praktische Erfahrung gesammelt mit:

  • Erstellen und Verwalten von Docker-Volumes
  • Hinzufügen und Zugreifen auf Daten in Docker-Volumes
  • Sichern von Volumendaten mit dem Befehl tar
  • Wiederherstellen von Volumendaten auf einem neuen Host
  • Überprüfen der Datenintegrität nach der Migration
  • Erstellen von Automatisierungsskripten für die Volume-Migration
  • Umgang mit verschiedenen Migrationsszenarien, einschließlich großer Volumes

Diese Fähigkeiten ermöglichen es Ihnen, die Datenkontinuität beim Verschieben von Containern zwischen Umgebungen, beim Skalieren Ihrer Infrastruktur oder beim Durchführen von System-Upgrades aufrechtzuerhalten. Die Docker-Volume-Migration ist ein grundlegender Vorgang, mit dem Sie Ihre containerisierten Anwendungen mit Zuversicht verwalten können, da Sie wissen, dass Ihre persistenten Daten bei Bedarf sicher und zuverlässig übertragen werden können.