Zum Inhalt springen

Docker/Mounts: Unterschied zwischen den Versionen

Aus Foxwiki
Die Seite wurde neu angelegt: „== Mounts == ; Bind Mounts ; Verwenden von Bind Mounts In [https://docs.docker.com/get-started/workshop/05_persisting_data/ Teil 4] haben Sie einen Volume Mount verwendet, um die Daten in Ihrer Datenbank zu speichern. Ein Volume Mount ist eine gute Wahl, wenn Sie einen dauerhaften Ort zum Speichern Ihrer Anwendungsdaten benötigen Ein Bind-Mount ist eine andere Art von Mount, mit dem Sie ein Verzeichnis aus dem Dateisystem des Hosts in den Container einb…“
 
K Dirkwagner verschob die Seite Docker/Workshop/Mounts nach Docker/Mounts, ohne dabei eine Weiterleitung anzulegen: Textersetzung - „Docker/Workshop/“ durch „Docker/“
 
(77 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
'''{{BASEPAGENAME}}'''
== 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 ==
== Mounts ==
; Bind Mounts
; Bind Mounts
Methode in [[Docker]], bei der ein Verzeichnis oder eine Datei vom Hostsystem in einen [[Docker/Container und Virtuelle Maschinen|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
; Verwenden von Bind Mounts
In [https://docs.docker.com/get-started/workshop/05_persisting_data/ Teil 4] haben Sie einen Volume Mount verwendet, um die Daten in Ihrer Datenbank zu speichern. Ein Volume Mount ist eine gute Wahl, wenn Sie einen dauerhaften Ort zum Speichern Ihrer Anwendungsdaten benötigen
[[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:
* 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


Ein Bind-Mount ist eine andere Art von Mount, mit dem Sie ein Verzeichnis aus dem Dateisystem des Hosts in den Container einbinden können. Wenn Sie an einer Anwendung arbeiten, können Sie einen Bind-Mount verwenden, um den Quellcode in den Container zu mounten. Der Container sieht die Änderungen, die Sie an dem Code vornehmen, sofort, sobald Sie eine Datei speichern. Das bedeutet, dass Sie im Container Prozesse laufen lassen können, die auf Änderungen im Dateisystem achten und auf diese reagieren
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


In diesem Kapitel werden Sie sehen, wie Sie bind mounts und ein Werkzeug namens [https://npmjs.com/package/nodemon nodemon] verwenden können, um auf Datei-Änderungen zu achten und dann die Anwendung automatisch neu zu starten. In den meisten anderen Sprachen und Frameworks gibt es entsprechende Werkzeuge
== Vergleiche von Volume-Typen ==
 
; Beispiele
=== [https://docs.docker.com/get-started/workshop/06_bind_mounts/#quick-volume-type-comparisons Schnelle Vergleiche von Volume-Typen] ===
{| class="wikitable options big"
Im Folgenden finden Sie Beispiele für ein benanntes Volume und einen Bind-Mount mit --mount
| Benanntes Volume || type=volume,src=my-volume,target=/usr/local/data
* Benanntes Volume: type=volume,src=my-volume,target=/usr/local/data
|-
* Bind-Mount: type=bind,src=/path/to/data,target=/usr/local/data
| Bind-Mount || type=bind,src=/path/to/data,target=/usr/local/data
 
|}
In der folgenden Tabelle sind die wichtigsten Unterschiede zwischen Volume-Einhängungen und Bind-Einhängungen aufgeführt
 
{| style="border-spacing:0;width:13.744cm;"
|- style="border:none;padding:0.049cm;"
! align=center|
! align=center| Benannte Volumes
! align=center| Bind-Mounts
|- style="border:none;padding:0.049cm;"
|| Speicherort des Hosts
|| Docker wählt aus
|| Sie entscheiden
|- style="border:none;padding:0.049cm;"
|| Füllt das neue Volume mit Containerinhalten
|| Ja
|| Nein
|- style="border:none;padding:0.049cm;"
|| Unterstützt Volume-Treiber
|| Ja
|| Nein


; Unterschiede Volume-Einhängungen und Bind-Einhängungen
{| class="wikitable options big"
|-
! !! 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
|}
|}
=== [https://docs.docker.com/get-started/workshop/06_bind_mounts/#trying-out-bind-mounts Ausprobieren von Bind-Mounts] ===
Bevor Sie sich ansehen, wie Sie Bind-Mounts für die Entwicklung Ihrer Anwendung verwenden können, können Sie ein kurzes Experiment durchführen, um ein praktisches Verständnis dafür zu bekommen, wie Bind-Mounts funktionieren.# Vergewissern Sie sich, dass sich Ihr getting-started-app-Verzeichnis in einem Verzeichnis befindet, das in den Einstellungen für die Dateifreigabe von Docker Desktop definiert ist. Diese Einstellung legt fest, welche Teile Ihres Dateisystems Sie für Container freigeben können. Einzelheiten zum Zugriff auf die Einstellung finden Sie unter[https://docs.docker.com/desktop/settings-and-maintenance/settings/#file-sharing File sharing .]


* Hinweis
== Bind-Mounts ==
Um mit Bind Mounts zu arbeiten, kann ein kurzes Experiment durchgeführt werden, um das Funktionsprinzip praktisch zu verstehen


Die Registerkarte '''Dateifreigabe '''ist nur im Hyper-V-Modus verfügbar, da die Dateien im WSL 2-Modus und im Windows-Container-Modus automatisch freigegeben werden.* Öffnen Sie ein Terminal und wechseln Sie in das get-started-app-Verzeichnis
1. In das Verzeichnis ''getting-started-app'' wechseln


* Führen Sie den folgenden Befehl aus, um Bash in einem Ubuntu-Container mit einem Bind-Mount zu starten
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
<syntaxhighlight lang="bash" highlight="1" line copy>
docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash</syntaxhighlight>


Die Option --mount type=bind weist Docker an, einen Bind-Mount zu erstellen, wobei src das aktuelle Arbeitsverzeichnis auf dem Host-Rechner (getting-started-app) und target das Verzeichnis ist, das im Container erscheinen soll (/src).* Nach dem Ausführen des Befehls startet Docker eine interaktive Bash-Sitzung im Stammverzeichnis des Dateisystems des Containers
* 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>)


* root@ac1237fad8db:/# pwd
3.&nbsp;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>
pwd; ls
</syntaxhighlight>


root@ac1237fad8db:/# ls
<syntaxhighlight lang="console">
bin dev home media opt root sbin srv tmp var boot etc lib mnt proc run src sys usr
</syntaxhighlight>


bin dev home media opt root sbin srv tmp var
4.&nbsp;Wechseln Sie in das <code>src</code>-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


boot etc lib mnt proc run src sys usr* Wechseln Sie in das src-Verzeichnis
<syntaxhighlight lang="bash" highlight="1" line copy>
cd src; ls
</syntaxhighlight>


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.* root@ac1237fad8db:/# cd src
<syntaxhighlight lang="console">
Dockerfile node_modules package.json spec src yarn.lock
</syntaxhighlight>


root@ac1237fad8db:/src# ls
5.&nbsp;Erstellen Sie eine neue Datei namens myfile.txt


Dockerfile node_modules package.json spec src yarn.lock* Erstellen Sie eine neue Datei namens myfile.txt
<syntaxhighlight lang="bash" highlight="1" line copy>
touch myfile.txt; ls
</syntaxhighlight>


* root@ac1237fad8db:/src# touch myfile.txt
<syntaxhighlight lang="console">
Dockerfile myfile.txt node_modules package.json spec src yarn.lock
</syntaxhighlight>


root@ac1237fad8db:/src# ls
6.&nbsp;Ö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
 
Dockerfile myfile.txt node_modules package.json spec src yarn.lock* Ö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/


<syntaxhighlight lang="console">
├── getting-started-app/
│ ├── Dockerdatei
│ ├── Dockerdatei
│ ├── meineDatei.txt
│ ├── meineDatei.txt
│ ├── node_modules/
│ ├── node_modules/
│ ├── package.json
│ ├── package.json
│ ├── spec/
│ ├── spec/
│ ├── src/
│ ├── src/
│ └── yarn.lock
</syntaxhighlight>


│ └── yarn.lock* Löschen Sie auf dem Host die Datei myfile.txt
* 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


* Listen Sie im Container noch einmal den Inhalt des app-Verzeichnisses auf. Stellen Sie fest, dass die Datei jetzt verschwunden ist
<syntaxhighlight lang="bash" highlight="1" line copy>
ls
</syntaxhighlight>
<syntaxhighlight lang="console">
Dockerfile node_modules package.json spec src yarn.lock
</syntaxhighlight>


# root@ac1237fad8db:/src# ls
7.&nbsp;Beenden Sie die interaktive Containersitzung mit Strg + D


Dockerfile node_modules package.json spec src yarn.lock# 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


Das ist alles für eine kurze Einführung in Bind Mounts. Dieses Verfahren hat gezeigt, wie Dateien zwischen dem Host und dem Container geteilt werden und wie Änderungen sofort auf beiden Seiten reflektiert werden. Jetzt können Sie Bind-Mounts für die Entwicklung von Software verwenden
=== Ausführen Anwendung ===
 
; Ausführen Anwendung in einem Entwicklungscontainer
=== [https://docs.docker.com/get-started/workshop/06_bind_mounts/#development-containers 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
 
==== [https://docs.docker.com/get-started/workshop/06_bind_mounts/#run-your-app-in-a-development-container Ausführen Ihrer 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
* Binden Sie Ihren Quellcode in den Container ein
* Installieren aller Abhängigkeiten
* Installieren aller Abhängigkeiten
* Starten von nodemon, um auf Änderungen im Dateisystem zu achten
* Starten von nodemon, um auf Änderungen im Dateisystem zu achten
* Vergewissern Sie sich, dass derzeit keine Getting-Started-Container laufen


Sie können die CLI oder Docker Desktop verwenden, um Ihren Container mit einem Bind-Mount zu starten.# Vergewissern Sie sich, dass derzeit keine Getting-Started-Container laufen
1.&nbsp;Führen Sie den folgenden Befehl aus dem get-started-app-Verzeichnis aus
# Führen Sie den folgenden Befehl aus dem get-started-app-Verzeichnis aus
<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 \
 
-w /app --mount type=bind,src="$(pwd)",target=/app \
-w /app --mount type=bind,src="$(pwd)",target=/app \
node:18-alpine \
node:18-alpine \
sh -c "yarn install && yarn run dev"
sh -c "yarn install && yarn run dev"
</syntaxhighlight>


Es folgt eine Aufschlüsselung des Befehls
{| class="wikitable sortable options big"
* -dp 127.0.0.1:3000:3000 - wie zuvor. Wird im abgetrennten Modus (im Hintergrund) ausgeführt und erstellt eine Port-Zuordnung
|-
* -w /app - legt das "Arbeitsverzeichnis" oder das aktuelle Verzeichnis fest, von dem aus der Befehl ausgeführt werden soll
! Zeile || Parameter !! Beschreibung
* --mount type=bind,src="$(pwd)",target=/app - bindet das aktuelle Verzeichnis vom Host in das /app-Verzeichnis im Container ein
|-
* node:18-alpine - das zu verwendende Image. Beachten Sie, dass dies das Basis-Image für Ihre App aus dem Dockerfile ist
| 1 || -dp 127.0.0.1:3000:3000 || Wird im abgetrennten Modus (im Hintergrund) ausgeführt und erstellt eine Port-Zuordnung
* sh -c "yarn install && yarn run dev" - der Befehl. Sie starten eine Shell mit sh (Alpine hat keine Bash) und führen yarn install aus, um Pakete zu installieren, und führen dann yarn run dev aus, um den Entwicklungsserver zu starten. Wenn Sie in der package.json nachsehen, werden Sie sehen, dass das dev-Skript nodemon startet
|-
| 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
* Beachten Sie, dass dies das Basis-Image für Ihre App aus dem Dockerfile ist
|-
| 5 || sh -c "yarn install && yarn run dev" || Der Befehl
* Sie starten eine Shell mit sh (Alpine hat keine Bash) und führen yarn install aus, um Pakete zu installieren, und führen dann yarn run dev aus, um den Entwicklungsserver zu starten
* Wenn Sie in der package.json nachsehen, werden Sie sehen, dass das dev-Skript nodemon startet
|}


* Sie können die Protokolle mit docker logs <container-id> einsehen. Sie wissen, dass Sie bereit sind, wenn Sie dies sehen:
2.&nbsp;Sie können die Protokolle mit ''docker logs -f <container-id>'' einsehen


# docker logs -f <container-id>
* Sie wissen, dass Sie bereit sind, wenn Sie dies sehen:


<syntaxhighlight lang="console">
$ docker logs -f <container-id>
nodemon -L src/index.js
nodemon -L src/index.js
[nodemon] 2.0.20
[nodemon] 2.0.20
[nodemon] um jederzeit neu zu starten, geben Sie `rs` ein
[nodemon] um jederzeit neu zu starten, geben Sie `rs` ein
[nodemon] überwachte(r) Pfad(e): *.*
[nodemon] überwachte(r) Pfad(e): *.*
[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>
3.&nbsp;Wenn Sie mit dem Betrachten der Protokolle fertig sind, beenden Sie diese mit Strg+ C


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
==== [https://docs.docker.com/get-started/workshop/06_bind_mounts/#develop-your-app-with-the-development-container Entwickeln Sie Ihre Anwendung mit dem Entwicklungscontainer] ====
* Ä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:
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


* - {Senden ? 'Hinzufügen...' : 'Element hinzufügen'}
* 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


+ {Senden ? 'Hinzufügen...' : 'Hinzufügen'}
Wenn Sie fertig sind, stoppen Sie den Container und erstellen Sie Ihr neues Image mit:
<syntaxhighlight lang="bash" highlight="1" line copy>
docker buildx build -t getting-started .
</syntaxhighlight>


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
== Nächste Schritte ==
Zur Vorbereitung der Anwendung auf den Produktionseinsatz sollte die Datenbank von SQLite auf ein skalierbareres System migriert werden.


* 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:
* 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.


# docker build -t getting-started
== Anhang ==
=== Siehe auch ===
<div style="column-count:2">
<categorytree hideroot=on mode="pages">Docker/Workshop</categorytree>
</div>
----
{{Special:PrefixIndex/{{BASEPAGENAME}}/}}


=== [https://docs.docker.com/get-started/workshop/06_bind_mounts/#summary Zusammenfassung] ===
=== Dokumentation ===
Jetzt können Sie Ihre Datenbank persistieren und Änderungen in Ihrer Anwendung während der Entwicklung sehen, ohne das Image neu zu erstellen
<!--
; Man-Page
# [https://manpages.debian.org/stable/procps/pgrep.1.de.html prep(1)]


Zusätzlich zu Volume-Mounts und Bind-Mounts unterstützt Docker auch andere Mount-Typen und Speichertreiber, um komplexere und spezialisierte Anwendungsfälle zu behandeln
; Info-Pages
-->


Weitere Informationen
=== Links ===
==== Projekt ====
==== Weblinks ====
* https://docs.docker.com/get-started/workshop/06_bind_mounts
* [https://docs.docker.com/reference/cli/docker/ Docker CLI-Referenz]
* [https://docs.docker.com/reference/cli/docker/ Docker CLI-Referenz]
* [https://docs.docker.com/storage/ Verwalten von Daten in Docker]
* [https://docs.docker.com/storage/ Verwalten von Daten in Docker]


=== [https://docs.docker.com/get-started/workshop/06_bind_mounts/#next-steps Nächste Schritte] ===
[[Kategorie:Docker]]
Um Ihre Anwendung für die Produktion vorzubereiten, müssen Sie Ihre Datenbank von SQLite auf etwas migrieren, das besser skaliert werden kann. Der Einfachheit halber werden Sie weiterhin eine relationale Datenbank verwenden und Ihre Anwendung auf MySQL umstellen. Aber wie sollten Sie MySQL ausführen? Wie ermöglichen Sie es den Containern, miteinander zu kommunizieren? Das werden Sie im nächsten Abschnitt erfahren


[https://docs.docker.com/get-started/workshop/07_multi_container/ Multi-Container-Anwendungen]
</noinclude>

Aktuelle Version vom 2. November 2025, 11:44 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=bind weist Docker an, einen Bind-Mount zu erstellen, wobei src das aktuelle Arbeitsverzeichnis auf dem Host-Rechner (getting-started-app) und target das 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
  • Beachten Sie, dass dies das Basis-Image für Ihre App aus dem Dockerfile ist
5 sh -c "yarn install && yarn run dev" Der Befehl
  • Sie starten eine Shell mit sh (Alpine hat keine Bash) und führen yarn install aus, um Pakete zu installieren, und führen dann yarn run dev aus, um den Entwicklungsserver zu starten
  • Wenn Sie in der package.json nachsehen, werden Sie sehen, dass das dev-Skript nodemon startet

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

Kategorie Docker/Workshop wurde nicht gefunden


Dokumentation

Links

Projekt

Weblinks