GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

So speichern Sie Docker-Containerdaten in Docker-Volumes

Eine Option zum Automatisieren eines Containers mit Daten besteht darin, die Daten im Container-Image zu speichern. Dies erfordert jedoch eine Kopie der Daten in jedem von Ihnen ausgeführten Container, was zu einer Verschwendung von Ressourcen führen kann, wenn die Container hochskaliert werden. Eine bessere Option besteht darin, eine Kopie der Daten in einem Docker-Volume zu speichern und dieses Volume dann zwischen Containern zu teilen.

Sie können sich ein Docker-Volume als einen Ordner vorstellen, der außerhalb des Container-Dateisystems existiert, aber dennoch für die auf demselben Host ausgeführten Container zugänglich ist. Wenn Sie einen neuen Container erstellen, können Sie entweder ein vorhandenes Volume mounten oder ein neues erstellen. Wenn Sie ein neues Volume erstellen, erstellt Docker automatisch eine neue Speicherschicht auf dem zugrunde liegenden Host-Dateisystem und initialisiert sie mit den von Ihnen angegebenen Daten.

Sobald Sie ein Volume erstellt haben, können Sie es zum Speichern aller Arten von Daten verwenden, einschließlich statischer Dateien, Anwendungsdaten oder Protokolle. Sie können Volumes auch verwenden, um Daten zwischen Containern auszutauschen.

Wenn Sie beispielsweise eine Webanwendung haben, die in einem Container ausgeführt wird, können Sie ein Volume verwenden, um den Quellcode der Anwendung zu speichern, damit die anderen Container in Ihrer Bereitstellung darauf zugreifen können. Auf diese Weise können Sie den Quellcode Ihrer Anwendung von der Laufzeitumgebung getrennt halten, was das Aktualisieren und erneute Bereitstellen Ihrer Anwendung erleichtert.

Zusätzlich zum Teilen von Daten zwischen Containern können Sie Volumes auch verwenden, um Daten beizubehalten, wenn Sie Ihre Container stoppen und starten. Dies ist eine großartige Möglichkeit, Ihre Daten zu schützen, selbst wenn Ihre Container versehentlich gelöscht oder angehalten werden.

In diesem Leitfaden erfahren Sie, wie Docker-Volumes mit Containern interagieren. Dazu erstellen Sie neue Container und verwenden Volumes zum Speichern und Freigeben von Daten zwischen ihnen. Anschließend erfahren Sie, wie Sie Speicherplatz freigeben, der von anonymen Volumes zurückgelassen wird, die automatisch von den Containern generiert werden. Schließlich erfahren Sie, wie Sie Ihre Docker-Volume-Daten sichern.

Fangen wir an!

Voraussetzungen

  • Um dieser Anleitung zu folgen, sollten Sie mit den Grundlagen der Arbeit mit Docker-Containern vertraut sein.
  • Diese Anleitung geht davon aus, dass Sie einen Linux-Host verwenden. Diese Anleitung verwendet CentOS, aber die gleichen Schritte sollten auf jeder anderen Linux-Distribution funktionieren.
  • Docker muss auf Ihrem Host installiert sein und ausgeführt werden. Wenn Sie es noch nicht installiert haben, folgen Sie den Anweisungen in unserer Installationsanleitung.
  • Ein Benutzerkonto mit Root-Rechten
  • Du hast Docker auf dem Linux-Host installiert.

Anonyme Docker-Volumes entdecken

Wenn Sie einen neuen Docker-Container erstellen, wird standardmäßig ein neues anonymes Volume im Hostdateisystem erstellt. Dieses Volume wird verwendet, um die Daten zu speichern, die vom Container benötigt werden.

1. Führen Sie den folgenden Befehl aus, um zu überprüfen, ob Docker ausgeführt wird und aktiv ist.

sudo systemctl status docker

2. Führen Sie den folgenden Befehl aus, um Ihr Benutzerkonto zur Docker-Gruppe hinzuzufügen, damit Sie Docker-Befehle ohne Verwendung von sudo ausführen können. Nachdem Sie Ihr Benutzerkonto zur Docker-Gruppe hinzugefügt haben, melden Sie sich ab und wieder an, damit Ihre Änderungen wirksam werden.

sudo usermod -aG docker $(whoami)

3. Führen Sie den folgenden Befehl aus, um einige Images aus der Docker-Registrierung auf Ihren Host zu ziehen. Sie werden diese Bilder verwenden, um das Erstellen und Arbeiten mit Docker-Volumes zu üben.

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

4. Führen Sie den folgenden Befehl aus, um die Bilder aufzulisten, die sich derzeit auf Ihrem Host befinden, um zu überprüfen, ob die Bilder abgerufen wurden.

docker images

5. Führen Sie den folgenden Befehl aus, um zu sehen, ob auf Ihrem Host aktive Volumes vorhanden sind. Sie sollten eine Ausgabe ähnlich der folgenden sehen.

docker volume ls

Sie sollten eine leere Ausgabe sehen.

6. Führen Sie den folgenden Befehl aus, um einen neuen Container zu erstellen und zu überprüfen, ob ein neues anonymes Volume auf dem Host erstellt wurde. Sie verwenden das Flag -d, um den Container im getrennten Modus auszuführen, damit Sie im Terminal weiterarbeiten können. Sie verwenden das Flag --name, um dem Container einen Namen zu geben, damit Sie ihn leicht identifizieren können. Sie verwenden hier das postgres:12.1-Image, da Postgres Hintergrundvolumes benötigt, um seine Daten zu speichern. Sie sollten zwei Container ausführen, einen für jede Ihrer Postgres-Datenbanken, damit Sie zusätzliche Informationen sehen können.

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

7. Führen Sie den folgenden Docker-Befehl aus, um die Container aufzulisten, die derzeit auf Ihrem Host ausgeführt werden.

docker ps

Sie haben jetzt zwei Container: db1 und db2, wie unten gezeigt.

8. Listen Sie nun die Volumes auf, die auf dem Host erstellt wurden.

docker volume ls

Sie sehen eine Ausgabe ähnlich der folgenden. Sobald Postgres startet, benötigt es einen Ort, an dem es seine Daten speichern kann. Postgres möchte seine Daten nicht verlieren, daher erstellt Postgres automatisch anonyme Volumes. Die Volumes werden mit einer zufällig angehängten Zeichenfolge aus Hex-Zeichen benannt (e9f338... und  ee3423... ).

Schauen wir uns die Volumes genauer an, indem wir den Docker-Inspect-Befehl verwenden.

9. Führen Sie den folgenden Befehl aus, um weitere Informationen über den db1-Container in einem für Menschen lesbaren Format zu erhalten.

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

Wie Sie unten sehen können, ist der e9f338 Name line stimmt mit der Ausgabe des Befehls docker volume ls oben überein. Diese Zeile teilt Ihnen mit, dass dieses Volume mit db1 verknüpft und gemountet ist Behälter.

10. Gehen Sie genauso vor, um db2 zu inspizieren Behälter.

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

Sie werden sehen, dass die Ausgabe genau die gleiche ist wie bei db1 Container, mit Ausnahme des Volume-Namens, der anders sein wird. Diese Ausgabe bestätigt, dass Docker für jeden erstellten Container ein neues anonymes Volume erstellt.

11. Führen Sie einen weiteren Container aus. Aber dieses Mal werden wir das Flag --rm verwenden und sehen, was mit den Volumes passiert. Wir haben diesen Container dbTmp genannt. Finden wir es heraus!

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

Wir haben jetzt drei Container:db1 , db2, und dbTmp läuft

docker ps

12. Listen Sie die Volumes erneut auf.

docker volume ls

Sie werden feststellen, dass ein drittes Volume für dbTmp erstellt wurde Behälter.

13. Stoppen Sie nun db2 zusammen mit dem dbTmp-Container mit dem folgenden Befehl.

docker stop db2 dbTmp

13. Listen Sie die Container und Volumes erneut auf.

Docker-PS

docker volume ls

Wie unten gezeigt, ist der einzige Container, der noch ausgeführt wird, der db1-Container. Das Volume für den dbTemp-Container ist jetzt jedoch weg, aber das Volume für den db2-Container (ee3423... ) ist immer noch hier.

Dieses Verhalten wird erwartet. Das Flag --rm löscht den Container nach dem Stoppen zusammen mit allen zugehörigen Volumes. Das Volume für den dbTmp-Container ist weg, weil wir den dbTemp-Container beendet haben. Da wir beim Erstellen des db2-Containers das Flag --rm nicht angegeben haben, bleiben der db2-Container und sein zugehöriges Volume auf dem Host, selbst wenn wir den Container stoppen. Die Erkenntnis aus diesem Beispiel ist, dass Sie mit dem Flag --rm vorsichtig sein müssen. Wenn Sie einen Container stoppen, dem ein Volume zugeordnet ist, wird das Volume gelöscht.

Erstellen eines Docker-Volumes

Ein Docker-Volume ist ein benannter Speichercontainer, den Sie mit dem Befehl docker volume create erstellen. Anschließend verwenden Sie das Volume zum Speichern von Daten oder zum Freigeben von Daten zwischen Containern.

1. Führen Sie den folgenden Befehl aus, um ein neues Volume namens website.

zu erstellen
docker volume create website

2. Listen Sie die Volumes auf, Sie können das neue Volume sehen, das Sie gerade erstellt haben.

docker volume ls

3. Laden Sie diesen Website-Code von GitHub in Ihr aktuelles Arbeitsverzeichnis herunter.

4. Führen Sie den folgenden Befehl aus, um den Website-Code, den Sie gerade heruntergeladen haben, in das Website-Volume zu kopieren.

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

5. Führen Sie den folgenden Befehl aus, um die Dateien im Website-Volume aufzulisten.

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

Sie können sehen, dass der Website-Code jetzt im Website-Volume gespeichert ist.

6. Jetzt können Sie einen neuen Container starten und das Website-Volume daran anhängen. Sie verwenden das Flag -v (Volume), um das Volume zu mounten. Sie verwenden das Flag -p (Portzuordnung), um einen Port auf dem Host einem Port im Container zuzuordnen. In diesem Beispiel ordnen wir Port 80 auf dem Host 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

7. Die Website wird nun aus dem Container web1 bereitgestellt. Führen Sie den Befehl docker ps aus, um den Status des Containers web1 zu überprüfen. Sie können sehen, dass die Website vom web1-Container bereitgestellt wird. Sie können auch den Port sehen, auf dem die Website bereitgestellt wird (80), wie unten gezeigt.

8. Sie können die IP-Adresse des Hostcomputers in Ihrem Webbrowser öffnen, um die gerade kopierte Website anzuzeigen.

9. Führen Sie nun einen weiteren Container namens webTmp aus, dieses Mal mit dem Flag --rm, um zu sehen, was mit dem Website-Volume passiert, wenn Sie den Container webTmp stoppen.

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

10. Führen Sie einen docker ps-Befehl show aus, um zu überprüfen, ob der webTmp-Container ausgeführt wird.

docker ps 

11. Stoppen Sie nun den webTmp-Container und listen Sie die Volumes auf.

docker stop webTmp

Docker-Volume ls

Wie Sie sich am Anfang dieses Artikels erinnern, werden beim Stoppen eines Containers auch die zugehörigen Volumes gelöscht. Aber dieses Mal, wie unten gezeigt, können Sie sehen, dass das Website-Volumen immer noch da ist. Was ist also passiert?

Die wichtigste Erkenntnis in diesem Beispiel ist, dass beim Anhalten eines Containers die Daten in den Volumes, die diesem Container zugeordnet sind, nicht gelöscht werden, solange die Volumes von einem anderen Container verwendet werden. In diesem Fall wird das Website-Volumen weiterhin vom web1-Container verwendet. Dies ist ein sehr wichtiger Punkt, den Sie bei der Arbeit mit Docker-Volumes beachten sollten.

Nicht verwendete Volumes loswerden

Obwohl Volumes eine großartige Möglichkeit sind, Daten zu speichern und zu organisieren, können sie auch viel Speicherplatz beanspruchen, wenn sie nicht verwendet werden. Wenn Sie ein Volume nicht verwenden, entfernen Sie es am besten von Ihrem System, um Speicherplatz freizugeben. Glücklicherweise bietet Docker alle Tools, die Sie benötigen, um ungenutzte Volumes von Ihrem System zu entfernen.

1. Führen Sie den docker volume prune-Befehl aus, um ungenutzte Ressourcen (Images, Netzwerke, Volumes und Container) zu entfernen. Eine baumelnde Ressource ist ein Docker-Objekt, das derzeit keinem Container zugeordnet ist. Stellen Sie jedoch vor dem Entfernen eines Volumes sicher, dass es von keinem Container verwendet wird. Beispielsweise müssen Sie den db2-Container entfernen, bevor Sie die ihm zugeordneten unbenutzten Volumes entfernen können.

docker stop db2
docker rm db2
docker volume prune

2. Listen Sie die Volumes auf und Sie können sehen, dass das db2-Volume jetzt weg ist.

docker volume ls

3. Führen Sie die folgenden Schritte aus, um den Speicherort Ihrer Volumendaten für Ihre Website zu finden, damit Sie sie sichern können.

docker volume inspect website

Sie sehen den Einhängepunkt für Ihre Website. Der Bereitstellungspunkt ist das Verzeichnis auf Ihrem Host-Betriebssystem, in dem das Docker-Volume bereitgestellt wird. In diesem Beispiel ist der Einhängepunkt /var/lib/docker/volumes/website/_data , wie unten gezeigt.

4. Sie können den tar-Befehl verwenden, um den Inhalt Ihres Website-Volumes zu sichern. Es gibt es schon lange und wird auf den meisten Plattformen unterstützt. Mit dem Befehl tar kann ein Verzeichnis einschließlich aller Unterverzeichnisse und Dateien gesichert werden.

Hinweis :Sie MÜSSEN diesen Befehl als Root-Benutzer ausführen, sonst haben Sie keine Berechtigung, auf das bereitgestellte Docker-Volume zu schreiben, wie unten gezeigt.

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

5. Führen Sie den folgenden Befehl aus, um zu überprüfen, ob die tar-Sicherungsdatei erfolgreich erstellt wurde.

ls -l /tmp/website_*.tgz

6. Führen Sie den folgenden Befehl aus, um zu überprüfen, ob die Sicherungsdatei die richtigen Daten enthält. Ersetzen Sie YOUR_BACKUP_FILE_NAME durch den tatsächlichen Namen Ihrer Sicherungsdatei.

tar tf /tmp/<YOUR_BACKUP_FILE_NAME>.tgz 

7. Lassen Sie uns nun einen weiteren Container mit dem Website-Volume ausführen. Dieses Mal verwenden Sie das Flag -it, um mit dem Container zu interagieren und die Sicherung 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 .

8. Wechseln Sie in das Volume-Verzeichnis und entfernen Sie alle Website-Daten.

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

ls -l

10. Führen Sie den folgenden Befehl aus, um die Website-Daten wiederherzustellen. Ersetzen Sie durch den tatsächlichen Namen Ihrer Sicherungsdatei.

tar xf <YOUR_BACKUP_FILE_NAME>.tgz .

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

ls -l

Schlussfolgerung

In dieser Anleitung haben Sie gelernt, wie Sie ein Docker-Volume erstellen, sichern und die Daten wiederherstellen. Sie haben auch erfahren, wo Sie den Einhängepunkt für Ihr Docker-Volume finden.

Docker erfreut sich in letzter Zeit großer Beliebtheit, da es die Bereitstellung von Anwendungen erleichtert. Doch mit großer Macht geht auch große Verantwortung einher. Es ist wichtig, Ihre Docker-Volumes zu sichern, um Datenverlust im Katastrophenfall zu vermeiden.

Es gibt viel über Docker zu lernen. Wenn Sie sich eingehender mit Docker befassen möchten, empfehlen wir Ihnen, die Dokumentation zu lesen, in der Sie alle Informationen finden, die Sie benötigen, um Docker in Betrieb zu nehmen.


Docker
  1. So erstellen Sie einen Anaconda Python Data Science Docker-Container

  2. Wie führe ich ein Programm in einem Docker-Container aus?

  3. So führen Sie einen Befehl in einem laufenden Docker-Container aus

  4. So weisen Sie einem Docker-Container eine statische IP zu

  5. So teilen Sie Daten zwischen Docker-Containern

Was ist Docker? Wie funktioniert es?

So führen Sie PHPMyAdmin in einem Docker-Container aus

So führen Sie Grafana in einem Docker-Container aus

So erstellen Sie Docker-Volumes unter Windows auf einfache Weise

So richten Sie einen Apache Docker-Container ein

So führen Sie Docker-Container aus