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.