Volumeeinbindung
Der Parameter -v
in docker run
ermöglicht es uns, Volumes einzubinden und Daten zwischen dem Host und dem Container zu teilen. Dies ist äußerst nützlich, um Daten persistent zu speichern oder Konfigurationsdateien an den Container zu übergeben.
Beginnen wir damit, eine einfache Verzeichnisstruktur auf unserem Host zu erstellen:
mkdir -p ~/project/nginx-data
echo "<html><body><h1>Hello from mounted volume</h1></body></html>" > ~/project/nginx-data/index.html
Diese Befehle tun Folgendes:
- Erstellen Sie ein neues Verzeichnis
nginx-data
im project
-Ordner in Ihrem Home-Verzeichnis.
- Erstellen Sie eine einfache HTML-Datei namens
index.html
in diesem neuen Verzeichnis.
Jetzt starten wir einen Nginx-Container und binden dieses Verzeichnis ein:
docker run -d --name nginx-volume -p 8081:80 -v ~/project/nginx-data:/usr/share/nginx/html nginx
Lassen Sie uns diesen Befehl zerlegen:
docker run
: Dies ist der Befehl, um einen neuen Container zu starten.
-d
: Dies startet den Container im detached-Modus (im Hintergrund).
--name nginx-volume
: Dies weist dem Container den Namen "nginx-volume" zu.
-p 8081:80
: Dies ordnet Port 8081 auf dem Host Port 80 im Container zu.
-v ~/project/nginx-data:/usr/share/nginx/html
: Dies bindet das nginx-data
-Verzeichnis von unserem Host an das Verzeichnis /usr/share/nginx/html
im Container ein. Hier sucht Nginx nach Inhalten, die es servieren soll.
nginx
: Dies ist der Name des Images, das wir zum Erstellen des Containers verwenden.
Jetzt überprüfen wir, ob die benutzerdefinierte Seite serviert wird:
curl http://localhost:8081
Sie sollten den Inhalt Ihrer benutzerdefinierten HTML-Datei sehen: "Hello from mounted volume!"
Wenn Sie Ihren benutzerdefinierten Inhalt nicht sehen, sollten Sie folgende Dinge überprüfen:
- Stellen Sie sicher, dass die Datei
~/project/nginx-data/index.html
auf Ihrem Host-System existiert.
- Überprüfen Sie, ob der Container läuft:
docker ps | grep nginx-volume
- Prüfen Sie die Nginx-Protokolle auf Fehler:
docker logs nginx-volume
Diese Methode, ein Host-Verzeichnis an einen Container einzubinden, wird als Bind-Mount (Bindungseinbindung) bezeichnet. Es ist eine einfache Möglichkeit, Dateien zwischen dem Host und dem Container zu teilen. Hier sind einige wichtige Punkte zu beachten:
- Der Pfad des Host-Verzeichnisses muss ein absoluter Pfad sein.
- Wenn das Host-Verzeichnis nicht existiert, wird Docker es automatisch erstellen.
- Alle Änderungen an Dateien in diesem Verzeichnis (sowohl auf dem Host als auch im Container) sind sofort für den Host und den Container sichtbar.
- Achten Sie auf die Berechtigungen: Der Container läuft standardmäßig als root, was möglicherweise Dateien erstellt, die Ihr Host-Benutzer nicht ändern kann.
Durch die Verwendung dieser Methode vermeiden wir den Fehler "not a directory" (kein Verzeichnis), da wir ein Verzeichnis und nicht eine einzelne Datei einbinden. Dieser Ansatz gibt Ihnen mehr Flexibilität, um Dateien hinzuzufügen, zu entfernen oder zu ändern, ohne den Container neu erstellen zu müssen.