60 Compose-Dateien und Best Practices

Compose-Dateien sind im Kern einfache deklarative Beschreibungen von Diensten. In der Praxis sind sie jedoch weit mehr: Sie sind ein Architekturartefakt, ein Dokument zur Wissensweitergabe und ein operativer Ankerpunkt für wiederholbare Deployments. Eine gut gestaltete Compose-Datei erkennt man daran, dass sie zwei Dinge gleichzeitig schafft: Sie ist verständlich für Menschen und präzise für Maschinen. Mit Podman Compose kommt ein weiterer Anspruch hinzu: Compose-Dateien sollten nicht nur Docker-kompatibel sein, sondern gleichzeitig optimal die Pod-Architektur und die daemonlosen Eigenschaften von Podman nutzen.

60.1 Compose als Architekturmanifest

Eine Compose-Datei beschreibt nicht nur „welche Container sollen laufen?“, sondern:

Das Dokument wird damit zu einem Strukturplan der Anwendung. Es lohnt sich, diese Rolle ernst zu nehmen und nicht als bloße Startkonfiguration zu behandeln.

60.2 Grundstruktur: klare, funktionale Gliederung

Eine übersichtliche Compose-Datei folgt einer klaren Struktur:

  1. Dienste (services)
  2. Abstrakte Ressourcen (volumes, networks)
  3. Optional: Profile (profiles)
  4. Optional: Variablen (env_file, .env)

Die Reihenfolge wirkt trivial, schafft aber Lesbarkeit. In der Praxis empfiehlt sich:

Ein Beispielausschnitt:

services:
  api:
    build: ./api
    networks:
      - internal
    volumes:
      - api_data:/var/lib/api

  proxy:
    image: nginx
    networks:
      - public
      - internal
    ports:
      - "8080:80"

  worker:
    build: ./worker
    networks:
      - internal

volumes:
  api_data:

networks:
  public:
  internal:

Die Struktur kommuniziert bereits die Architektur: ein öffentlich zugänglicher Proxy, interne Services, eigenes Volume für persistente Daten.

60.3 Compose und Pod-Architektur bewusst zusammendenken

Podman Compose erzeugt Pods — und zwar in der Regel einen Pod pro Projekt. Daraus entstehen sinnvolle Patterns, die man aktiv berücksichtigen sollte:

60.3.1 Dienste im selben Pod kommunizieren über localhost

Das bedeutet:

Darum gilt: Interne Ports niemals doppelt belegen.

Wenn zwei Services denselben Port erwarten, ist ein explizites Netzwerk statt eines Pods sinnvoller.

60.3.2 Ports immer am Pod, nicht am Container betrachten

Der Infrastrukturcontainer verwaltet Ports. Die Compose-Datei sollte daher:

Ein häufiger Fehler ist:

serviceA:
  ports:
    - "8080:80"
serviceB:
  ports:
    - "8080:80"

Bei Docker geht das — bei Podman Compose nicht, da beide Services im selben Pod laufen.

60.4 Netzwerke bewusst gestalten

Compose macht es leicht, Netzwerke zu erzeugen — aber zu viele Netzwerke führen zu Unübersichtlichkeit. Best Practices:

Beispiel:

networks:
  internal:
  edge:

Ein Podman-spezifischer Vorteil: Netzwerke werden zu first-class-Objekten, die deterministisch verwaltet werden. Dadurch lohnt es sich, sie bewusst zu modellieren.

60.5 Volumes strukturiert definieren

Persistenz ist eines der am meisten unterschätzten Themen in Compose-Dateien. Gute Best Practices:

60.5.1 Named Volumes bevorzugen

Bind mounts sind bequem, aber riskant. Named Volumes sind:

60.5.2 Volumes per Service eindeutig benennen

Statt:

volumes:
  - data:/data

besser:

volumes:
  - api_data:/var/lib/api

Das wirkt trivial, aber verhindert Chaos nach Monaten oder Jahren.

60.5.3 Nicht benötigte Daten nicht persistieren

Viele Compose-Dateien persistieren irrtümlich:

Best Practice: Volumes nur dort definieren, wo sie wirklich nötig sind.

60.6 Environment-Handling richtig aufsetzen

Compose bietet mehrere Varianten, aber viele Projekte nutzen sie falsch.

60.6.1 Das .env-Pattern

.env wird automatisch geladen und eignet sich für:

60.6.2 env_file für teamübergreifende Konfigurationen

Eine getrennte Datei für komplexe Umgebungsvariablen erleichtert Wartbarkeit und Dokumentation.

60.6.3 Keine Secrets in Compose-Umgebungsvariablen

Passwörter gehören:

Ein Compose-Projekt ist ein Konfigurationsartefakt — kein Secret-Store.

60.7 Healthchecks: robust, aber nicht überschätzen

Compose-Healthchecks sind sinnvoll, aber Podman Compose wertet die Startbedingungen (depends_on.condition) nicht voll aus. Deshalb:

Beispiel:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:5000/health"]
  interval: 10s
  retries: 5

Dies hilft bei Monitoring — nicht beim Start-Workflow.

60.8 Profiles: elegante Steuerung komplexer Stacks

Compose-Profile ermöglichen es, Umgebungen modular zu gestalten:

profiles:
  - metrics

Services können Profile zugewiesen bekommen:

services:
  prometheus:
    image: prom/prometheus
    profiles: ["metrics"]

Dadurch lassen sich:

gezielt aktivieren oder deaktivieren.

60.9 Versionspinning und Buildstrategie

Fehlt Versionspinning, wird jede Umgebung zu einem Glücksspiel.

60.10 Systemd als Ziel: Compose stabil produktionsnah einsetzen

Podman Compose ist kein Orchestrator — aber es lässt sich durch systemd zu einem stabilen Betriebssystemdienst erweitern:

podman generate systemd --new --files

Dadurch entstehen:

Eine Compose-Datei kann damit als deklarative Basis für produktionsnahe Systeme dienen.

60.11 Eine Compose-Datei ist ein Architekturkompromiss — und kein Müllhaufen

Viele Projekte missbrauchen Compose-Dateien als Ablage ungeordneter Optionen. Bessere Compose-Dateien folgen einem Gestaltungsprinzip:

So wird Compose zu einem tragfähigen Fundament — selbst im Podman-Kontext, der die Compose-Logik auf eine neue Ebene hebt.