Compose in Systemd: Stacks als Services robust betreiben

Docker Compose ist ein bewährtes Tool für die Orchestrierung von Multi-Container-Anwendungen auf Entwicklungs- und Testumgebungen. In Produktionssystemen kann es jedoch sinnvoll sein, Compose-Stacks direkt als Systemd-Services zu betreiben. Dadurch wird die Verwaltung, das Monitoring und das automatische Restart-Verhalten von Containern konsistent mit dem Host-System gehandhabt. Systemd übernimmt Start, Stop, Logging und Abhängigkeiten, wodurch Compose-Stacks stabiler und robuster laufen.

1. Vorteile von Compose unter Systemd

Die Integration von Docker Compose in Systemd bringt mehrere Vorteile für den Betrieb auf Linux-Servern:

  • Automatischer Start: Stacks werden beim Booten des Hosts gestartet.
  • Health Monitoring: Systemd überprüft laufende Services und kann fehlerhafte Stacks neu starten.
  • Logging Konsistenz: Logs werden zentral über journald gesammelt.
  • Abhängigkeiten: Startreihenfolgen können definiert werden (z. B. Datenbank zuerst).

2. Grundprinzip: Compose als Service

Jeder Compose-Stack kann als ein einzelner Systemd-Service behandelt werden. Dabei wird ein Unit-File erstellt, das die üblichen Docker-Compose-Befehle ausführt. Typischerweise werden die Compose-Dateien in einem dedizierten Verzeichnis abgelegt, z. B. /opt/stacks/myapp/.

Beispielstruktur

/opt/stacks/myapp/
├── docker-compose.yml
├── docker-compose.override.yml
└── systemd/
    └── myapp.service

3. Systemd Unit-File erstellen

Ein typisches Systemd-Unit-File für einen Compose-Stack könnte folgendermaßen aussehen:

[Unit]
Description=MyApp Compose Stack
Requires=docker.service
After=docker.service

[Service]
WorkingDirectory=/opt/stacks/myapp
ExecStart=/usr/local/bin/docker-compose up
ExecStop=/usr/local/bin/docker-compose down
Restart=always
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

Erklärung der wichtigsten Direktiven

  • WorkingDirectory: Verzeichnis mit den Compose-Dateien
  • ExecStart / ExecStop: Befehle zum Starten und Stoppen des Stacks
  • Restart: Verhalten bei Abstürzen, hier immer neu starten
  • Requires / After: Abhängigkeiten zu Docker selbst
  • WantedBy: Ziel für den automatischen Start beim Booten

4. Stabile Start- und Stop-Sequenzen

Systemd ermöglicht die Definition von Abhängigkeiten zwischen Stacks, sodass z. B. eine Datenbank zuerst startet und Webservices danach. Dies vermeidet Startfehler bei abhängigen Containern.

Beispiel für Abhängigkeiten

[Unit]
Description=WebApp Stack
Requires=mydb.service
After=mydb.service docker.service

So wird sichergestellt, dass mydb.service vor der WebApp bereitsteht.

5. Logging und Monitoring

Logs von Compose-Stacks laufen automatisch über journald, wenn Systemd verwendet wird. Dies vereinfacht Debugging und Monitoring erheblich.

Logs anzeigen

# Aktuelle Logs eines Compose-Stacks
journalctl -u myapp.service -f

Healthchecks

In Kombination mit Restart=on-failure oder Restart=always kann Systemd fehlgeschlagene Stacks automatisch neu starten. Compose-Healthchecks in der docker-compose.yml können hierbei die Service-Stabilität unterstützen.

6. Update-Strategien

Updates des Compose-Stacks können kontrolliert durchgeführt werden, indem das Service zuerst gestoppt, aktualisiert und wieder gestartet wird.

Update per Systemd

# Stoppen des Services
sudo systemctl stop myapp.service

Pull neuer Images

cd /opt/stacks/myapp
docker-compose pull

Starten des Services

sudo systemctl start myapp.service

Rollback

Bei Problemen kann einfach auf vorherige Images zurückgesetzt werden, da Systemd das Starten spezifischer Compose-Versionen erlaubt.

7. Security und Berechtigungen

Systemd ermöglicht die Einschränkung von Rechten für Compose-Stacks:

  • User/Group: User=dockeruser und Group=dockergroup
  • ReadOnlyDirectories: Einschränkung von Schreibzugriffen
  • PrivateTmp: Isolierung temporärer Verzeichnisse
  • CapabilityBoundingSet: Minimalrechte für Container

8. Vorteile im Vergleich zu klassischen Compose Deployments

  • Automatischer Start und Restart beim Host-Boot
  • Abhängigkeiten sauber definiert
  • Zentrale Log-Ausgabe und einfaches Monitoring
  • Saubere Integration in bestehende Systemd-Umgebung
  • Erhöhte Sicherheit durch User- und Rechteeinschränkungen

9. Best Practices

  • Jeder Compose-Stack sollte ein eigenes Unit-File haben
  • Abhängigkeiten explizit definieren
  • Healthchecks in Compose nutzen und Restart-Policy auf Systemd abstimmen
  • Logs über journald zentral sammeln
  • Updates kontrolliert per Stop → Pull → Start durchführen

10. CLI Kommandos für Systemd Compose Stacks

# Service aktivieren für automatischen Start beim Boot
sudo systemctl enable myapp.service

Service starten

sudo systemctl start myapp.service

Service stoppen

sudo systemctl stop myapp.service

Status prüfen

sudo systemctl status myapp.service

Logs live verfolgen

journalctl -u myapp.service -f

Durch die Nutzung von Systemd als Management-Ebene für Docker Compose Stacks profitieren Teams von stabileren Deployments, konsistentem Logging, automatischem Restart-Verhalten und klar definierten Startsequenzen. Dies vereinfacht den produktiven Betrieb von Container-Anwendungen erheblich und reduziert die Komplexität im Vergleich zu rein Compose-gesteuerten Deployments.

Konfiguriere Cisco Router & Switches und liefere ein Packet-Tracer-Lab/GNS3

Ich biete professionelle Unterstützung im Bereich Netzwerkkonfiguration und Network Automation für private Anforderungen, Studienprojekte, Lernlabore, kleine Unternehmen sowie technische Projekte. Ich unterstütze Sie bei der Konfiguration von Routern und Switches, der Erstellung praxisnaher Topologien in Cisco Packet Tracer, dem Aufbau und Troubleshooting von GNS3- und EVE-NG-Labs sowie bei der Automatisierung von Netzwerkaufgaben mit Netmiko, Paramiko, NAPALM und Ansible. Kontaktieren Sie mich jetzt – klicken Sie hier.

Meine Leistungen umfassen:

  • Professionelle Konfiguration von Routern und Switches

  • Einrichtung von VLANs, Trunks, Routing, DHCP, NAT, ACLs und weiteren Netzwerkfunktionen

  • Erstellung von Topologien und Simulationen in Cisco Packet Tracer

  • Aufbau, Analyse und Fehlerbehebung von Netzwerk-Labs in GNS3 und EVE-NG

  • Automatisierung von Netzwerkkonfigurationen mit Python, Netmiko, Paramiko, NAPALM und Ansible

  • Erstellung von Skripten für wiederkehrende Netzwerkaufgaben

  • Dokumentation der Konfigurationen und Bereitstellung nachvollziehbarer Lösungswege

  • Konfigurations-Backups, Optimierung bestehender Setups und technisches Troubleshooting

Benötigen Sie Unterstützung bei Ihrem Netzwerkprojekt, Ihrer Simulation oder Ihrer Network-Automation-Lösung? Kontaktieren Sie mich jetzt – klicken Sie hier.

Related Articles