💾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/mysql
Daten 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/mysql
Daten liegen in
./daten im Projektordner des Hosts
✅ Daten bleiben
Der Host-Ordner wird einfach wieder eingehängt.

tmpfs

--tmpfs /var/lib/mysql
Daten liegen in
Arbeitsspeicher (RAM)
❌ Daten sind weg
Im RAM – weg.

⚖️Vergleich

📦 Volume📁 Bind-Mount⚡ tmpfs
Verwaltet vonDocker (docker volume …)dir selbst (Host-Dateisystem)Kernel (RAM)
Ort auf dem Host/var/lib/docker/volumes/<name>/_databeliebiger Pfad, z. B. ./datenkein Ort – nur im Speicher
Beim ersten Einhängenleeres Volume wird mit dem Inhalt des Image-Verzeichnisses befülltHost-Inhalt verdeckt das Image-Verzeichnisleer
Rechte / UIDsDocker legt passend anUIDs müssen zwischen Host und Container passen
Typischer EinsatzDatenbanken, Uploads, alles PersistenteQuellcode in der Entwicklung, Konfigdateien (:ro)Caches, Geheimnisse, die nie auf Platte sollen
Compose-Syntaxdb-data:/var/lib/mysql + volumes: db-data:./db/init:/docker-entrypoint-initdb.d:rotmpfs: [/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.