Docker Tutorial & Architekturwissen: Stateful vs. Stateless Services

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:

  1. Ein einfaches Docker-Tutorial zum Einstieg
  2. Eine verständliche und fundierte Erklärung von stateful vs. stateless Services
  3. 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 CaseStatelessStateful
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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert