Flatcar Container Linux und Docker Swarm (Teil 2)

Weiter geht es mit der Konfiguration unseres Docker Swarms und der Inbetriebnahme der ersten Container. Im ersten Teil haben wir die Basis geschaffen, jetzt lassen wir Cluster-Magie wirken.
Initialisierung von Docker Swarm
Der erste Schritt startet direkt auf dem zukünftigen Manager-Knoten. Mit diesem Befehl initialisierst du den Swarm und legst fest, über welche IP-Adresse die anderen Nodes kommunizieren:
docker swarm init --advertise-addr 172.16.1.1
Als Ausgabe erhältst du einen passenden Docker swarm join-Befehl inklusive Token. Diesen führst du auf den restlichen Nodes aus, um sie dem Cluster hinzuzufügen:
docker swarm join --token SWMTKN-1-2v5kmxazmaxxxxxxxxxxxxxxxxxxxxxxxxvmj2ruvm7lawvocw-6w1j9nup2be0e5bu4dwon0i9k 172.16.1.1:2377
Mittels diesem Befehl können dann die weiteren Knoten als Manager deklariert werden.
docker node promote HOSTNAME
Installation von Portainer im Swarm Betrieb
Um die Verwaltung deines Clusters komfortabel über ein Web-Interface zu steuern, eignet sich Portainer hervorragend. Lade dir dafür zunächst den offiziellen Agent-Stack herunter:
curl -L https://downloads.portainer.io/ce-lts/portainer-agent-stack.yml -o portainer-agent-stack.yml
Passe die Datei anschließend an deine Infrastruktur an. In meinem Setup habe ich den persistenten Speicher auf einen spezifischen Pfad angepasst:
services:
agent:
image: portainer/agent:lts
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
networks:
- agent_network
deploy:
mode: global
placement:
constraints: [node.platform.os == linux]
portainer:
image: portainer/portainer-ce:lts
command: -H tcp://tasks.agent:9001 --tlsskipverify
ports:
- "9443:9443"
volumes:
- /media/DATA/docker/portainer:/data
networks:
- agent_network
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
networks:
agent_network:
driver: overlay
attachable: true
Sobald die Konfiguration steht, rollst du den Stack mit folgendem Befehl im Swarm aus:
docker stack deploy -c portainer-agent-stack.yml portainer
Inbetriebnahme des ersten Containers
Dank der in Teil 1 konfigurierten virtual_ipaddress erreichst du Portainer nun zuverlässig über Port 9443.
Nach dem initialen Setup in der Oberflächen-Ansicht können wir den ersten eigenen Stack produktiv nehmen – in meinem Fall ist das Vaultwarden als passwortsicherer Begleiter:
services:
vaultwarden:
image: vaultwarden/server:latest-alpine
deploy:
mode: replicated
replicas: 1
labels:
- com.centurylinklabs.watchtower.enable=false
restart_policy:
condition: any
volumes:
- /media/DATA/docker/vaultwarden:/data
environment:
- LOG_FILE=/data/vaultwarden.log
- LOG_LEVEL=warn
- EXTENDED_LOGGING=true
- TZ=Europe/Vienna
networks:
- proxy
networks:
proxy:
external: true
Fazit
Die Inbetriebnahme des Docker-Swarm-Clusters hat sich als unkompliziert erwiesen und war mit wenigen Befehlen erledigt. Da die Daten repliziert werden und jeweils nur eine Replika aktiv ist, sollte es bezüglich Datenreplikation und Locks keine Konflikte geben – ich werde das in den nächsten Tagen allerdings weiter beobachten.
Der erste Failover-Test, bei dem ich einen Host vom Netzwerk getrennt habe, verlief erfolgreich: Nach rund einer Minute startete der Container automatisch auf dem Ersatz-Host und hatte dank der laufenden Replizierung direkt Zugriff auf denselben Datenstand.
