Die Reise in die Welt der Container beginnt oft mit einem einfachen „Hello World“, aber ziemlich schnell stößt man auf die fundamentalen Fragen der Softwarearchitektur: Was ist eigentlich „stateful“? Was bedeutet „stateless“? Und was hat Docker damit zu tun? In diesem Blogpost bekommst du:
- Ein einfaches Docker-Tutorial zum Einstieg
- Eine verständliche und fundierte Erklärung von stateful vs. stateless Services
- Praktische Anwendungsfälle, Architekturtipps & Docker Best Practices
Teil 1: 🐳 Docker Tutorial – Schnellstart für Einsteiger
Docker ist die Plattform schlechthin für moderne Anwendungsentwicklung. Es erlaubt dir, Anwendungen samt ihrer Abhängigkeiten in leichtgewichtigen Containern zu verpacken.
🔧 Voraussetzungen:
- Docker installiert (z. B. Docker Desktop)
- Ein Terminal
- Basiskenntnisse in einer Programmiersprache (hier: Python)
📁 Projektstruktur
Wir bauen eine einfache Flask-Webanwendung:
mkdir docker-stateless-demo
cd docker-stateless-demo
touch app.py requirements.txt Dockerfile
app.py
:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Dies ist ein STATELess-Service! 🎉"
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000)
requirements.txt
:
flask==2.3.0
Dockerfile
:
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
🚀 App bauen & starten
docker build -t stateless-app .
docker run -p 5000:5000 stateless-app
Und voilà! Dein stateless Webservice läuft jetzt unter http://localhost:5000.
Teil 2: 🔍 Stateful vs. Stateless – Was ist der Unterschied?
📦 Was bedeutet „stateless“?
Ein stateless Service speichert keinen Zustand über einzelne Anfragen hinweg. Jede Anfrage wird unabhängig behandelt.
🔁 Beispiel:
- Du sendest einen GET-Request an einen stateless Webserver.
- Der Server verarbeitet ihn ohne Wissen über vorherige Anfragen.
- Wenn du neu verbindest, ist das für den Server wie die erste Anfrage überhaupt.
✅ Vorteile:
- Skalierbarkeit: Requests können von beliebigen Instanzen verarbeitet werden.
- Ausfallsicherheit: Kein Datenverlust, da kein Zustand gespeichert ist.
- Einfach zu deployen (ideal für Docker/Kubernetes).
🗃️ Was bedeutet „stateful“?
Ein stateful Service speichert einen Zustand zwischen den Anfragen.
🧠 Beispiel:
- Eine Datenbank (z. B. PostgreSQL) speichert persistent Daten.
- Eine Session-basierte Anwendung merkt sich, ob du eingeloggt bist.
- Ein Redis-Cache speichert Zustände für andere Services.
🔥 Herausforderungen:
- Skalierung ist komplexer (Datenreplikation, Sharding, Konsistenz).
- Backups, Datenverluste & Recovery werden zum Thema.
- Deployments müssen vorsichtiger geplant werden.
Teil 3: 🧱 Docker & State – Wie geht man damit um?
⚠️ Grundsatz: Container sind flüchtig
Wenn ein Docker-Container neu gestartet wird, sind alle Daten weg, die nicht explizit gespeichert wurden.
✅ Lösung: Volumes
Mit Volumes kannst du persistente Daten außerhalb des Containers speichern:
docker run -v $(pwd)/data:/data my-database
Oder in docker-compose.yml
:
services:
db:
image: postgres
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Teil 4: 💡 Praxis: Wann setze ich was ein?
Use Case | Stateless | Stateful |
---|---|---|
Web-Frontend | ✅ | ❌ |
Auth-API mit JWT | ✅ | ❌ |
Redis als Cache | ❌ | ✅ |
PostgreSQL | ❌ | ✅ |
Hintergrundprozesse ohne Daten | ✅ | ❌ |
Session-Management mit Cookies | ❌ (wenn serverseitig) | ✅ |
Teil 5: ⚙️ Kubernetes & Microservices
In Kubernetes und Microservice-Architekturen ist das Trennen von Stateless und Stateful besonders wichtig.
- Stateless Services skalieren horizontal →
replicas: 5
- Stateful Services benötigen
StatefulSets
, Persistent Volumes, Replikation
💬 Tipp: Wenn möglich, entkopple deinen Zustand vom Code. Nutze externe Systeme für State (z. B. Datenbanken, Objekt-Storage, Queues).
Fazit: 🧭 Der richtige Umgang mit Zustand
Stateless zu entwickeln ist einfacher, skalierbarer und im Cloud-/Container-Zeitalter fast schon Standard. Aber in der Realität kommst du um stateful Komponenten nicht herum – Daten müssen irgendwo leben.
Die Kunst liegt darin, zu wissen:
- Wann du Zustand brauchst,
- Wo er hingehört, und
- Wie du ihn sicher, konsistent und skalierbar verwaltest.
Docker zwingt dich dazu, über diese Fragen nachzudenken – und genau das macht es zu einem so wertvollen Werkzeug für moderne Softwareentwicklung.