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-volumein das Verzeichnis/datainnerhalb 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:
- Direkte Host-zu-Host-Kopie (Direct host-to-host copy): Direktes Kopieren der Volumendaten zwischen Hosts
- Backup und Wiederherstellung (Backup and restore): Erstellen eines Backup-Archivs und Wiederherstellen auf dem neuen Host
- 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
/sourceim Container ein - Bindet das aktuelle Verzeichnis unter
/backupim Container ein - Erstellt ein Tar-Archiv von allem im Verzeichnis
/sourceund 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
/destinationein - Bindet das aktuelle Verzeichnis (in dem sich unser Backup befindet) unter
/backupein - 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:
- Ein Docker-Volume erstellt und Daten hinzugefügt
- Die Volumendaten gesichert
- Ein neues Volume auf einem simulierten "neuen Host" erstellt
- Die Backup-Daten auf dem neuen Volume wiederhergestellt
- Die Datenintegrität überprüft
- Einen neuen Container mit dem migrierten Volume verbunden
Best Practices und fortgeschrittene Migrationstechniken
Nachdem Sie die Grundlagen der Docker-Volume-Migration verstanden haben, wollen wir nun einige Best Practices und fortgeschrittene Techniken untersuchen, um Ihre Volume-Migrationen effizienter und robuster zu gestalten.
Planung der Volume-Migration
Bei der Planung einer Volume-Migration sollten Sie folgende Faktoren berücksichtigen:
- Volume-Größe: Größere Volumes benötigen länger für die Übertragung und erfordern möglicherweise spezielle Handhabung.
- Ausfallzeitanforderungen: Bestimmen Sie, wie viel Ausfallzeit Ihre Anwendung tolerieren kann.
- Datensensibilität: Stellen Sie sicher, dass sensible Daten während der Übertragung ordnungsgemäß gesichert werden.
- Netzwerkbandbreite: Berücksichtigen Sie die verfügbare Bandbreite zwischen den Hosts.
Automatisierung des Migrationsprozesses
Für häufige Migrationen oder die Migration 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 den folgenden Inhalt zum Skript 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 Enter) und beenden Sie den Editor (Strg+X).
Machen Sie das Skript ausführbar:
chmod +x migrate-volume.sh
Nun können Sie Volumes mit einem einzigen Befehl migrieren:
./migrate-volume.sh my-new-host-volume another-volume
Dies erstellt ein Backup von my-new-host-volume, erstellt ein neues Volume namens another-volume und stellt das Backup darauf wieder her.
Umgang mit großen Volumes
Für große Volumes ist der grundlegende tar-Ansatz möglicherweise nicht effizient. Hier sind einige Alternativen:
- Inkrementelle Backups: Übertragen Sie nur Änderungen seit dem letzten Backup.
- Komprimierung: Verwenden Sie Komprimierung, um die Größe des Backups zu reduzieren.
- Direktes Kopieren: Verwenden Sie
rsync, um direkt zwischen Hosts zu kopieren.
Implementieren wir einen komprimierten Backup-Ansatz:
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.
Um aus einem komprimierten Backup wiederherzustellen:
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önnten Sie folgende zusätzliche Ansätze in Betracht ziehen:
- Storage Driver Replication: Einige Storage Driver unterstützen integrierte Replikation.
- Docker Volume Plugins: Verwenden Sie spezialisierte Plugins für Ihr Speichersystem.
- Datenbank-Backups: Verwenden Sie für Datenbank-Volumes die nativen Backup-Tools der Datenbank.
- Geplante Migrationen: Verwenden Sie Tools wie
cron, um regelmäßige Backups zu planen.
Damit ist Ihre Reise durch die Docker-Volume-Migration abgeschlossen. Sie verfügen nun über das Wissen und die Werkzeuge, um Docker-Volumes effektiv zwischen Hosts zu migrieren und sicherzustellen, dass die Daten Ihrer containerisierten Anwendungen bei 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.



