Das Problem: Container Sind Kurzlebig

Bevor wir ĂŒber Volumes sprechen, mĂŒssen Sie ein grundlegendes Konzept verstehen: Docker-Container sind kurzlebig. Was bedeutet das?

Stellen Sie sich vor, Sie haben einen Container mit einer Datenbank. Sie fĂŒgen Daten ein, alles funktioniert perfekt. Dann stoppen Sie den Container, starten ihn neu und… die Daten sind verschwunden. Puff, verflĂŒchtigt.

Das passiert, weil jeder Container sein eigenes isoliertes Dateisystem hat, das mit dem Container selbst lebt und stirbt. Es ist wie Schreiben im Sand: Sobald die Welle kommt, verschwindet alles.

Was ist ein Docker Volume?

Ein Docker Volume ist ein Mechanismus zum Speichern von Daten außerhalb des Containers, sodass sie auch dann bestehen bleiben, wenn der Container gestoppt, neu gestartet oder gelöscht wird.

Denken Sie an Volumes wie an eine externe Festplatte, die Sie an Ihren Container anschließen. Die Daten werden auf diese “externe Festplatte” geschrieben und bleiben sicher, unabhĂ€ngig davon, was mit dem Container passiert.

Warum Volumes Verwenden?

  • Persistenz: Die Daten ĂŒberleben den Lebenszyklus des Containers
  • Teilen: Mehrere Container können auf dieselben Daten zugreifen
  • Backup: Es ist einfacher, Datensicherungen zu erstellen
  • Leistung: Volumes sind fĂŒr I/O-Operationen optimiert
  • PortabilitĂ€t: Sie können Daten zwischen verschiedenen Hosts verschieben

Die Drei Arten der Datenverwaltung in Docker

Docker bietet drei AnsÀtze zur Datenverwaltung. Sehen wir sie uns von der empfohlensten zur am wenigsten empfohlenen an.

1. Volumes - Die Empfohlene Wahl

Volumes werden vollstÀndig von Docker verwaltet und in einem speziellen Verzeichnis auf dem Host gespeichert (/var/lib/docker/volumes/ unter Linux).

1
2
3
4
5
# Ein Volume erstellen
docker volume create mein-volume

# Das Volume in einem Container verwenden
docker run -v mein-volume:/app/data mein-image

Vorteile:

  • Von Docker verwaltet (einfach zu erstellen, löschen, inspizieren)
  • Funktionieren unter Linux, Windows und Mac
  • Können zwischen mehreren Containern geteilt werden
  • UnterstĂŒtzen Treiber fĂŒr Remote-Speicher (Cloud, NFS usw.)

2. Bind Mounts - Direkte Verbindung

Bind Mounts verbinden einen bestimmten Ordner auf Ihrem Computer direkt mit dem Container.

1
2
# Einen lokalen Ordner mit dem Container verbinden
docker run -v /pfad/auf/ihrem/pc:/app/data mein-image

Wann sie verwendet werden sollten:

  • WĂ€hrend der Entwicklung, um CodeĂ€nderungen in Echtzeit zu sehen
  • Wenn Sie auf bestimmte Dateien des Host-Systems zugreifen mĂŒssen
  • Um Konfigurationen zwischen Host und Container zu teilen

Achtung: Bind Mounts hÀngen von der Dateisystemstruktur des Hosts ab und sind daher weniger portabel.

3. tmpfs Mounts - TemporÀre Daten im Speicher

tmpfs Mounts speichern Daten im RAM des Hosts, nicht auf der Festplatte.

1
docker run --tmpfs /app/temp mein-image

Wann sie verwendet werden sollten:

  • FĂŒr sensible Daten, die nicht auf die Festplatte geschrieben werden sollen
  • FĂŒr temporĂ€re Hochleistungs-Caches
  • Die Daten gehen verloren, wenn der Container stoppt (und genau das wollen Sie)

Wesentliche Befehle fĂŒr Volumes

Ein Volume Erstellen

1
docker volume create volume-name

Volumes Auflisten

1
docker volume ls

Ein Volume Inspizieren

1
docker volume inspect volume-name

Dieser Befehl zeigt, wo das Volume physisch gespeichert ist, und andere nĂŒtzliche Informationen.

Ein Volume Löschen

1
2
3
4
5
# Ein bestimmtes Volume löschen
docker volume rm volume-name

# Alle nicht verwendeten Volumes löschen
docker volume prune

Achtung: Das Löschen eines Volumes bedeutet den Verlust aller enthaltenen Daten. Es gibt keinen Papierkorb oder Wiederherstellung.

Praktische Beispiele

Beispiel 1: MySQL-Datenbank mit Persistenten Daten

Ohne Volume verlieren Sie bei jedem Neustart des MySQL-Containers alle Daten. So lösen Sie das Problem:

1
2
3
4
5
6
7
8
9
# Ein Volume fĂŒr MySQL-Daten erstellen
docker volume create mysql-data

# MySQL mit dem Volume starten
docker run -d \
  --name mein-mysql \
  -e MYSQL_ROOT_PASSWORD=password123 \
  -v mysql-data:/var/lib/mysql \
  mysql:8

Jetzt können Sie den Container stoppen, neu starten oder sogar löschen und neu erstellen: Die Datenbankdaten bleiben im Volume mysql-data intakt.

Beispiel 2: Webentwicklung mit Bind Mount

WÀhrend der Entwicklung möchten Sie, dass CodeÀnderungen sofort im Container sichtbar sind:

1
2
3
4
5
docker run -d \
  --name meine-seite \
  -p 8080:80 \
  -v $(pwd)/src:/var/www/html \
  php:apache

Jede Änderung an Dateien im Ordner src ist sofort im Container verfĂŒgbar.

Beispiel 3: Daten Zwischen Containern Teilen

Zwei Container, die auf dieselben Dateien zugreifen mĂŒssen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Das geteilte Volume erstellen
docker volume create geteilte-daten

# Container, der schreibt
docker run -d --name schreiber -v geteilte-daten:/data alpine \
  sh -c "while true; do date >> /data/log.txt; sleep 5; done"

# Container, der liest
docker run -it --name leser -v geteilte-daten:/data alpine \
  tail -f /data/log.txt

Volumes in Docker Compose

Wenn Sie Docker Compose verwenden, ist das Definieren von Volumes noch einfacher:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
version: '3.8'

services:
  database:
    image: postgres:15
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: secret

  app:
    image: meine-app
    volumes:
      - ./code:/app           # Bind Mount fĂŒr Entwicklung
      - logs:/app/logs        # Volume fĂŒr Logs

volumes:
  postgres-data:    # Von Docker verwaltetes Volume
  logs:             # Von Docker verwaltetes Volume

Mit einem einfachen docker-compose up erstellt Docker automatisch die benötigten Volumes.

Backup und Wiederherstellung von Volumes

Ein Volume Sichern

1
2
3
4
docker run --rm \
  -v volume-name:/source:ro \
  -v $(pwd):/backup \
  alpine tar czf /backup/backup.tar.gz -C /source .

Dieser Befehl:

  1. Mountet das Volume im Nur-Lese-Modus (ro)
  2. Erstellt ein komprimiertes Archiv im aktuellen Verzeichnis

Ein Backup Wiederherstellen

1
2
3
4
docker run --rm \
  -v volume-name:/target \
  -v $(pwd):/backup \
  alpine tar xzf /backup/backup.tar.gz -C /target

HĂ€ufige Fehler, die Vermieden Werden Sollten

1. Vergessen, Volumes fĂŒr Datenbanken zu Verwenden

Wenn Sie eine Datenbank in Docker ohne Volume verwenden, verlieren Sie alle Daten. Immer.

2. Bind Mounts in der Produktion Verwenden

Bind Mounts sind großartig fĂŒr die Entwicklung, aber in der Produktion sollten Sie Docker Volumes fĂŒr bessere PortabilitĂ€t und Sicherheit verwenden.

3. Keine Backups der Volumes Erstellen

Volumes werden nicht automatisch in Systembackups einbezogen. Planen Sie regelmĂ€ĂŸige Backups.

4. Verwaiste Volumes Ansammeln

Wenn Sie Container löschen, bleiben die Volumes bestehen. Verwenden Sie regelmĂ€ĂŸig:

1
docker volume prune

Um Volumes zu löschen, die nicht mehr mit Containern verbunden sind.

Wann Was Verwendet Werden Sollte: Zusammenfassung

SzenarioLösung
Datenbank in ProduktionDocker Volume
Lokale EntwicklungBind Mount
Sensible temporÀre Datentmpfs
Teilen zwischen ContainernDocker Volume
KonfigurationsdateienBind Mount oder Volume
Anwendungs-LogsDocker Volume

Fazit

Docker Volumes lösen eines der grundlegenden Probleme von Containern: die Datenpersistenz. Ohne Volumes wĂ€ren Container nur fĂŒr zustandslose Anwendungen nĂŒtzlich.

Denken Sie an die goldenen Regeln:

  • Verwenden Sie immer Volumes fĂŒr Datenbanken
  • Verwenden Sie Bind Mounts fĂŒr die lokale Entwicklung
  • Erstellen Sie regelmĂ€ĂŸige Backups wichtiger Volumes
  • RĂ€umen Sie regelmĂ€ĂŸig verwaiste Volumes auf

Sobald das Konzept verstanden ist, werden Volumes so natĂŒrlich wie das Speichern einer Datei auf der Festplatte. Und Ihre Daten sind endlich sicher, unabhĂ€ngig davon, was mit den Containern passiert.