Wie man Docker Container Daten in Docker Volumes speichert

Eine Möglichkeit, einen Container mit Daten zu automatisieren, besteht darin, die Daten innerhalb des Container-Images zu speichern. Dies erfordert jedoch, dass sich in jedem Container, den du ausführst, eine Kopie der Daten befindet, was zu einer Verschwendung von Ressourcen führen kann, wenn die Container hochskaliert werden. Eine bessere Option ist es, eine Kopie der Daten in einem Docker-Volume zu speichern und dieses Volume dann zwischen den Containern zu teilen.

Du kannst dir ein Docker-Volume als einen Ordner vorstellen, der außerhalb des Dateisystems des Containers existiert, auf den die Container, die auf demselben Host laufen, aber trotzdem zugreifen können. Wenn du einen neuen Container erstellst, kannst du entweder ein bestehendes Volume mounten oder ein neues Volume erstellen. Wenn du ein neues Volume erstellst, erstellt Docker automatisch eine neue Speicherschicht auf dem zugrunde liegenden Host-Dateisystem und initialisiert sie mit den von dir angegebenen Daten.

Sobald du ein Volume erstellt hast, kannst du es zum Speichern beliebiger Daten verwenden, z. B. für statische Dateien, Anwendungsdaten oder Protokolle. Du kannst Volumes auch nutzen, um Daten zwischen Containern auszutauschen.

Wenn du zum Beispiel eine Webanwendung hast, die in einem Container läuft, kannst du ein Volume verwenden, um den Quellcode der Anwendung zu speichern, damit die anderen Container in deinem Einsatz darauf zugreifen können. Auf diese Weise kannst du den Quellcode deiner Anwendung getrennt von der Laufzeitumgebung aufbewahren, was es einfacher macht, deine Anwendung zu aktualisieren und neu zu verteilen.

Du kannst nicht nur Daten zwischen Containern austauschen, sondern auch Volumes verwenden, um Daten zu erhalten, wenn du deine Container stoppst und startest. Auf diese Weise sind deine Daten auch dann sicher, wenn deine Container versehentlich gelöscht oder gestoppt werden.

In diesem Leitfaden lernst du, wie Docker-Volumes mit Containern interagieren. Dazu erstellst du neue Container und verwendest Volumes, um Daten zwischen ihnen zu speichern und auszutauschen. Dann erfährst du, wie du den Platz freimachst, den anonyme Volumes, die automatisch von den Containern erzeugt werden, hinterlassen haben. Schließlich erfährst du, wie du die Daten deiner Docker-Volumes sichern kannst.

Los geht’s!

Voraussetzungen

  • Um diesem Leitfaden zu folgen, solltest du mit den Grundlagen der Arbeit mit Docker-Containern vertraut sein.
  • Dieser Leitfaden geht davon aus, dass du einen Linux-Host verwendest. In diesem Leitfaden wird CentOS verwendet, aber die gleichen Schritte sollten auch auf jeder anderen Linux-Distribution funktionieren.
  • Du musst Docker auf deinem Rechner installiert haben und ausführen. Wenn du es noch nicht installiert hast, befolge die Anweisungen in unserem Installationshandbuch.
  • Ein Benutzerkonto mit Root-Rechten
  • Du hast Docker auf dem Linux-Host installiert.

Anonyme Docker-Volumes aufspüren

Wenn du einen neuen Docker-Container erstellst, wird standardmäßig ein neues anonymes Volume auf dem Dateisystem des Hosts erstellt. Dieses Volume wird verwendet, um die Daten zu speichern, die der Container benötigt.

1. Führe den folgenden Befehl aus, um zu prüfen, ob Docker läuft und aktiv ist.

sudo systemctl status docker

Docker-Status

2. Führe den folgenden Befehl aus, um dein Benutzerkonto zur Docker-Gruppe hinzuzufügen, damit du Docker-Befehle ohne sudo ausführen kannst. Sobald du dein Benutzerkonto zur Docker-Gruppe hinzugefügt hast, melde dich ab und wieder an, damit deine Änderungen wirksam werden.

sudo usermod -aG docker $(whoami)

3. Führe den folgendenBefehl aus, um einige Images aus der Docker-Registry auf deinen Host zu ziehen. Mit diesen Images wirst du das Erstellen und Arbeiten mit Docker-Volumes üben.

docker pull postgres:12.1
docker pull bash
docker pull httpd:2.4

4. Führe den folgendenBefehl aus, um die Images aufzulisten, die sich derzeit auf deinem Host befinden, um zu überprüfen, ob die Images gezogen wurden.

docker images

Docker-Images

5. Führe den folgendenBefehl aus, um zu sehen, ob es aktive Volumes auf deinem Host gibt. Du solltest eine ähnliche Ausgabe wie die folgende sehen.

docker volume ls

Du solltest eine leere Ausgabe sehen.

docker volume list

6. Führe den folgenden Befehl aus, um einen neuen Container zu erstellen und zu überprüfen, ob ein neues anonymes Volume auf dem Rechner erstellt wurde. Du verwendest das Flag -d, um den Container im losgelösten Modus auszuführen, damit du im Terminal weiterarbeiten kannst. Mit dem Flag –name gibst du dem Container einen Namen, damit du ihn leicht identifizieren kannst. Du verwendest hierdas postgres:12.1-Image, da Postgres Hintergrundvolumes benötigt, um seine Daten zu speichern. Du solltest zwei Container laufen lassen, einen für jede deiner Postgres-Datenbanken, damit du mehr Informationen sehen kannst.

docker run -d --name db1 postgres:12.1
docker run -d --name db2 postgres:12.1

 einen neuen Container erstellen

7. Führe den folgenden Docker-Befehl aus, um die Container aufzulisten, die derzeit auf deinem Host laufen.

docker ps

Du hast jetzt zwei Container laufen:db1 und db2, wie unten gezeigt.

Containerliste

8. Zeige nun die Volumes an, die auf dem Host erstellt wurden.

docker volume ls

Du wirst eine ähnliche Ausgabe wie die folgende sehen. Sobald Postgres startet, braucht es einen Platz, um seine Daten zu speichern. DaPostgres seine Daten nicht verlieren möchte, erstellt Postgres automatisch anonyme Volumes. Die Volumes werden mit einer zufälligen Zeichenfolge aus Hex-Zeichen benannt(e9f338... undee3423...).

das Volumen auflisten

Schauen wir uns die Volumes mit dem Befehl docker inspect genauer an.

9. Führe den folgenden Befehl aus, um weitere Informationen über den db1 Container in einem lesbaren Format zu erhalten.

docker inspect db1 -f '{{ json .Mounts }}' | python -m json.tool

Wie du unten sehen kannst, stimmt die Zeile e9f338 Name mit der Ausgabe des Befehls docker volume ls überein. Diese Zeile zeigt dir, dass dieses Volume mit dem Container db1 verbunden und gemountet ist.

mehr Informationen über den db1 Container erhalten

10. Mache dasselbe, um den db2 Container zu untersuchen.

docker inspect db2 -f '{{ json .Mounts}}' | python -m json.tool

Du wirst sehen, dass die Ausgabe genau die gleiche ist wie die des db1 Containers, mit Ausnahme des Volume-Namens, der anders lautet. Diese Ausgabe bestätigt, dass Docker für jeden Container, der erstellt wird, ein neues anonymes Volume erstellt.

mehr Informationen über den db2 Container erhalten

11. Führe einen weiteren Container aus. Aber dieses Mal verwenden wir das –rm Flag und sehen, was mit den Volumes passiert. Wir haben diesen Container dbTmp genannt. Lass es uns herausfinden!

docker run -d --rm --name dbTmp postgres:12.1

einen weiteren temporären Container betreiben

Jetzt haben wir drei Container: db1, db2 und dbTmp, die laufen.

docker ps

Containerliste

12. Liste die Volumes erneut auf.

docker volume ls

Du wirst feststellen, dass ein drittes Volume für den dbTmp-Container erstellt worden ist.

das Volumen auflisten

13. Stoppe nun den db2 zusammen mit dem dbTmp Container mit dem folgenden Befehl.

docker stop db2 dbTmp

den Container anhalten

13. Zeige die Container und die Volumes erneut an.

docker ps

docker volume ls

Wie unten zu sehen ist, ist der einzige Container, der noch läuft, der db1 Container. Das Volume für den dbTemp-Container ist jedoch verschwunden, aber das Volume für den db2-Container (ee3423...) ist noch vorhanden.

Dieses Verhalten ist zu erwarten. Das –rm Flag löscht den Container, nachdem er angehalten wurde, zusammen mit allen zugehörigen Volumes. Das Volume für den dbTmp-Container ist verschwunden, weil wir den dbTemp-Containergestoppt haben.Da wir bei der Erstellung des db2-Containers das –rm-Flag nicht angegeben haben, bleibender db2-Container und sein zugehöriges Volume auf dem Rechner, auch wenn wir den Container stoppen. Die Erkenntnis aus diesem Beispiel ist, dass du mit dem –rm-Flag vorsichtig sein musst. Wenn du einen Container mit einem zugehörigen Volume stoppst, wird das Volume gelöscht.

Ein Docker-Volume erstellen

Ein Docker-Volume ist ein benannter Speichercontainer, den du mit dem Befehl docker volume create erstellst. Du verwendest das Volume, um Daten zu speichern oder um Daten zwischen Containern auszutauschen.

1. Führe den folgenden Befehl aus, um ein neues Volume mit dem Namen websitezu erstellen .

docker volume create website

ein neues Volume namens Website erstellen

2. Wenn du die Volumes auflistest, siehst du das neue Volume, das du gerade erstellt hast.

docker volume ls

das Volumen auflisten

3. ladediesen Website-Code von GitHubin dein aktuelles Arbeitsverzeichnis herunter.

4. führe den folgenden Befehl aus, um den heruntergeladenen Website-Code in das Website-Volume zu kopieren.

sudo cp -r /home/cloud_user/widget-factory-inc/web/* /var/lib/docker/volumes/website/_data/

5. Führe den unten stehenden Befehl aus, um die Dateien im Website-Volume aufzulisten.

sudo ls -l /var/lib/docker/volumes/website/_data/

Du kannst sehen, dass der Website-Code jetzt im Website-Volume gespeichert ist.

 listet die Dateien im Website-Volume auf.

6. Jetzt kannst du einen neuen Container starten und das Website-Volume an ihn anhängen. Du verwendest das Flag -v (Volume), um das Volume einzuhängen. Mit dem Flag -p (Port Mapping) ordnest du einen Port auf dem Host einem Port im Container zu. In diesem Beispiel ordnen wir den Port 80 auf dem Host dem Port 80 im Container zu. Web1 ist der Name des Containers.

docker run -d --name web1 -p 80:80 -v website:/usr/local/apache2/htdocs:ro httpd:2.4

einen neuen Container starten und das Website-Volume an diesen anhängen

7. Die Website wird nun vom Container web1 bedient. Führe den Befehl docker ps aus, um den Status des Containers web1 zu überprüfen. Du kannst sehen, dass die Website vom web1-Container ausgeliefert wird. Du kannst auch den Port sehen, über den die Website bereitgestellt wird (80), wie unten gezeigt.

den Status des Containers web1 prüfen

8. Du kannst die IP-Adresse des Host-Rechners in deinem Webbrowser öffnen, um die soeben kopierte Website zu sehen.

 siehe die Website, die du gerade kopiert hast.

9. Starte nun einen weiteren Container namens webTmp, diesmal mit dem –rm Flag, um zu sehen, was mit der Website passiert, wenn du den webTmp Container stoppst.

docker run -d --name webTmp --rm -v website:/usr/local/apache2/htdocs:ro httpd:2.4

einen weiteren Container namens webTmp starten

10. Führe den Befehl docker ps show aus, um zu überprüfen, ob der webTmp-Container läuft.

docker ps

Überprüfung des webTmp-Containers

11. Stoppe nun den webTmp-Container und liste die Volumes auf.

docker stop webTmp

docker volume ls

Wie du dich am Anfang dieses Artikels erinnert hast, werden beim Stoppen eines Containers auch die zugehörigen Volumes gelöscht. Aber dieses Mal kannst du sehen, dass das Website-Volume noch vorhandenist. Was ist also passiert?

das Volumen auflisten

Die wichtigste Erkenntnis aus diesem Beispiel ist, dass beim Stoppen eines Containers die Daten in den zugehörigen Volumes nicht gelöscht werden, solange die Volumes von einem anderen Container verwendet werden. In diesem Fall wird das Website-Volume noch vom web1-Container verwendet. Das ist ein sehr wichtiger Punkt, den du bei der Arbeit mit Docker-Volumes beachten solltest.

Ungenutzte Volumes loswerden

Volumes sind zwar eine tolle Möglichkeit, Daten zu speichern und zu organisieren, aber sie können auch viel Speicherplatz beanspruchen, wenn sie nicht genutzt werden. Wenn du ein Volume nicht benutzt, ist es am besten, es aus deinem System zu entfernen, um Speicherplatz freizugeben. Glücklicherweise bietet Docker alle Werkzeuge, die du brauchst, um ungenutzte Volumes aus deinem System zu entfernen.

1. Führe den Befehl docker volume prune aus, um nicht genutzte Ressourcen (Images, Netzwerke, Volumes und Container) zu entfernen. Eine Dangling-Ressource ist ein Docker-Objekt, das derzeit nicht mit einem Container verbunden ist.Bevor du ein Volume entfernst, musst du sicherstellen, dass es von keinem Container genutzt wird. Du musst zum Beispiel den db2-Container entfernen, bevor du die mit ihm verbundenen ungenutzten Volumesentfernen kannst.

docker stop db2
docker rm db2
docker volume prune

Entfernen der unbenutzten Volumes, die mit dem db2-Container verbunden sind

2. Wenn du die Volumes auflistest, siehst du, dass das db2-Volume jetzt nicht mehr vorhanden ist.

docker volume ls

Wenn du die Volumes auflistest, siehst du, dass das db2-Volume jetzt weg ist.

3. Führe das folgende Programm aus, um den Speicherort der Volume-Daten für deine Website zu finden, damit du sie sichern kannst.

docker volume inspect website

Du siehst den Einhängepunkt für deine Website. Der Einhängepunkt ist das Verzeichnis auf deinem Host-Betriebssystem, in dem das Docker-Volume eingehängt ist. In diesem Beispiel ist der Einhängepunkt /var/lib/docker/volumes/website/_data, wie unten gezeigt.

den Speicherort deiner Volumendaten finden

4. Du kannst den tar-Befehl verwenden, um den Inhalt deines Website-Volumes zu sichern. Diesen Befehl gibt es schon seit langem und er wird von den meisten Plattformen unterstützt. Der tar-Befehl kann verwendet werden, um ein Verzeichnis mit allen Unterverzeichnissen und Dateien zu sichern.

Hinweis: Du MUSST diesen Befehl als Root-Benutzer ausführen, sonst hast du keine Berechtigung, auf das gemountete Docker-Volume zu schreiben, wie unten gezeigt.

Permission denied

tar czf /tmp/website_$(date +%Y-%m-%d-%H%M).tgz -C /var/lib/docker/volumes/website/_data .

den Inhalt deines Website-Volumens zu sichern

5. Führe den folgenden Befehl aus, um zu überprüfen, ob die tar-Backup-Datei erfolgreich erstellt wurde.

ls -l /tmp/website_*.tgz

Überprüfe, ob die tar-Sicherungsdatei erstellt wurde

6. Führe den folgenden Befehl aus, um zu überprüfen, ob die Sicherungsdatei die richtigen Daten enthält. Ersetze YOUR_BACKUP_FILE_NAME durch den tatsächlichen Namen deiner Sicherungsdatei.

tar tf /tmp/<YOUR_BACKUP_FILE_NAME>.tgz

überprüfen, ob die Sicherungsdatei die richtigen Daten enthält

7. Führen wir nun einen weiteren Container mit dem Website-Volume aus. Diesmal verwendest du das Flag -it, um mit dem Container zu interagieren und das Backup zu testen.

docker run -it --rm -v website:/website -v /tmp:/backup bash tar czf /backup/website_$(date +%Y-%m-%d-%H-%M).tgz -C /website .

einen weiteren Container über die Website-Kolumne laufen lassen

8. Wechsle in das Volume-Verzeichnis und entferne alle Website-Daten.

Gehe in das Volume-Verzeichnis und entferne alle Daten der Website.

9. Überprüfe den Inhalt des Verzeichnisses, um zu sehen, dass die Website-Daten verschwunden sind.

ls -l

Listen Sie den Inhalt des Verzeichnisses auf, um zu sehen, dass die Daten der Website verschwunden sind.

10. Führe den folgenden Befehl aus, um die Daten der Website wiederherzustellen. Ersetze <Dein_BACKUP_DATEINAME> durch den tatsächlichen Namen deiner Backup-Datei.

tar xf <YOUR_BACKUP_FILE_NAME>.tgz .

11. Liste den Inhalt des Verzeichnisses auf, um zu überprüfen, ob die Daten der Website wiederhergestellt wurden.

ls -l

11. Listen Sie den Inhalt des Verzeichnisses auf, um zu überprüfen, ob die Daten der Website wiederhergestellt wurden.

Fazit

In dieser Anleitung hast du gelernt, wie du ein Docker-Volume erstellst, sicherst und die Daten wiederherstellst. Du hast auch gelernt, wo du den Einhängepunkt für dein Docker-Volume findest.

Docker erfreut sich in letzter Zeit immer größerer Beliebtheit, weil es die Bereitstellung von Anwendungen erleichtert. Doch mit großer Macht kommt auch große Verantwortung. Es ist wichtig, deine Docker-Volumes zu sichern, um Datenverluste im Falle einer Katastrophe zu vermeiden.

Es gibt eine Menge über Docker zu lernen. Wenn du dicheingehender mit Docker beschäftigen willst, empfehlen wir dir die Dokumentation, in der du alle Informationen findest, die du brauchst, um mit Docker loszulegen.

Das könnte dich auch interessieren …