Docker/Mounts: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung  | 
				K Textersetzung - „Docker/Workshop“ durch „Docker“  | 
				||
| (15 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
| Zeile 3: | Zeile 3: | ||
== Beschreibung ==  | == Beschreibung ==  | ||
* Datenbank persistieren  | * Datenbank persistieren  | ||
* Änderungen an Anwendungen während der Entwicklung sehen, ohne das Image neu zu   | * Änderungen an Anwendungen während der Entwicklung sehen, ohne das Image neu zu erstellenIm nächsten Abschnitt  | ||
* Volume-Mounts und Bind-Mounts unterstützt Docker auch andere Mount-Typen und Speichertreiber  | * Volume-Mounts und Bind-Mounts unterstützt Docker auch andere Mount-Typen und Speichertreiber  | ||
** um komplexere und spezialisierte Anwendungsfälle zu behandeln  | ** um komplexere und spezialisierte Anwendungsfälle zu behandeln  | ||
| Zeile 13: | Zeile 13: | ||
; Verwenden von Bind Mounts  | ; Verwenden von Bind Mounts  | ||
Im [[Docker  | [[Datei:Bind Mounts.webp|mini|rechts]]  | ||
Im [[Docker/Datenbank|vorherigen Abschnitt]] haben Sie ein Volume Mount verwendet, um die Daten in Ihrer Datenbank zu speichern  | |||
Bind Mounts werden ebenfalls verwendet und weisen einige Besonderheiten auf:  | Bind Mounts werden ebenfalls verwendet und weisen einige Besonderheiten auf:  | ||
* Ein Bind Mount verbindet ein echtes Verzeichnis oder eine Datei vom Host-System direkt mit einem Container  | * Ein Bind Mount verbindet ein echtes Verzeichnis oder eine Datei vom Host-System direkt mit einem Container  | ||
| Zeile 44: | Zeile 45: | ||
== Bind-Mounts ==  | == Bind-Mounts ==  | ||
Um mit Bind Mounts zu arbeiten, kann ein kurzes Experiment durchgeführt werden, um das Funktionsprinzip praktisch zu verstehen  | |||
1. In das Verzeichnis ''getting-started-app'' wechseln  | |||
2. Den folgenden Befehl ausführen, um Bash in einem Ubuntu-Container mit einem Bind Mount zu starten  | |||
<syntaxhighlight lang="bash" highlight="1" line copy>  | <syntaxhighlight lang="bash" highlight="1" line copy>  | ||
docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash</syntaxhighlight>  | docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash</syntaxhighlight>  | ||
* Die Option <code>--mount type=bind</code> weist Docker an, einen Bind-Mount zu erstellen, wobei <code>src</code> das aktuelle Arbeitsverzeichnis auf dem Host-Rechner (getting-started-app) und <code>target</code> das Verzeichnis ist, das im Container erscheinen soll (<code>/src</code>)  | |||
3. Nach dem Ausführen des Befehls startet Docker eine interaktive Bash-Sitzung im Stammverzeichnis des Dateisystems des Containers  | |||
<syntaxhighlight lang="bash" highlight="1" line copy>  | <syntaxhighlight lang="bash" highlight="1" line copy>  | ||
pwd ; ls  | pwd; ls  | ||
bin dev home media opt root sbin srv tmp var boot etc lib mnt proc run src sys usr  | </syntaxhighlight>  | ||
<syntaxhighlight lang="console">  | |||
 bin dev home media opt root sbin srv tmp var boot etc lib mnt proc run src sys usr  | |||
</syntaxhighlight>  | </syntaxhighlight>  | ||
Wechseln Sie in das <code>src</code>-Verzeichnis  | 4. Wechseln Sie in das <code>src</code>-Verzeichnis  | ||
* Dies ist das Verzeichnis, das Sie beim Start des Containers gemountet haben  | * Dies ist das Verzeichnis, das Sie beim Start des Containers gemountet haben  | ||
* Wenn Sie den Inhalt dieses Verzeichnisses auflisten, werden die gleichen Dateien angezeigt wie im Verzeichnis getting-started-app auf Ihrem Host-Rechner  | * Wenn Sie den Inhalt dieses Verzeichnisses auflisten, werden die gleichen Dateien angezeigt wie im Verzeichnis getting-started-app auf Ihrem Host-Rechner  | ||
<syntaxhighlight lang="bash" highlight="1" line copy>  | <syntaxhighlight lang="bash" highlight="1" line copy>  | ||
cd src ; ls  | cd src; ls  | ||
</syntaxhighlight>  | </syntaxhighlight>  | ||
Dockerfile node_modules package.json spec src yarn.lock  | <syntaxhighlight lang="console">  | ||
 Dockerfile node_modules package.json spec src yarn.lock  | |||
</syntaxhighlight>  | |||
Erstellen Sie eine neue Datei namens myfile.txt  | 5. Erstellen Sie eine neue Datei namens myfile.txt  | ||
<syntaxhighlight lang="bash" highlight="1" line copy>  | <syntaxhighlight lang="bash" highlight="1" line copy>  | ||
| Zeile 77: | Zeile 84: | ||
</syntaxhighlight>  | </syntaxhighlight>  | ||
<syntaxhighlight lang="console">  | |||
Dockerfile myfile.txt node_modules package.json spec src yarn.lock  | Dockerfile myfile.txt node_modules package.json spec src yarn.lock  | ||
</syntaxhighlight>  | |||
Öffnen Sie das Verzeichnis getting-started-app auf dem Host und stellen Sie fest, dass sich die Datei <code>myfile.txt</code> in diesem Verzeichnis befindet  | 6. Öffnen Sie das Verzeichnis getting-started-app auf dem Host und stellen Sie fest, dass sich die Datei <code>myfile.txt</code> in diesem Verzeichnis befindet  | ||
<syntaxhighlight lang="  | <syntaxhighlight lang="console">  | ||
├── getting-started-app/  | ├── getting-started-app/  | ||
│ ├── Dockerdatei  | │ ├── Dockerdatei  | ||
| Zeile 92: | Zeile 101: | ||
</syntaxhighlight>  | </syntaxhighlight>  | ||
* Löschen Sie auf dem Host die Datei <code>myfile.txt</code>  | |||
* Listen Sie im Container noch einmal den Inhalt des <code>app</code>-Verzeichnisses auf  | |||
* Stellen Sie fest, dass die Datei jetzt verschwunden ist  | |||
<syntaxhighlight lang="bash" highlight="1" line copy>  | <syntaxhighlight lang="bash" highlight="1" line copy>  | ||
ls  | ls  | ||
</syntaxhighlight>  | </syntaxhighlight>  | ||
<syntaxhighlight lang="console">  | |||
Dockerfile node_modules package.json spec src yarn.lock  | Dockerfile node_modules package.json spec src yarn.lock  | ||
</syntaxhighlight>  | |||
Beenden Sie die interaktive Containersitzung mit Strg + D  | 7. Beenden Sie die interaktive Containersitzung mit Strg + D  | ||
== Entwicklungscontainer ==  | == Entwicklungscontainer ==  | ||
| Zeile 112: | Zeile 122: | ||
; Ausführen Anwendung in einem Entwicklungscontainer  | ; Ausführen Anwendung in einem Entwicklungscontainer  | ||
Die folgenden Schritte beschreiben, wie man einen Entwicklungscontainer mit einem Bind-Mount ausführt, der die folgenden Aufgaben erfüllt  | Die folgenden Schritte beschreiben, wie man einen Entwicklungscontainer mit einem Bind-Mount ausführt, der die folgenden Aufgaben erfüllt  | ||
* Binden Sie Ihren Quellcode in den Container ein  | |||
* Installieren aller Abhängigkeiten  | |||
* Starten von nodemon, um auf Änderungen im Dateisystem zu achten  | |||
* Vergewissern Sie sich, dass derzeit keine Getting-Started-Container laufen  | |||
Führen Sie den folgenden Befehl aus dem get-started-app-Verzeichnis aus  | 1. Führen Sie den folgenden Befehl aus dem get-started-app-Verzeichnis aus  | ||
<syntaxhighlight lang="bash" highlight="1-4" line copy>  | <syntaxhighlight lang="bash" highlight="1-4" line copy>  | ||
docker run -dp 127.0.0.1:3000:3000 \  | docker run -dp 127.0.0.1:3000:3000 \  | ||
| Zeile 143: | Zeile 153: | ||
|}  | |}  | ||
Sie können die Protokolle mit docker logs <container-id> einsehen  | 2. Sie können die Protokolle mit ''docker logs -f <container-id>'' einsehen  | ||
* Sie wissen, dass Sie bereit sind, wenn Sie dies sehen:  | * Sie wissen, dass Sie bereit sind, wenn Sie dies sehen:  | ||
<syntaxhighlight lang="  | <syntaxhighlight lang="console">  | ||
docker logs -f <container-id>  | $ docker logs -f <container-id>  | ||
nodemon -L src/index.js  | nodemon -L src/index.js  | ||
[nodemon] 2.0.20  | [nodemon] 2.0.20  | ||
| Zeile 154: | Zeile 165: | ||
[nodemon] überwachte Erweiterungen: js,mjs,json  | [nodemon] überwachte Erweiterungen: js,mjs,json  | ||
[nodemon] startet `node src/index.js`  | [nodemon] startet `node src/index.js`  | ||
Verwendung der sqlite-Datenbank unter /etc/todos/todo.db  | Verwendung der sqlite-Datenbank unter /etc/todos/todo.db  | ||
Lauschen auf Port 3000  | Lauschen auf Port 3000  | ||
</syntaxhighlight>  | |||
Wenn Sie mit dem Betrachten der Protokolle fertig sind, beenden Sie diese mit Strg+ C  | 3. Wenn Sie mit dem Betrachten der Protokolle fertig sind, beenden Sie diese mit Strg+ C  | ||
=== Entwickeln von Anwendungen ===  | === Entwickeln von Anwendungen ===  | ||
| Zeile 179: | Zeile 187: | ||
Wenn Sie fertig sind, stoppen Sie den Container und erstellen Sie Ihr neues Image mit:  | Wenn Sie fertig sind, stoppen Sie den Container und erstellen Sie Ihr neues Image mit:  | ||
<syntaxhighlight lang="bash" highlight="1" line copy>  | <syntaxhighlight lang="bash" highlight="1" line copy>  | ||
docker build -t getting-started  | docker buildx build -t getting-started .  | ||
</syntaxhighlight>  | </syntaxhighlight>  | ||
== Nächste Schritte ==  | == Nächste Schritte ==  | ||
Zur Vorbereitung der Anwendung auf den Produktionseinsatz sollte die Datenbank von SQLite auf ein skalierbareres System migriert werden.  | |||
* Für eine einfache Umsetzung wird weiterhin eine relationale Datenbank verwendet, wobei die Anwendung auf MySQL umgestellt wird.  | |||
* [[Docker/Multi-Container|Im nächsten Abschnitt]] wird beschrieben, wie MySQL ausgeführt und die Kommunikation zwischen Containern ermöglicht wird.  | |||
== Anhang ==  | == Anhang ==  | ||
=== Siehe auch ===  | === Siehe auch ===  | ||
<div style="column-count:2">  | <div style="column-count:2">  | ||
<categorytree hideroot=on mode="pages">Docker  | <categorytree hideroot=on mode="pages">Docker</categorytree>  | ||
</div>  | </div>  | ||
----  | ----  | ||
| Zeile 214: | Zeile 219: | ||
* [https://docs.docker.com/storage/ Verwalten von Daten in Docker]  | * [https://docs.docker.com/storage/ Verwalten von Daten in Docker]  | ||
[[Kategorie:Docker  | [[Kategorie:Docker]]  | ||
</noinclude>  | </noinclude>  | ||
Aktuelle Version vom 3. November 2025, 17:51 Uhr
Docker/Mounts
Beschreibung
- Datenbank persistieren
 - Änderungen an Anwendungen während der Entwicklung sehen, ohne das Image neu zu erstellenIm nächsten Abschnitt
 - Volume-Mounts und Bind-Mounts unterstützt Docker auch andere Mount-Typen und Speichertreiber
- um komplexere und spezialisierte Anwendungsfälle zu behandeln
 
 
Mounts
- Bind Mounts
 
Methode in Docker, bei der ein Verzeichnis oder eine Datei vom Hostsystem in einen Container eingebunden wird
- Dabei verwendet der Container die echten Daten vom Host, und Änderungen im Container wirken sich unmittelbar auf den Host aus (und umgekehrt)
 
- Verwenden von Bind Mounts
 

Im vorherigen Abschnitt haben Sie ein Volume Mount verwendet, um die Daten in Ihrer Datenbank zu speichern Bind Mounts werden ebenfalls verwendet und weisen einige Besonderheiten auf:
- Ein Bind Mount verbindet ein echtes Verzeichnis oder eine Datei vom Host-System direkt mit einem Container
 - Im Gegensatz zu einem Volume Mount werden die Daten physisch auf dem Host an dem angegebenen Pfad gespeichert und nicht im von Docker verwalteten Speicher
 - Änderungen, die im Container vorgenommen werden, sind sofort auf dem Host sichtbar – und umgekehrt
 - Diese Methode eignet sich besonders für Entwicklung und Debugging, wenn es wichtig ist, Codeänderungen sofort zu sehen, ohne das Image neu zu bauen
 - Bind Mount hängt von der Dateistruktur und den Pfaden des Hostsystems ab, was die Portabilität der Container verringert
 
Im Folgenden wird die Verwendung von Bind Mounts und des Tools nodemon beschrieben, um Dateiänderungen zu überwachen und die Anwendung automatisch neu zu starten
Vergleiche von Volume-Typen
- Beispiele
 
| Benanntes Volume | type=volume,src=my-volume,target=/usr/local/data | 
| Bind-Mount | type=bind,src=/path/to/data,target=/usr/local/data | 
- Unterschiede Volume-Einhängungen und Bind-Einhängungen
 
| Benannte Volumes | Bind-Mounts | |
|---|---|---|
| Speicherort des Hosts | Docker wählt aus | Sie entscheiden | 
| Füllt das neue Volume mit Containerinhalten | Ja | Nein | 
| Unterstützt Volume-Treiber | Ja | Nein | 
Bind-Mounts
Um mit Bind Mounts zu arbeiten, kann ein kurzes Experiment durchgeführt werden, um das Funktionsprinzip praktisch zu verstehen
1. In das Verzeichnis getting-started-app wechseln
2. Den folgenden Befehl ausführen, um Bash in einem Ubuntu-Container mit einem Bind Mount zu starten
docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash
- Die Option 
--mount type=bindweist Docker an, einen Bind-Mount zu erstellen, wobeisrcdas aktuelle Arbeitsverzeichnis auf dem Host-Rechner (getting-started-app) undtargetdas Verzeichnis ist, das im Container erscheinen soll (/src) 
3. Nach dem Ausführen des Befehls startet Docker eine interaktive Bash-Sitzung im Stammverzeichnis des Dateisystems des Containers
pwd; ls
 bin dev home media opt root sbin srv tmp var boot etc lib mnt proc run src sys usr
4. Wechseln Sie in das src-Verzeichnis
- Dies ist das Verzeichnis, das Sie beim Start des Containers gemountet haben
 - Wenn Sie den Inhalt dieses Verzeichnisses auflisten, werden die gleichen Dateien angezeigt wie im Verzeichnis getting-started-app auf Ihrem Host-Rechner
 
cd src; ls
 Dockerfile node_modules package.json spec src yarn.lock
5. Erstellen Sie eine neue Datei namens myfile.txt
touch myfile.txt; ls
Dockerfile myfile.txt node_modules package.json spec src yarn.lock
6. Öffnen Sie das Verzeichnis getting-started-app auf dem Host und stellen Sie fest, dass sich die Datei myfile.txt in diesem Verzeichnis befindet
├── getting-started-app/
│ ├── Dockerdatei
│ ├── meineDatei.txt
│ ├── node_modules/
│ ├── package.json
│ ├── spec/
│ ├── src/
│ └── yarn.lock
- Löschen Sie auf dem Host die Datei 
myfile.txt - Listen Sie im Container noch einmal den Inhalt des 
app-Verzeichnisses auf - Stellen Sie fest, dass die Datei jetzt verschwunden ist
 
ls
Dockerfile node_modules package.json spec src yarn.lock
7. Beenden Sie die interaktive Containersitzung mit Strg + D
Entwicklungscontainer
- Die Verwendung von Bind-Mounts ist für lokale Entwicklungsumgebungen üblich
 - Der Vorteil ist, dass auf dem Entwicklungsrechner nicht alle Build-Tools und Umgebungen installiert sein müssen
 - Mit einem einzigen Docker-Run-Befehl ruft Docker die Abhängigkeiten und Tools ab
 
Ausführen Anwendung
- Ausführen Anwendung in einem Entwicklungscontainer
 
Die folgenden Schritte beschreiben, wie man einen Entwicklungscontainer mit einem Bind-Mount ausführt, der die folgenden Aufgaben erfüllt
- Binden Sie Ihren Quellcode in den Container ein
 - Installieren aller Abhängigkeiten
 - Starten von nodemon, um auf Änderungen im Dateisystem zu achten
 - Vergewissern Sie sich, dass derzeit keine Getting-Started-Container laufen
 
1. Führen Sie den folgenden Befehl aus dem get-started-app-Verzeichnis aus
docker run -dp 127.0.0.1:3000:3000 \
-w /app --mount type=bind,src="$(pwd)",target=/app \
node:18-alpine \
sh -c "yarn install && yarn run dev"
| Zeile | Parameter | Beschreibung | 
|---|---|---|
| 1 | -dp 127.0.0.1:3000:3000 | Wird im abgetrennten Modus (im Hintergrund) ausgeführt und erstellt eine Port-Zuordnung | 
| 2 | -w /app | Legt das "Arbeitsverzeichnis" oder das aktuelle Verzeichnis fest, von dem aus der Befehl ausgeführt werden soll | 
| 3 | --mount type=bind,src="$(pwd)",target=/app | Bindet das aktuelle Verzeichnis vom Host in das /app-Verzeichnis im Container ein | 
| 4 | node:18-alpine | Das zu verwendende Image
  | 
| 5 | sh -c "yarn install && yarn run dev" | Der Befehl
  | 
2. Sie können die Protokolle mit docker logs -f <container-id> einsehen
- Sie wissen, dass Sie bereit sind, wenn Sie dies sehen:
 
$ docker logs -f <container-id>
nodemon -L src/index.js
[nodemon] 2.0.20
[nodemon] um jederzeit neu zu starten, geben Sie `rs` ein
[nodemon] überwachte(r) Pfad(e): *.*
[nodemon] überwachte Erweiterungen: js,mjs,json
[nodemon] startet `node src/index.js`
Verwendung der sqlite-Datenbank unter /etc/todos/todo.db
Lauschen auf Port 3000
3. Wenn Sie mit dem Betrachten der Protokolle fertig sind, beenden Sie diese mit Strg+ C
Entwickeln von Anwendungen
- Aktualisieren Sie Ihre Anwendung auf Ihrem Host-Rechner und sehen Sie sich die Änderungen im Container an
 
- Ändern Sie in der Datei src/static/js/app.js in Zeile 109 die Schaltfläche "Element hinzufügen" so, dass sie einfach "Hinzufügen" lautet:
 
- {Senden ? 'Hinzufügen...' : 'Element hinzufügen'}
+ {Senden ? 'Hinzufügen...' : 'Hinzufügen'}
- Speichern Sie die Datei
 - Aktualisieren Sie die Seite in Ihrem Webbrowser, und Sie sollten sehen, dass die Änderung aufgrund des Bind-Mounts fast sofort übernommen wird
 - Nodemon erkennt die Änderung und startet den Server neu
 - Es kann ein paar Sekunden dauern, bis der Node-Server neu gestartet ist
 - Wenn Sie eine Fehlermeldung erhalten, versuchen Sie, die Seite nach ein paar Sekunden neu zu starten
 
- Sie können alle anderen Änderungen vornehmen, die Sie vornehmen möchten
 - Jedes Mal, wenn Sie eine Änderung vornehmen und eine Datei speichern, wird die Änderung aufgrund des Bind-Mounts in den Container übernommen
 - Wenn Nodemon eine Änderung feststellt, startet es die Anwendung innerhalb des Containers automatisch neu
 
Wenn Sie fertig sind, stoppen Sie den Container und erstellen Sie Ihr neues Image mit:
docker buildx build -t getting-started .
Nächste Schritte
Zur Vorbereitung der Anwendung auf den Produktionseinsatz sollte die Datenbank von SQLite auf ein skalierbareres System migriert werden.
- Für eine einfache Umsetzung wird weiterhin eine relationale Datenbank verwendet, wobei die Anwendung auf MySQL umgestellt wird.
 - Im nächsten Abschnitt wird beschrieben, wie MySQL ausgeführt und die Kommunikation zwischen Containern ermöglicht wird.
 
Anhang
Siehe auch
Dokumentation
Links
Projekt
Weblinks
- https://docs.docker.com/get-started/workshop/06_bind_mounts
 - Docker CLI-Referenz
 - Verwalten von Daten in Docker