💾Volumes, Bind-Mounts und tmpfs
Die beschreibbare Container-Schicht ist flüchtig und langsam (Copy-on-Write). Alles, was bleiben soll, gehört in ein Volume oder einen Bind-Mount.
🧪Was überlebt welche Aktion?
Eine Datenbank schreibt nach /var/lib/mysql. Wähle eine Aktion und vergleiche die vier Varianten.
ohne Mount
(nichts)Daten liegen in
beschreibbare Container-Schicht (upperdir)
❌ Daten sind weg
Neuer Container = neue, leere Schicht. Alles weg.
Benanntes Volume
-v db-data:/var/lib/mysqlDaten liegen in
/var/lib/docker/volumes/db-data/_data
✅ Daten bleiben
Das Volume lebt unabhängig vom Container und wird neu eingehängt.
Bind-Mount
-v ./daten:/var/lib/mysqlDaten liegen in
./daten im Projektordner des Hosts
✅ Daten bleiben
Der Host-Ordner wird einfach wieder eingehängt.
tmpfs
--tmpfs /var/lib/mysqlDaten liegen in
Arbeitsspeicher (RAM)
❌ Daten sind weg
Im RAM – weg.
⚖️Vergleich
| 📦 Volume | 📁 Bind-Mount | ⚡ tmpfs | |
|---|---|---|---|
| Verwaltet von | Docker (docker volume …) | dir selbst (Host-Dateisystem) | Kernel (RAM) |
| Ort auf dem Host | /var/lib/docker/volumes/<name>/_data | beliebiger Pfad, z. B. ./daten | kein Ort – nur im Speicher |
| Beim ersten Einhängen | leeres Volume wird mit dem Inhalt des Image-Verzeichnisses befüllt | Host-Inhalt verdeckt das Image-Verzeichnis | leer |
| Rechte / UIDs | Docker legt passend an | UIDs müssen zwischen Host und Container passen | – |
| Typischer Einsatz | Datenbanken, Uploads, alles Persistente | Quellcode in der Entwicklung, Konfigdateien (:ro) | Caches, Geheimnisse, die nie auf Platte sollen |
| Compose-Syntax | db-data:/var/lib/mysql + volumes: db-data: | ./db/init:/docker-entrypoint-initdb.d:ro | tmpfs: [/tmp] |
Container Host ┌────────────────────────┐ │ /var/lib/mysql ───────┼──► /var/lib/docker/volumes/db-data/_data (Volume) │ /docker-entrypoint- │ │ initdb.d ───────┼──► ./db/init (Bind-Mount, :ro) │ /tmp ───────┼──► RAM (tmpfs) │ alles andere ───────┼──► upperdir der Container-Schicht (weg nach docker rm) └────────────────────────┘
⚠️ docker compose down -v
Löscht die benannten Volumes des Projekts – bei einer Datenbank also alle Daten. Vor dem Aufräumen ein Backup ziehen (z. B. mariadb-dump).
💡 Sichern eines Volumes
docker run --rm -v db-data:/q -v $PWD:/z alpine tar czf /z/db-data.tgz -C /q . – ein Wegwerf-Container packt das Volume in ein Archiv im aktuellen Ordner.