Docker Swarm im Hosting richtig aufsetzen und betreiben

26. Mai 2026

Docker Swarm Tutorial: Container-Platzierung mit Präferenzen. Links: Präferenz 1 (DC), rechts: Präferenz 2 (Rack).

Inhaltsverzeichnis

Eine Webanwendung läuft zunächst problemlos auf einem Server, doch mit wachsendem Traffic werden Ausfälle, Updates und die Verteilung mehrerer Container schnell unübersichtlich. Docker Swarm bündelt mehrere Docker-Hosts zu einem Cluster und übernimmt Aufgaben wie Scheduling, Skalierung, Service-Discovery und Rolling Updates. Ich zeige hier den kompletten Weg von der ersten Initialisierung über das Deployment bis zu Sicherheit, Fehlersuche und den Grenzen im produktiven Hosting.

Docker Swarm in wenigen Sätzen verstanden

  • Manager speichern den Clusterzustand und verteilen Aufgaben.
  • Worker führen Container als sogenannte Tasks aus.
  • Für ein stabiles Produktiv-Cluster sind meist 3 oder 5 Manager sinnvoll.
  • Die Kommunikation zwischen Hosts benötigt die Ports 2377, 7946 und 4789.
  • Mit docker stack deploy lassen sich mehrere Services aus einer Compose-Datei ausrollen.

Docker Swarm Cluster mit Manager und Worker Nodes. Einleitung zu Docker Swarm Tutorial.

Was Docker Swarm im Hosting wirklich übernimmt

Docker Swarm ist der in Docker Engine integrierte Orchestrator. Er macht aus mehreren einzelnen Docker-Installationen ein gemeinsames System, in dem ein gewünschter Zustand beschrieben wird. Läuft ein Service mit drei Replikas, versucht Swarm dauerhaft, genau drei laufende Instanzen bereitzustellen.

Ein Manager verwaltet den Cluster, führt den Raft-Zustand und entscheidet, auf welchem Host ein Container gestartet wird. Ein Worker führt diese Aufgaben aus. Manager können standardmäßig ebenfalls Workloads ausführen, in einem getrennten Produktions-Cluster würde ich sie für eine bessere Ausfallsicherheit jedoch oft mit drain von Anwendungstasks freihalten.

Der praktische Vorteil liegt weniger darin, dass Swarm Container starten kann. Das kann Docker Compose ebenfalls. Die Stärke zeigt sich bei automatischer Verteilung, Skalierung und Wiederherstellung. Fällt ein Worker aus, plant der Manager die betroffenen Tasks auf verfügbaren Knoten neu ein.

Komponente Aufgabe Typischer Einsatz
Manager Clusterzustand, Scheduling und Verwaltung 3 oder 5 Hosts für Hochverfügbarkeit
Worker Ausführung der Container-Tasks Beliebig viele Hosts je nach Last
Service Definition eines gewünschten Container-Zustands Webserver, API, Worker-Prozess
Stack Mehrere abhängige Services als Anwendung Webserver, API und Cache gemeinsam

Swarm passt besonders gut zu **kleinen und mittleren Plattformen**, die Docker-native Deployments, eine überschaubare Betriebsumgebung und schnelle Rollouts benötigen. Kubernetes bietet ein deutlich größeres Ökosystem, bringt aber auch mehr Komplexität mit. Für zwei bis zehn gut kontrollierte Server ist Swarm aus meiner Sicht oft angenehm pragmatisch.

Welche Voraussetzungen das Cluster braucht

Für einen lokalen Test reicht ein einzelner Linux-Host. Ein echtes Mehrknoten-Setup benötigt mindestens einen Manager und einen Worker, besser aber drei Manager für Quorum und mehrere Worker für die Anwendung. Alle Hosts sollten eine feste, intern erreichbare IP-Adresse besitzen und eine kompatible Docker-Engine-Version verwenden.

Für ein Labor reichen je Host beispielsweise 1 bis 2 vCPU und 2 GB RAM, sofern nur Nginx und kleine Testservices laufen. Im produktiven Betrieb bestimmt nicht Swarm die Größe, sondern die Anwendung. Datenbank, Build-Prozesse, Logging und Spitzenlast müssen separat kalkuliert werden.

Firewall und Netzwerk vorbereiten

Zwischen den Docker-Hosts müssen bestimmte Ports erreichbar sein. Ich öffne sie ausschließlich im privaten Cluster-Netz und niemals pauschal für das gesamte Internet.

Port Protokoll Funktion
2377 TCP Swarm-Management und Beitritt von Nodes
7946 TCP und UDP Node-Discovery und Kommunikation zwischen Nodes
4789 UDP Overlay-Netzwerk und VXLAN-Datenverkehr
80 und 443 TCP Öffentliche Webanwendungen, falls benötigt

Port 4789 sollte niemals offen am Perimeter eines Servers hängen. Bei untrusted Netzwerken kann ein verschlüsseltes Overlay-Netzwerk mit --opt encrypted sinnvoll sein, wobei zusätzlicher Netzwerk-Overhead entsteht. Die Management-Kommunikation ist standardmäßig durch gegenseitige TLS-Authentifizierung geschützt, die Anwendungsebene muss trotzdem separat abgesichert werden.

Ein Swarm-Cluster Schritt für Schritt aufsetzen

Den ersten Manager initialisieren

Auf dem ersten Host starte ich den Cluster mit einer privaten oder intern gerouteten Adresse. Die Option --advertise-addr ist wichtig, weil andere Nodes genau diese Adresse verwenden.

docker swarm init --advertise-addr 10.0.0.10

Die Ausgabe enthält einen Worker-Token und den passenden Join-Befehl. Tokens gehören wie Passwörter behandelt und sollten nicht in Tickets, öffentliche Repositories oder Chatverläufe kopiert werden. Bei Bedarf kann ich sie später erneut anzeigen lassen.

docker swarm join-token worker
docker swarm join-token manager

Worker und weitere Manager hinzufügen

Auf jedem Worker führe ich den ausgegebenen Befehl aus. Die Adresse muss auf den Manager zeigen, nicht auf eine öffentliche Reverse-Proxy-Adresse.

docker swarm join \
  --token SWMTKN-REPLACE_ME \
  10.0.0.10:2377

Weitere Manager treten mit dem Manager-Token bei. Für Hochverfügbarkeit bevorzuge ich 3 Manager. Damit darf einer ausfallen, ohne dass die Mehrheit des Raft-Clusters verloren geht. Fünf Manager können zwei Ausfälle verkraften, verursachen aber mehr Verwaltungsaufwand.

docker swarm join \
  --token SWMTKN-MANAGER-REPLACE_ME \
  10.0.0.10:2377

Den Zustand prüfe ich immer vom Manager aus.

docker node ls
docker info

Ein häufiger Fehler besteht darin, eine öffentliche Cloud-IP als Advertise-Adresse zu verwenden, obwohl die Hosts über ein privates Netzwerk kommunizieren sollen. Das führt später zu schwer verständlichen Join- oder Overlay-Problemen. Ich prüfe deshalb zuerst Routing, DNS und Firewall und erst danach Docker.

Services testen, skalieren und aktualisieren

Ein Service beschreibt ein gewünschtes Ergebnis. Der folgende Befehl startet drei Nginx-Replikas und veröffentlicht Port 8080 auf dem Swarm.

docker service create \
  --name web \
  --publish published=8080,target=80 \
  --replicas 3 \
  nginx:alpine

Swarm verteilt die Tasks nach seinen Scheduling-Regeln. Durch die Routing Mesh kann eine Anfrage an einem beliebigen Node-Port an einen passenden Task weitergeleitet werden, selbst wenn dort nicht direkt die betreffende Replika läuft.

docker service ls
docker service ps web
docker service inspect web
docker service logs -f web

Die Anzahl der Replikas lässt sich ohne Container-Handarbeit ändern.

docker service scale web=5

Für ein Update verwende ich möglichst eine unveränderliche Image-Version oder einen Digest. Ein bewegliches Tag wie latest macht Rollbacks und Fehleranalysen unnötig schwierig.

docker service update \
  --image nginx:1.27-alpine \
  --update-parallelism 1 \
  --update-delay 10s \
  web

Wenn das neue Image Probleme verursacht, kann der Service zurückgerollt werden.

docker service rollback web

Ich setze bei kritischen Services zusätzlich Update- und Rollback-Parameter in der Stack-Datei. Ein kontrolliertes Update mit einer Replika nach der anderen ist meistens sicherer als ein gleichzeitiger Austausch aller Container.

Eine Anwendung als Stack deployen

Für mehrere Services ist eine Compose-Datei übersichtlicher als eine lange Folge von CLI-Befehlen. Dabei gibt es eine wichtige Einschränkung. docker stack deploy arbeitet mit dem älteren Compose-Dateiformat für Swarm und unterstützt nicht automatisch alle Funktionen der aktuellen Compose-Spezifikation.

Außerdem baut der Manager keine Images aus einem lokalen Dockerfile. Die Images müssen bereits in einer Registry liegen und von allen Nodes erreichbar sein. Genau dieser Punkt wird bei ersten Deployments besonders häufig übersehen.

version: "3.9"

services:
  web:
    image: nginx:1.27-alpine
    ports:
      - target: 80
        published: 8080
        protocol: tcp
        mode: ingress
    networks:
      - frontend
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 10s
        order: start-first
      rollback_config:
        parallelism: 1
      restart_policy:
        condition: on-failure
      placement:
        max_replicas_per_node: 1

  redis:
    image: redis:7-alpine
    networks:
      - backend
    deploy:
      replicas: 1

networks:
  frontend:
    driver: overlay
  backend:
    driver: overlay

Den Stack spiele ich vom Manager aus ein.

docker stack deploy -c stack.yml demo
docker stack services demo
docker stack ps demo

Ein Stack erzeugt eigene Service- und Netzwerknamen. Der Webservice heißt in diesem Beispiel demo_web. Für eine private Registry kann --with-registry-auth erforderlich sein, damit die Nodes die Zugangsdaten für das Image erhalten.

docker stack deploy \
  --with-registry-auth \
  -c stack.yml \
  demo

Für die Platzierung kann ich Nodes labeln. So landet beispielsweise ein Service nur auf Hosts mit SSD-Speicher oder in einer bestimmten Availability Zone.

docker node update --label-add zone=de1 worker1

In der Compose-Datei würde die passende Einschränkung so aussehen.

placement:
  constraints:
    - node.labels.zone == de1

Netzwerke und Replikas verteilen sich automatisch, aber persistente Daten werden nicht magisch repliziert. Eine lokale Volume-Datei liegt weiterhin auf einem bestimmten Host. Für Datenbanken brauche ich deshalb externen Storage, Replikation auf Anwendungsebene oder eine bewusste Node-Bindung.

Sicherheit, Secrets und Fehlersuche im Betrieb

Passwörter nicht in Compose-Dateien speichern

Swarm Secrets sind für Kennwörter, API-Schlüssel und Zertifikate gedacht. Ich lege sensible Werte nicht als Klartext in eine Stack-Datei und nicht in gewöhnliche Environment-Variablen, wenn sich das vermeiden lässt.

printf 'change-this-password' | docker secret create db_password -

Ein Service erhält nur die Secrets, die er tatsächlich benötigt. Docker stellt sie im Container als Datei unter /run/secrets/ bereit. Zusätzlich können Configs für nicht geheime Konfigurationsdateien verwendet werden.

Lesen Sie auch: Social Intranet planen - Funktionen, Hosting und DevOps

Die wichtigsten Diagnosebefehle

Wenn ein Deployment nicht stabil wird, beginne ich mit dem Clusterzustand und arbeite mich zum einzelnen Task vor. Das ist schneller, als sofort die gesamte Compose-Datei umzuschreiben.

docker node ls
docker service ls
docker service ps --no-trunc demo_web
docker service logs demo_web
docker inspect $(docker ps -q)
  • Pending deutet häufig auf fehlende Ressourcen oder eine nicht erfüllte Placement-Constraint hin.
  • Rejected weist oft auf ein nicht verfügbares Image, falsche Mounts oder ungültige Service-Optionen hin.
  • Fehlt ein Service auf einem Worker, prüfe ich zuerst den Node-Status und danach die Ports für Overlay-Traffic.
  • Funktioniert ein Container lokal, aber nicht im Stack, liegt die Ursache oft an fehlenden Registry-Zugängen oder nicht unterstützten Compose-Optionen.

Die Docker-Dokumentation bestätigt, dass Overlay-Netzwerke, Service-Discovery und Rolling Updates zentrale Bestandteile des Swarm-Modus sind. Für den Anfang reicht eine einfache Topologie, für den produktiven Betrieb kommen Backups des Manager-Zustands, Monitoring, Log-Rotation und ein getesteter Wiederanlauf hinzu.

Den Raft-Zustand sichere ich regelmäßig und schütze besonders die Manager. Ein Backup allein ist jedoch kein Notfallplan. Ich teste auch, ob Images, Secrets, Volumes und DNS nach einem Ausfall tatsächlich wieder verfügbar sind.

Wann Swarm die richtige Entscheidung bleibt

Docker Swarm ist eine gute Wahl, wenn ein Team wenige Betriebsbausteine, schnelle Deployments und eine geringe Lernkurve bevorzugt. Für einfache Webanwendungen, interne APIs und klassische Hosting-Setups liefert es viel Nutzen mit vergleichbar wenig Konfiguration.

Ich würde Swarm nicht als Ersatz für jedes Kubernetes-Cluster verkaufen. Sehr große Plattformen, komplexe Operator-Ökosysteme, serviceübergreifende Policies oder stark standardisierte Cloud-Native-Prozesse sprechen eher für Kubernetes. Auch bei zustandsbehafteten Anwendungen bleibt die Storage-Frage unabhängig vom Orchestrator anspruchsvoll.

Mein sinnvoller Startpunkt für 2026 ist ein kleines Testcluster mit einem Manager und zwei Workern. Danach kommen private Netzwerke, eine Registry, feste Image-Versionen, Secrets und ein bewusst getestetes Rollback. Erst wenn diese Grundlagen funktionieren, lohnt es sich, Replikas und zusätzliche Nodes zu erhöhen.

Wer diese Reihenfolge einhält, erhält kein undurchsichtiges Container-Lab, sondern eine nachvollziehbare Hosting-Plattform. Der eigentliche Gewinn liegt nicht in möglichst vielen Nodes, sondern in einem System, dessen Zustand sich prüfen, aktualisieren und im Fehlerfall zuverlässig wiederherstellen lässt.

Häufig gestellte Fragen

Für das Cluster benötigen Sie Port 2377/TCP für Management und Node-Beitritte, Port 7946/TCP und UDP für Discovery und Node-Kommunikation sowie Port 4789/UDP für Overlay-Netzwerke. Diese Ports sollten ausschließlich im privaten Cluster-Netz erreichbar sein. Port 4789 darf nicht am öffentlichen Perimeter offenstehen.

Für Hochverfügbarkeit sind meist drei Manager sinnvoll, weil dabei ein Manager ausfallen kann, ohne das Quorum zu verlieren. Fünf Manager verkraften zwei Ausfälle, erhöhen aber den Verwaltungsaufwand. Worker führen die Container-Tasks aus und können je nach Last beliebig ergänzt werden.

docker stack deploy verteilt keine lokal per Dockerfile gebauten Images automatisch auf die Nodes. Die benötigten Images müssen in einer für alle Hosts erreichbaren Registry liegen. Bei einer privaten Registry kann --with-registry-auth erforderlich sein, damit die Nodes die Zugangsdaten erhalten.

Swarm repliziert lokale Volume-Dateien nicht automatisch. Eine lokale Volume-Datei bleibt an den Host gebunden, auf dem sie liegt. Für Datenbanken benötigen Sie deshalb externen Storage, Replikation auf Anwendungsebene oder eine bewusst konfigurierte Node-Bindung.

Pending weist häufig auf fehlende Ressourcen oder eine nicht erfüllte Placement-Constraint hin. Rejected deutet oft auf ein nicht verfügbares Image, fehlerhafte Mounts oder ungültige Service-Optionen hin. Mit docker service ps --no-trunc und den Service-Logs lässt sich die konkrete Ursache näher eingrenzen.

Artikel bewerten

Bewertung: 0.00 Stimmenanzahl: 0

Tags:

container docker swarm cluster overlay-netzwerk secrets

Beitrag teilen

Edwin Appel

Edwin Appel

Mein Name ist Edwin Appel und seit 11 Jahren beschäftige ich mich intensiv mit den sich ständig weiterentwickelnden Welten der Webentwicklung, der digitalen Strategie und der künstlichen Intelligenz. Diese Themen sind für mich mehr als nur berufliche Felder; sie sind faszinierende Bereiche, in denen ich gerne komplexe Zusammenhänge aufschlüssele und verständlich mache. Auf metawebart.de teile ich meine Erkenntnisse und Erfahrungen, um Ihnen dabei zu helfen, die digitalen Herausforderungen unserer Zeit besser zu verstehen und zu meistern. Mein Ziel ist es, Ihnen stets fundierte, nachvollziehbare und aktuelle Informationen zu liefern, die Ihnen bei Ihrer eigenen digitalen Reise nützlich sind.

Kommentar schreiben