Volume-Mounting
Der Parameter -v in docker run erlaubt es uns, Volumes einzubinden (Mounting), um Daten zwischen dem Host und dem Container zu teilen. Dies ist äußerst nützlich, um Daten dauerhaft zu speichern oder dem Container Konfigurationsdateien zur Verfügung zu stellen.
Zuerst erstellen wir eine einfache Verzeichnisstruktur auf unserem Host:
mkdir -p ~/project/nginx-data
echo "<html><body><h1>Hello from mounted volume</h1></body></html>" > ~/project/nginx-data/index.html
Diese Befehle bewirken Folgendes:
- Erstellen eines neuen Verzeichnisses
nginx-data innerhalb des Ordners project in Ihrem Home-Verzeichnis.
- Erstellen einer einfachen HTML-Datei namens
index.html in diesem neuen Verzeichnis.
Nun 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 analysieren:
docker run: Der Befehl zum Starten eines neuen Containers.
-d: Führt den Container im Hintergrund aus.
--name nginx-volume: Weist unserem Container den Namen "nginx-volume" zu.
-p 8081:80: Mappt Port 8081 des Hosts auf Port 80 des Containers.
-v ~/project/nginx-data:/usr/share/nginx/html: Dies bindet das Verzeichnis nginx-data von unserem Host in das Verzeichnis /usr/share/nginx/html im Container ein. Dort sucht Nginx nach Inhalten, die ausgeliefert werden sollen.
nginx: Das verwendete Image.
Überprüfen wir nun, ob die benutzerdefinierte Seite ausgeliefert wird:
curl http://localhost:8081
Sie sollten den Inhalt Ihrer eigenen HTML-Datei sehen: "Hello from mounted volume!"
Falls Sie Ihren Inhalt nicht sehen, prüfen Sie bitte:
- Existiert die Datei
~/project/nginx-data/index.html auf Ihrem Host-System?
- Läuft der Container?
docker ps | grep nginx-volume
- Prüfen Sie die Nginx-Logs auf Fehler:
docker logs nginx-volume
Diese Methode, ein Host-Verzeichnis in einen Container einzubinden, nennt man "Bind Mount". Es ist ein direkter Weg, Dateien zu teilen. Beachten Sie dabei:
- Der Pfad zum Host-Verzeichnis muss ein absoluter Pfad sein.
- Wenn das Host-Verzeichnis nicht existiert, erstellt Docker es automatisch.
- Änderungen an Dateien in diesem Verzeichnis (egal ob auf dem Host oder im Container) sind sofort für beide Seiten sichtbar.
- Achten Sie auf Berechtigungen: Der Container läuft standardmäßig als Root, was dazu führen kann, dass Dateien erstellt werden, die Ihr Host-Benutzer nicht bearbeiten kann.
Durch das Einbinden eines Verzeichnisses (statt einer einzelnen Datei) vermeiden wir potenzielle Fehler und bleiben flexibel beim Hinzufügen oder Ändern von Dateien, ohne den Container neu erstellen zu müssen.