Docker/Datenbank: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
| (10 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
<noinclude> | <noinclude> | ||
---- | ---- | ||
{{Navigation| | {{Navigation|Docker/Aktualisieren|Aktualisieren|Docker/Mounts|Mounts}} | ||
---- | ---- | ||
'''Docker/Datenbank''' - Persistente Datenbanken | '''Docker/Datenbank''' - Persistente Datenbanken | ||
</noinclude> | </noinclude> | ||
| Zeile 13: | Zeile 10: | ||
; Beispiel | ; Beispiel | ||
* | * Bis lang ist die To-do-Liste leer, wenn Sie den Container starten | ||
* Warum ist das so? | * Warum ist das so? | ||
* In diesem | * In diesem Kapitel wird dargestellt, wie der Container funktioniert | ||
== Dateisystem | == Containers-Dateisystem == | ||
Wenn ein Container läuft, verwendet er die verschiedenen Schichten eines Images für sein Dateisystem. | Wenn ein Container läuft, verwendet er die verschiedenen Schichten eines Images für sein Dateisystem. | ||
* Jeder Container erhält auch seinen eigenen "Scratch Space", um Dateien zu erstellen/zu aktualisieren/zu löschen. | * Jeder Container erhält auch seinen eigenen "Scratch Space", um Dateien zu erstellen/zu aktualisieren/zu löschen. | ||
* Alle Änderungen werden in einem anderen Container nicht sichtbar, obwohl sie das gleiche Image verwenden | * Alle Änderungen werden in einem anderen Container nicht sichtbar, obwohl sie das gleiche Image verwenden | ||
=== | === Praxis === | ||
Um dies in Aktion zu sehen, werden Sie zwei Container starten. In einem Container erstellen Sie eine Datei. In dem anderen Container überprüfen Sie, ob die gleiche Datei existiert. | Um dies in Aktion zu sehen, werden Sie zwei Container starten. In einem Container erstellen Sie eine Datei. In dem anderen Container überprüfen Sie, ob die gleiche Datei existiert. | ||
| Zeile 40: | Zeile 36: | ||
* Das liegt daran, dass die beschreibbare "oberste Schicht" eines jeden Containers isoliert ist. | * Das liegt daran, dass die beschreibbare "oberste Schicht" eines jeden Containers isoliert ist. | ||
* Auch wenn beide Container dieselben Schichten verwenden, die das Basis-Image bilden, ist die beschreibbare Schicht für jeden Container einzigartig | * Auch wenn beide Container dieselben Schichten verwenden, die das Basis-Image bilden, ist die beschreibbare Schicht für jeden Container einzigartig | ||
; Hinweis | ; Hinweis | ||
:Der Parameter <code>--rm</code> des Befehls <code>docker run</code> wird verwendet, um den Container und seine beschreibbare Ebene nach Abschluss des Prozesses automatisch zu löschen. | :Der Parameter <code>--rm</code> des Befehls <code>docker run</code> wird verwendet, um den Container und seine beschreibbare Ebene nach Abschluss des Prozesses automatisch zu löschen. | ||
| Zeile 49: | Zeile 46: | ||
; Volumes | ; Volumes | ||
* | * Ermöglichen, bestimmte Dateisystempfade des Containers wieder mit dem Host-Rechner zu verbinden. | ||
* Wenn Sie ein Verzeichnis im Container mounten, werden Änderungen an diesem Verzeichnis auch auf dem Host-Rechner sichtbar. | * Wenn Sie ein Verzeichnis im Container mounten, werden Änderungen an diesem Verzeichnis auch auf dem Host-Rechner sichtbar. | ||
* Wenn Sie dasselbe Verzeichnis über mehrere Container-Neustarts hinweg mounten, sehen Sie dieselben Dateien | * Wenn Sie dasselbe Verzeichnis über mehrere Container-Neustarts hinweg mounten, sehen Sie dieselben Dateien | ||
Es gibt zwei Haupttypen von Volumes | Es gibt zwei Haupttypen von Volumes | ||
* | * Letztlich werden beide verwendet, jedoch wird zunächst mit '''Volume-Mounts''' begonnen. | ||
== Persistieren der ToDo-Daten == | == Persistieren der ToDo-Daten == | ||
; Persistieren der ToDo-Daten | |||
* Standardmäßig speichert die Todo-App ihre Daten in einer SQLite-Datenbank unter /etc/todos/todo.db im Dateisystem des Containers | * Standardmäßig speichert die Todo-App ihre Daten in einer SQLite-Datenbank unter /etc/todos/todo.db im Dateisystem des Containers | ||
* SQLite ist eine relationale Datenbank, die alle Daten in einer einzigen Datei ablegt | * SQLite ist eine relationale Datenbank, die alle Daten in einer einzigen Datei ablegt | ||
| Zeile 64: | Zeile 62: | ||
* Docker verwaltet das Volume vollständig, einschließlich des physischen Speicherorts. Es genügt, den Namen des Volumes zu kennen | * Docker verwaltet das Volume vollständig, einschließlich des physischen Speicherorts. Es genügt, den Namen des Volumes zu kennen | ||
=== | === Volume erstellen und Container starten === | ||
Sie können das Volume erstellen und den Container über die CLI oder die grafische Oberfläche von Docker Desktop starten. | Sie können das Volume erstellen und den Container über die CLI oder die grafische Oberfläche von Docker Desktop starten. | ||
1. | 1. Volume erstellen | ||
<syntaxhighlight lang="bash" highlight="1" line copy> | <syntaxhighlight lang="bash" highlight="1" line copy> | ||
docker volume create todo-db | docker volume create todo-db | ||
</syntaxhighlight> | </syntaxhighlight> | ||
2. Stoppen und | 2. Container anhalten und entfernen | ||
: Stoppen und Entfernen des Todo-App-Containers, während er noch kein verwendet | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
<code>docker rm -f <id></code> | |||
3. Starten Sie den todo-App-Container, aber fügen Sie die Option --mount hinzu, um ein Volume zu mounten. Geben Sie dem Volume einen Namen und mounten Sie es in <code>/etc/todos</code> im Container, wodurch alle Dateien, die unter dem Pfad erstellt werden, erfasst werden | 3. Starten Sie den todo-App-Container, aber fügen Sie die Option --mount hinzu, um ein Volume zu mounten. Geben Sie dem Volume einen Namen und mounten Sie es in <code>/etc/todos</code> im Container, wodurch alle Dateien, die unter dem Pfad erstellt werden, erfasst werden | ||
| Zeile 88: | Zeile 88: | ||
=== Überprüfen, ob die Daten erhalten bleiben === | === Überprüfen, ob die Daten erhalten bleiben === | ||
# Sobald der Container hochgefahren ist, öffnen Sie die Anwendung und fügen Sie Ihrer ToDo-Liste einige Einträge hinzu | |||
# Stoppen und entfernen Sie den Container für die Todo-App. Verwenden Sie Docker Desktop oder <code>docker ps</code>, um die ID zu ermitteln, und dann <code>docker rm -f <id></code>, um ihn zu entfernen. | |||
# Starten Sie einen neuen Container unter Verwendung der vorherigen Schritte | |||
# Öffnen Sie die App. Sie sollten Ihre Objekte immer noch in Ihrer Liste sehen | |||
# Entfernen Sie den Container, wenn Sie mit dem Auschecken Ihrer Liste fertig sind | |||
== | == volume inspect == | ||
Um herauszufinden, wo Docker die Dateien eines bestimmten Volumes speichert, kann man den Befehl <code>docker volume inspect</code> verwenden. | Um herauszufinden, wo Docker die Dateien eines bestimmten Volumes speichert, kann man den Befehl <code>docker volume inspect</code> verwenden. | ||
| Zeile 130: | Zeile 124: | ||
] | ] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Der <code>Mountpoint</code> ist der tatsächliche Speicherort der Daten auf der Festplatte. | Der <code>Mountpoint</code> ist der tatsächliche Speicherort der Daten auf der Festplatte. | ||
| Zeile 140: | Zeile 134: | ||
In diesem Abschnitt haben Sie gelernt, wie man Containerdaten persistiert | In diesem Abschnitt haben Sie gelernt, wie man Containerdaten persistiert | ||
<noinclude> | |||
== Nächste Schritte == | == Nächste Schritte == | ||
Als Nächstes erfahren Sie, wie Sie Ihre Anwendung mithilfe von [[Docker/Mounts|Bind Mounts]] effizienter entwickeln können | Als Nächstes erfahren Sie, wie Sie Ihre Anwendung mithilfe von [[Docker/Mounts|Bind Mounts]] effizienter entwickeln können | ||
---- | |||
{{Navigation|Docker/Aktualisieren|Aktualisieren|Docker/Mounts|Mounts}} | |||
---- | |||
== Anhang == | == Anhang == | ||
=== Siehe auch === | === Siehe auch === | ||
Aktuelle Version vom 14. Oktober 2026, 10:45 Uhr
Docker/Datenbank - Persistente Datenbanken
Beschreibung
Persistieren einer Datenbank
- Beispiel
- Bis lang ist die To-do-Liste leer, wenn Sie den Container starten
- Warum ist das so?
- In diesem Kapitel wird dargestellt, wie der Container funktioniert
Containers-Dateisystem
Wenn ein Container läuft, verwendet er die verschiedenen Schichten eines Images für sein Dateisystem.
- Jeder Container erhält auch seinen eigenen "Scratch Space", um Dateien zu erstellen/zu aktualisieren/zu löschen.
- Alle Änderungen werden in einem anderen Container nicht sichtbar, obwohl sie das gleiche Image verwenden
Praxis
Um dies in Aktion zu sehen, werden Sie zwei Container starten. In einem Container erstellen Sie eine Datei. In dem anderen Container überprüfen Sie, ob die gleiche Datei existiert.
1. Starten Sie einen Alpine-Container und erstellen Sie in diesem eine neue Datei
docker run --rm alpine touch greeting.txt
2. Alle Befehle, die Sie nach dem Image-Namen (in diesem Fall Alpine) angeben, werden innerhalb des Containers ausgeführt. In diesem Fall legt der Befehl touch greeting.txt eine Datei namens greeting.txt im Dateisystem des Containers an.
3. Starten Sie einen neuen Alpine-Container und verwenden Sie den Befehl stat, um zu überprüfen, ob die Datei existiert
docker run --rm alpine stat greeting.txt
Sie sollten eine ähnliche Ausgabe wie die folgende sehen, die anzeigt, dass die Datei im neuen Container nicht existiert.
stat: can't stat 'greeting.txt': No such file or directory
Die Datei greeting.txt, die vom ersten Container erstellt wurde, existiert nicht im zweiten Container.
- Das liegt daran, dass die beschreibbare "oberste Schicht" eines jeden Containers isoliert ist.
- Auch wenn beide Container dieselben Schichten verwenden, die das Basis-Image bilden, ist die beschreibbare Schicht für jeden Container einzigartig
- Hinweis
- Der Parameter
--rmdes Befehlsdocker runwird verwendet, um den Container und seine beschreibbare Ebene nach Abschluss des Prozesses automatisch zu löschen.
Container-Volumen
Jeder Container wird beim Start erneut auf Basis des Images erstellt
- Ein Container kann während der Laufzeit Dateien erstellen, ändern und löschen. Allerdings gehen alle Änderungen beim Entfernen des Containers verloren
- Durch die Verwendung von Volumes können Daten außerhalb des Containers gespeichert und beim Entfernen des Containers beibehalten werden
- Volumes
- Ermöglichen, bestimmte Dateisystempfade des Containers wieder mit dem Host-Rechner zu verbinden.
- Wenn Sie ein Verzeichnis im Container mounten, werden Änderungen an diesem Verzeichnis auch auf dem Host-Rechner sichtbar.
- Wenn Sie dasselbe Verzeichnis über mehrere Container-Neustarts hinweg mounten, sehen Sie dieselben Dateien
Es gibt zwei Haupttypen von Volumes
- Letztlich werden beide verwendet, jedoch wird zunächst mit Volume-Mounts begonnen.
Persistieren der ToDo-Daten
- Persistieren der ToDo-Daten
- Standardmäßig speichert die Todo-App ihre Daten in einer SQLite-Datenbank unter /etc/todos/todo.db im Dateisystem des Containers
- SQLite ist eine relationale Datenbank, die alle Daten in einer einzigen Datei ablegt
- Da die Datenbank aus einer einzelnen Datei besteht, kann diese Datei auf dem Host-System persistiert und von einem neuen Container weiterverwendet werden, um den vorherigen Zustand beizubehalten
- Durch das Erstellen eines Volumes und das Mounten an das Verzeichnis, in dem die Daten liegen, werden die Daten dauerhaft gespeichert
- Alle Schreibvorgänge in die Datei todo.db werden auf dem Host im Volume gespeichert
- Docker verwaltet das Volume vollständig, einschließlich des physischen Speicherorts. Es genügt, den Namen des Volumes zu kennen
Volume erstellen und Container starten
Sie können das Volume erstellen und den Container über die CLI oder die grafische Oberfläche von Docker Desktop starten.
1. Volume erstellen
docker volume create todo-db
2. Container anhalten und entfernen
- Stoppen und Entfernen des Todo-App-Containers, während er noch kein verwendet
<code>docker rm -f <id></code>
3. Starten Sie den todo-App-Container, aber fügen Sie die Option --mount hinzu, um ein Volume zu mounten. Geben Sie dem Volume einen Namen und mounten Sie es in <code>/etc/todos</code> im Container, wodurch alle Dateien, die unter dem Pfad erstellt werden, erfasst werden
<syntaxhighlight lang="bash" highlight="1" line copy>
docker run -dp 3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started
- Hinweis
- Wenn Sie Git Bash verwenden, müssen Sie für diesen Befehl eine andere Syntax verwenden.
docker run -dp 3000:3000 --mount type=volume,src=todo-db,target=//etc/todos getting-started
Überprüfen, ob die Daten erhalten bleiben
- Sobald der Container hochgefahren ist, öffnen Sie die Anwendung und fügen Sie Ihrer ToDo-Liste einige Einträge hinzu
- Stoppen und entfernen Sie den Container für die Todo-App. Verwenden Sie Docker Desktop oder
docker ps, um die ID zu ermitteln, und danndocker rm -f <id>, um ihn zu entfernen. - Starten Sie einen neuen Container unter Verwendung der vorherigen Schritte
- Öffnen Sie die App. Sie sollten Ihre Objekte immer noch in Ihrer Liste sehen
- Entfernen Sie den Container, wenn Sie mit dem Auschecken Ihrer Liste fertig sind
volume inspect
Um herauszufinden, wo Docker die Dateien eines bestimmten Volumes speichert, kann man den Befehl docker volume inspect verwenden.
docker volume inspect todo-db
Sie sollten eine Ausgabe wie die folgende sehen:
[
{
"CreatedAt": "2019-09-26T02:18:36Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
"Name": "todo-db",
"Optionen": {},
"Scope": "local"
}
]
Der Mountpoint ist der tatsächliche Speicherort der Daten auf der Festplatte.
- Hinweis
- Beachten Sie, dass Sie auf den meisten Rechnern über Root-Zugriff verfügen müssen, um vom Host aus auf dieses Verzeichnis zuzugreifen
Zusammenfassung
In diesem Abschnitt haben Sie gelernt, wie man Containerdaten persistiert
Nächste Schritte
Als Nächstes erfahren Sie, wie Sie Ihre Anwendung mithilfe von Bind Mounts effizienter entwickeln können
Anhang
Siehe auch