In der weiten Welt der Technologie, in der Innovation der Treibstoff des Fortschritts ist, hat sich die Containerisierung als Gamechanger etabliert. Mit der Fähigkeit, Anwendungen samt Abhängigkeiten in portable, leichtgewichtige Einheiten zu verpacken, hat sie Softwareentwicklung und Machine Learning grundlegend verändert.
Zwei Schwergewichte dieser Containerisierungs-Revolution, Docker und Kubernetes, sind an die Spitze gerückt und prägen, wie wir Anwendungen bauen und skalieren. Gerade im Machine Learning, wo Komplexität und Skalierbarkeit entscheidend sind, liefert Containerisierung eine unschätzbare Lösung.
In diesem Artikel tauchen wir in die Welt der Containerisierung ein, entdecken die Stärken von Docker und Kubernetes und zeigen, warum sie im Kontext von Machine Learning so wichtig sind – inklusive ihrer zentralen Vorteile.
Was ist ein Container?
Ein Container ist eine standardisierte Softwareeinheit, die Code und alle Abhängigkeiten umfasst und so eine effiziente, zuverlässige Ausführung in unterschiedlichen Umgebungen ermöglicht. Grundlage ist ein leichtgewichtiges, unabhängiges Paket, das sogenannte Container-Image, das alle für die Ausführung einer Anwendung nötigen Komponenten enthält: Code, Laufzeit, Systemtools, Bibliotheken und Konfigurationen.
Container sind von Haus aus isoliert. Jeder Container läuft unabhängig und bringt eigene Software, Bibliotheken und Konfigurationsdateien mit. Über klar definierte Schnittstellen können Container miteinander kommunizieren, während sie vom selben Betriebssystem-Kernel ausgeführt werden. Das optimiert die Ressourcennutzung gegenüber virtuellen Maschinen, denn so lassen sich mehrere isolierte Userspace-Instanzen – die Container – auf einem Host parallel betreiben.

Warum sind Container für moderne Anwendungen wichtig?
Containerisierung ist im Machine Learning besonders wertvoll – aus mehreren Gründen. Hier die wichtigsten Vorteile:
1. Reproduzierbarkeit und Portabilität
Container kapseln den gesamten Software-Stack. So gelingen konsistente Deployments und der unkomplizierte Transfer von ML-Modellen zwischen verschiedenen Umgebungen.
2. Isolation und Abhängigkeitsmanagement
Abhängigkeiten sind innerhalb des Containers isoliert. Das verhindert Konflikte, vereinfacht das Dependency-Management und erleichtert den Umgang mit unterschiedlichen Bibliotheksversionen.
3. Skalierung und Ressourcenmanagement
Orchestrierungsplattformen wie Kubernetes ermöglichen effiziente Ressourcennutzung und die Skalierung von ML-Workloads – für bessere Performance bei geringeren Kosten.
Warum Docker?
Sieh dir das Docker-Cheat Sheet von DataCamp an.
Docker gilt als Pionier der Containerisierung und hat Entwicklung und Bereitstellung von Software nachhaltig verändert. Im Kern bietet Docker eine Plattform, um leichtgewichtige, isolierte Container zu erstellen und zu verwalten, die Anwendungen und deren Abhängigkeiten kapseln.
Das gelingt über Container-Images: in sich geschlossene Pakete, die vom Anwendungscode bis zu Systembibliotheken und Abhängigkeiten alles enthalten, was für den Betrieb nötig ist. Docker-Images lassen sich einfach erstellen, teilen und bereitstellen. So können sich Entwicklerinnen und Entwickler aufs Bauen ihrer Anwendungen konzentrieren – statt auf komplexe Konfigurations- und Deploymentprozesse.
Ein Dockerfile in deinem Projekt anlegen
Unter Containerisierung einer Anwendung versteht man den Prozess, die App inklusive Abhängigkeiten in einen Docker-Container zu verpacken. Der erste Schritt ist ein Dockerfile im Projektverzeichnis. Ein Dockerfile ist eine Textdatei mit Anweisungen zum Bauen eines Docker-Images. Es dient als Blaupause für einen Container mit Anwendungscode, Abhängigkeiten und Konfigurationen. Hier ein Beispiel:
# Use the official Python base image with version 3.9
FROM python:3.9
# Set the working directory within the container
WORKDIR /app
# Copy the requirements file to the container
COPY requirements.txt .
# Install the dependencies
RUN pip install -r requirements.txt
# Copy the application code to the container
COPY . .
# Set the command to run the application
CMD ["python", "app.py"]
Wenn du mehr über gängige Docker-Befehle und Best Practices aus der Praxis lernen willst, lies unseren Blog Docker for Data Science: An Introduction und melde dich für unseren Kurs Introduction to Docker an.
Dieses Dockerfile folgt einer einfachen Struktur: Als Basis dient das offizielle Python-Image in Version 3.9. Das Arbeitsverzeichnis im Container wird auf "/app" gesetzt. Die Datei "requirements.txt" wird in den Container kopiert und über die Anweisung "RUN" werden die nötigen Abhängigkeiten installiert. Anschließend wird der Anwendungscode in den Container kopiert. Zum Schluss legt die Anweisung "CMD" den Befehl fest, der beim Start eines auf diesem Image basierenden Containers ausgeführt wird – in der Regel python app.py.
Ein Docker-Image aus dem Dockerfile bauen
Sobald ein Dockerfile vorliegt, kannst du das Image mit folgendem Terminalbefehl bauen. Dafür muss Docker auf deinem Rechner installiert sein. Folge dieser Anleitung, falls noch nicht geschehen.
docker build -t image-name:tag .
Die Ausführung kann länger dauern. Während des Build-Prozesses werden Logs im Terminal ausgegeben. Der Befehl docker build erzeugt ein Image, das Flag -t vergibt Namen und Tag. Der Name ist die Kennung des Images, der Tag markiert Version oder Label. Der Punkt . steht für das aktuelle Verzeichnis mit dem Dockerfile – Docker nutzt es als Blaupause für den Build.
Ist das Image gebaut, kannst du mit docker images im Terminal prüfen:

Beispiel der Autorin/des Autors
Mach den nächsten Schritt auf deinem Weg zum Docker-Profi mit DataCamps Kurs Introduction to Docker. In diesem umfassenden Kurs lernst du die Grundlagen der Containerisierung, entdeckst die Stärken von Docker und sammelst Praxiserfahrung an realen Beispielen.
Warum Kubernetes?
Während Docker die Containerisierung revolutioniert hat, ist Kubernetes als Orchestrator entstanden, der das Management und die Skalierung containerisierter Anwendungen nahtlos ermöglicht. Kubernetes, häufig K8s genannt, automatisiert Bereitstellung, Skalierung und Verwaltung von Containern über einen Cluster von Knoten hinweg.
Kubernetes stellt dafür einen leistungsfähigen Funktionsumfang zur Orchestrierung bereit. Entwickelnde definieren den Sollzustand ihrer Anwendungen deklarativ über YAML-Manifeste. Kubernetes sorgt dann dafür, dass dieser Zustand eingehalten wird – inklusive Aufgaben wie dem Platzieren von Containern, dem bedarfsgerechten Skalieren und dem Überwachen von Gesundheit und Verfügbarkeit.
Mit Kubernetes lassen sich Anwendungen mühlos skalieren, um mehr Traffic oder Workload zu bewältigen, ohne sich um die zugrunde liegende Infrastruktur zu kümmern. Der deklarative Ansatz für Infrastrukturverwaltung befreit Teams davon, Container-Deployments im Detail zu managen, und schafft Raum, sich auf den Ausbau der Anwendung zu konzentrieren.
Wichtige Kubernetes-Komponenten für Machine Learning: Pods, Services, Deployments
Kubernetes bietet mehrere zentrale Bausteine, die für das effiziente Bereitstellen und Verwalten von ML-Anwendungen entscheidend sind: Pods, Services und Deployments.
1. Pods
Ein Pod ist in Kubernetes die kleinste Deployment-Einheit. Er repräsentiert eine einzelne Instanz eines laufenden Prozesses im Cluster. Im ML-Kontext kapselt ein Pod typischerweise ein containerisiertes ML-Modell oder eine spezifische Komponente des ML-Workflows. Pods können aus einem oder mehreren Containern bestehen, die zusammenarbeiten und sich Netzwerk- und Speicherkapazitäten teilen.

2. Services
Services ermöglichen Kommunikation und Vernetzung zwischen Pods. Ein Service definiert einen stabilen Netzwerkendpunkt, um auf einen oder mehrere Pods zuzugreifen. In ML-Szenarien können Services genutzt werden, um Modelle oder Komponenten als Endpunkte für Dateneingang oder Inferenz bereitzustellen. Sie bieten Lastverteilung und Service Discovery, sodass andere Anwendungen oder Services leicht mit den ML-Komponenten interagieren können.

3. Deployments
Deployments bieten einen deklarativen Ansatz, um Pods zu erstellen und zu skalieren. Ein Deployment stellt sicher, dass stets eine definierte Anzahl an Pod-Replikas läuft. Es unterstützt einfaches Skalieren, Rolling Updates und Rollbacks. Gerade für ML-Workloads mit dynamischem Bedarf oder für unterbrechungsfreie Updates sind Deployments besonders hilfreich.

Eine Kubernetes-Konfigurationsdatei für ein ML-Projekt schreiben
Für das Deployment eines ML-Projekts in Kubernetes wird eine Konfigurationsdatei verwendet, üblicherweise im YAML-Format. Sie legt den gewünschten Sollzustand der Anwendung fest, inklusive Informationen zu Pods, Services, Deployments und weiteren Kubernetes-Ressourcen.
Die Datei beschreibt Container, Umgebungsvariablen, Ressourcenanforderungen und Netzwerkeinstellungen, die zum Betrieb der ML-Anwendung benötigt werden. Sie definiert die gewünschte Anzahl an Replikas, Portbindungen, Volume-Mounts und projektspezifische Konfigurationen.
Beispiel für eine YAML-Konfigurationsdatei zur Kubernetes-Einrichtung
apiVersion: v1
kind: Pod
metadata:
name: ml-model-pod
spec:
containers:
- name: ml-model-container
image: your-image-name:tag
ports:
- containerPort: 8080
env:
- name: ENV_VAR_1
value: value1
- name: ENV_VAR_2
value: value2
In diesem Beispiel werden verschiedene Elemente genutzt, um einen Pod in Kubernetes zu konfigurieren: die verwendete Kubernetes-API-Version, der Ressourcentyp Pod, Metadaten wie der Name des Pods sowie die Spezifikation des Pods im Abschnitt spec.
Kubernetes für Machine Learning
Ist die Kubernetes-Konfigurationsdatei erstellt, ist das Deployment eines ML-Modells unkompliziert. Mit dem Kommandozeilentool kubectl wendest du die Datei auf den Cluster an und erstellst so die definierten Pods, Services und Deployments.
Kubernetes stellt sicher, dass der Sollzustand erreicht wird, und erstellt und verwaltet die nötigen Ressourcen automatisch. Dazu gehören das Scheduling der Pods auf geeignete Nodes, das Netzwerkmanagement und die Lastverteilung für Services.
Kubernetes ist besonders stark bei Skalierung und Management von ML-Workloads. Über horizontale Skalierung lassen sich bei steigender Nachfrage oder für parallele ML-Berechnungen schnell zusätzliche Pod-Replikas erzeugen. Kubernetes verteilt die Last automatisiert über die Pods und sorgt für effiziente Ressourcennutzung.

Fazit
Containerisierung mit Docker und Kubernetes hat das Feld des Machine Learning mit zahlreichen Vorteilen und Möglichkeiten verändert. Docker bietet eine Plattform, um leichtgewichtige, isolierte Container zu erstellen und zu verwalten, die Anwendungen und Abhängigkeiten kapseln. Das vereinfacht Deployments, sodass sich Teams auf das Bauen ihrer Anwendungen konzentrieren können – statt auf komplexe Konfigurationen.
Kubernetes wiederum ist der Orchestrator, der Bereitstellung, Skalierung und Verwaltung containerisierter Anwendungen automatisiert. Es hält den Sollzustand der Anwendung aufrecht, übernimmt Aufgaben wie das Scheduling von Containern, die bedarfsgerechte Skalierung sowie das Management von Gesundheit und Verfügbarkeit. So werden Ressourcen effizient genutzt und ML-Workloads nahtlos skaliert – mit einem deklarativen Ansatz für Infrastrukturmanagement.
Gemeinsam bieten Docker und Kubernetes eine starke Lösung für das Management von ML-Anwendungen. Docker sorgt für Reproduzierbarkeit, Portabilität und einfaches Dependency-Management, während Kubernetes effiziente Skalierung, Ressourcenverwaltung und Orchestrierung ermöglicht. Zusammen helfen sie Organisationen, das volle Potenzial von Machine Learning skalierbar und zuverlässig auszuschöpfen.
Bereit, in die Welt von MLOps einzutauchen und deine ML-Workflows neu aufzustellen? Sieh dir unseren Guide Getting Started with MLOps und das Tutorial zu Machine Learning, Pipelines, Deployment und MLOps an, um deine MLOps-Kompetenzen aufs nächste Level zu bringen. Du kannst dich außerdem für eine Docker-Zertifizierung qualifizieren, um deine Docker-Skills zu belegen.
