Zusammenfassung

Dieser Artikel zeigt, wie man Docker-Container mit NFS-Volumes für persistente Datenspeicherung konfiguriert. Wir verwenden Ollama als Beispielanwendung, um zu demonstrieren, wie Modelldaten auf einem Remote-Dateisystem gespeichert werden können. Der Artikel enthält eine schrittweise Anleitung zur Einrichtung, praktische Beispiele und Erklärungen zur Funktionsweise.

Einleitung

In modernen Container-Umgebungen ist die persistente Datenspeicherung ein zentrales Thema. Während Docker-Container standardmäßig nicht persistent sind, können Volumes verwendet werden, um Daten über Container-Neustarts hinweg zu erhalten. In Umgebungen mit mehreren Containern oder mehreren Hosts ist es sinnvoll, externe Speichersysteme wie Network File System (NFS) zu nutzen, um gemeinsamen Zugriff auf Daten zu gewährleisten.

NFS-Volumes in Docker ermöglichen es, Daten aus Containern auf einem zentralen NFS-Server zu speichern, was besonders nützlich ist für:

  • Gemeinsame Datenspeicherung zwischen mehreren Containern
  • Zentrale Backup-Strategien
  • Speicherung großer Modelldaten (wie bei KI-Modellen)
  • Vereinfachte Skalierung von Anwendungen

Hintergrund

Was ist NFS?

Network File System (NFS) ist ein Distributed File System-Protokoll, das es ermöglicht, Dateien über ein Netzwerk wie lokale Dateisysteme zu mounten. In Docker-Umgebungen kann man NFS-Volumes verwenden, um Daten aus Containern auf einem Remote-Dateisystem zu speichern.

Docker NFS Volumes

Docker unterstützt NFS-Volumes in docker-compose.yml Dateien direkt über den volume-Mechanismus. Die Syntax lautet:

volumes:
  my-nfs-volume:
    driver: local
    driver_opts:
      type: nfs
      o: addr=my_nfs_server,rw,nolock,async,vers=4,rsize=131072,wsize=131072
      device: ":/path/on/server"

Dabei wird ein NFS-Share als Volume definiert, das in Containern verwendet werden kann. Die Optionen bedeuten im Einzelnen:

  • my-nfs-volume – Name des Volumes, wie es dann in der docker-compose.yml Datei verwendet werden kann.
  • driver: local – Obgleich es sich bei NFS technisch um ein Netzwerkdateisystem handelt, wird in Docker der „local“ Treiber verwendet, der eben auch NFS versteht.
  • type: nfs – Diese Option definiert den Volume-Typ als Network File System. Ohne diese Angabe würde Docker nicht wissen, dass es sich um ein NFS-Volume handelt.
  • addr=my_nfs_server – Gibt die IP-Adresse des NFS-Servers an, auf dem der Share gehostet wird. Diese Option ist zwingend notwendig, es ist nicht möglich, die Adresse im device anzugeben.
  • rw – Setzt das Mount-Flag auf read-write. Ohne rw wäre der Zugriff nur lesend.
  • nolock – Deaktiviert das Locking-System des NFS. In Container-Umgebungen kann das standardmäßige Locking zu Problemen führen, da es oft nicht korrekt mit dem Container-Isolation-Modell zusammenarbeitet. nolock ist oft notwendig für Docker-Container.
  • async – Aktiviert asynchrone Schreibvorgänge. Dies verbesster die Performance, da Schreiboperationen nicht sofort bestätigt werden müssen. Es kann zu Datenverlust führen, wenn der Server abstürzt, aber verbessert die Antwortzeit signifikant.
  • vers=4 – Spezifiziert die NFS-Version 4. NFSv4 bietet bessere Sicherheit, Performance und Funktionen im Vergleich zu NFSv3. Für moderne Umgebungen ist NFSv4 die empfohlene Version.
  • rsize=131072 – Legt die maximale Lesegröße auf 128 KB fest. Dies beeinflusst die Effizienz beim Lesen von Dateien. Größere Werte können die Performance verbessern, wenn große Dateien gelesen werden.
  • wsize=131072 – Legt die maximale Schreibgröße auf 128 KB fest. Wie bei rsize verbessert dieser Wert die Performance bei großen Schreiboperationen.
  • device: ":/path/on/server" – Diese Option definiert den NFS-Share, der gemountet werden soll. Das : am Anfang ist ein spezifisches Format für Docker NFS-Volumes, das angibt, dass der Share auf dem gleichen Server wie der Docker-Host liegt (oder über einen Standard-Server).

Praktische Umsetzung

Voraussetzungen

  • Docker und Docker Compose installiert
  • Zugriff auf einen NFS-Server
  • Hosts mit NFS-Client-Funktionen (z. B. nfs-common unter Debian/Ubuntu)

Und natürlich wird ein NFS-Server benötigt. Das kann entweder ein Linux-Rechner sein oder ein NAS z.B. von Synology oder QNAP. Wir verwenden die folgenden Annahmen für den NFS-Server

  • Server-Adresse: nfs-server.lan
  • Exportiertes NFS Volume: /volume1/ollama-data

Docker Compose Konfiguration

Die folgende docker-compose.yml Datei wird Ollama in einem Container starten und die Modelle auf einem NFS-Mount auf einem Server verwalten:

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    volumes:
      # Mounte das NFS-Verzeichnis als Volume
      - ollama-data:/root/.ollama
    ports:
      - "11434:11434"
    restart: unless-stopped

volumes:
  ollama-data:
    driver: local
    driver_opts:
      type: nfs
      o: addr=nfs-server.lan,rw,nolock,async,vers=4,rsize=131072,wsize=131072
      device: ":/volume1/ollama-data"

Starte den Container

# Starte den Service
docker-compose up -d

# Überprüfe den Status
docker-compose ps

Fazit

Die Verwendung von NFS-Volumes in Docker bietet eine robuste Lösung für die persistente Datenspeicherung, insbesondere in Umgebungen mit mehreren Containern oder Hosts. Die Kombination mit Ollama zeigt, wie man große Modelldaten zentral speichern und wiederverwenden kann.

Vorteile:

  • Zentrale Datenspeicherung
  • Einfache Backup-Strategien
  • Gemeinsamer Zugriff auf Daten
  • Skalierbarkeit

Referenzen

Kaya Kupferschmidt

Author Kaya Kupferschmidt

Kaya Kupferschmidt ist ein erfahrener freiberuflicher Data Architect, Data Engineer und Data Scientist. Seit 2005 beschäftigt er sich mit Daten und hat einen Doktortitel in Mathematik. Seine Expertise liegt in der Entwicklung und Implementierung robuster Datenlösungen, wobei er sich besonders für Big Data, Machine Learning und KI begeistert. Kaya verfügt über breites technologisches Wissen und setzt dabei bevorzugt auf Open-Source-Technologien.

Mehr Artikel von Kaya Kupferschmidt

Hinterlasse einen Kommentar