Zum Hauptinhalt springen

Docker Swarm

Grundlagen

Grundlegende Schritte

  1. swarm init → Erzeugung eines Swarms
  2. swarm join → Hinzufügen zusätzlicher Knoten (Computer, auf denen Docker läuft)
  3. swarm deploy → Verteilung des Compose-Setups auf Knoten, Swarm erledigt:
    • initiale Verteilung der Container auf Nodes
    • Erzeugung neuer Container, bei Node-Ausfall

Kommunikation

  • wird mit TLS verschlüsselt

Architektur

Docker Swarm Architecture

Nodes

Manager nodes

  • überwachen Cluster-/Swarm-Status
  • koordinieren Services
  • Eintrittspunkte für HTTP
  • sind auch Worker nodes
  • mind. 1 wird benötigt

Worker nodes

  • führen einzelne Container aus

Empfehlung von Docker

  • ungerade Anzahl an Manager-Nodes einsetzen: 1,3, 5, ...
  • ein Swarm mit n Managern verträgt Ausfall von (n - 1 ) / 2 Managern

Ausfall eines Nodes

  • fällt ein Node aus, werden auf den verbleibenden Nodes automatisch neue Container erstellt

So sieht dies aus:

vmadmin@node1:~/helloswarm$ docker stack ps helloswarm

Die Container auf dem ausgefallenen Node werden mit Shutdown angezeigt.

Ausgabe:

```text
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
wonuixht67xm helloswarm_web.1 127.0.0.1:5000/hello-swarm:latest node1 Running Running 5 minutes ago
hd0v9u666nt8 \_ helloswarm_web.1 127.0.0.1:5000/hello-swarm:latest node2 Shutdown Running about an hour ago
4jbzkwvwy38r helloswarm_web.2 127.0.0.1:5000/hello-swarm:latest node3 Running Running about an hour ago
...

Beispiel

Grundlegender Ablauf

Architektur

  • Lastverteilung auf 3 Worker nodes
HostnameIP-AdresseRolle
node1192.168.210.101Manager und Worker
node2192.168.210.102Worker
node3192.168.210.103Worker

Docker Swarm Example

Swarm erstellen

vmadmin@node1:~$ docker swarm init --advertise-addr 192.168.210.101

Ausgabe:

Swarm initialized: current node (irmwh7h8l53y6clm4hp7hm8fz) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-2[...] 192.168.210.101:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Nodes hinzufügen

  1. Befehl von docker swarm init-Ausgabe kopieren
  2. auf node2 und node3 ausführen
vmadmin@node2:~$ docker swarm join --token SWMTKN-1-2[...] 192.168.210.101:2377
This node joined a swarm as a worker.
vmadmin@node3:~$ docker swarm join --token SWMTKN-1-2[...] 192.168.210.101:2377
This node joined a swarm as a worker.

Nun kann auf dem Manager node node1 docker node ls ausgeführt werden, um den Status des Swarms anzuzeigen:

vmadmin@node1:~$ docker node ls

Ausgabe:

ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
irmwh7h8l53y6clm4hp7hm8fz * node1 Ready Active Leader 20.10.20
kwznyyjfn70o0z9b3kuwjhzdn node2 Ready Active 20.10.20
hv5ham7phrijjswzkgyopzj69 node3 Ready Active 20.10.20

Lokale Docker Registry

  • als Container
  • Zweck: damit alle Nodes Zugriff zu selbsterstellten Images haben, um ihre Container einzurichten

Erstellen eines Containers mit docker service create anstelle von docker container run:

vmadmin@node1:~$ docker service create --name registry --publish 5000:5000 registry:2

Auflisten der Services:

vmadmin@node1:~/helloswarm$ docker service ls

Ausgabe:

ID             NAME             MODE         REPLICAS   IMAGE                               PORTS
yyee3zwo1g88 registry replicated 1/1 registry:2 *:5000->5000/tcp

Anwendung erstellen

Beispiel

  • Webserver
  • Standardseite: ID des Containers, auf der die Seite läuft

1. Dateien anlegen

Dockerfile:

FROM php:8-apache
COPY index.php /var/www/html
RUN chmod -R 777 /var/www/html

index.php:

<!DOCTYPE html>
<!-- Datei index.php -->
<html>
<head>
<title>Beispiel</title>
<meta charset="utf-8"/>
</head>
<body>
<h1>Hello from Docker Swarm</h1>
Serverzeit : <?php echo date("j. F Y, H:i:s, e "); ?>
Hello from: <span style="color:red"><?php echo gethostname(); ?></span>
</body>
</html>

docker-compose.yml:

version: '3.8'
services:
web:
image: 127.0.0.1:5000/hello-swarm
build: ..
ports:
- "8080:80"

2. Image ins lokale Registry hochladen

vmadmin@node1:~/helloswarm$ docker compose push

3. Dienst starten

vmadmin@node1:~/helloswarm$ docker stack deploy -c docker-compose.yml helloswarm

Ausgabe:

Creating network helloswarm_default
Creating service helloswarm_web

Überprüfen des Servies:

vmadmin@node1:~/helloswarm$ docker service ls

Ausgabe:

ID             NAME             MODE         REPLICAS   IMAGE                PORTS
ijm66lqeiri5 helloswarm_web replicated 1/1 hello-swarm:latest *:8080->80/tcp

Unter 192.168.210.101:8080 wird die Standardseite nun angezeigt.

Anwendung skalieren

Ziel: Applikation von einem auf drei Container hochskalieren

1. Skalierung

vmadmin@node1:~/helloswarm$ docker service scale helloswarm_web=3

Ausgabe:

helloswarm_web scaled to 3
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged

2. Überprüfung der Container

node2:

vmadmin@node2:~$ docker container list

Ausgabe:

CONTAINER ID   IMAGE                               COMMAND                  CREATED         STATUS         PORTS     NAMES
6ea73fd51ef6 127.0.0.1:5000/hello-swarm:latest "docker-php-entrypoi…" 4 minutes ago Up 4 minutes 80/tcp helloswarm_web.1.hd0v9u666nt8k6z55o43n934w

node3:

vmadmin@node3:~$ docker container list

Ausgabe:

CONTAINER ID   IMAGE                               COMMAND                  CREATED         STATUS         PORTS     NAMES
a6064880b202 127.0.0.1:5000/hello-swarm:latest "docker-php-entrypoi…" 3 minutes ago Up 3 minutes 80/tcp helloswarm_web.2.4jbzkwvwy38rkpmecy1a7vdvp

Docker Swarm Scaling Example Website

3. Überprüfung des Swarms

vmadmin@node1:~/helloswarm$ docker stack ps helloswarm

Ausgabe:

ID             NAME                IMAGE                               NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
hd0v9u666nt8 helloswarm_web.1 127.0.0.1:5000/hello-swarm:latest node2 Running Running 8 minutes ago
4jbzkwvwy38r helloswarm_web.2 127.0.0.1:5000/hello-swarm:latest node3 Running Running 6 minutes ago
vbn90b3dny1p helloswarm_web.3 127.0.0.1:5000/hello-swarm:latest node1 Running Running 7 minutes ago
  • Loadbalancing (Verteilung von Rechenlasten auf zwei oder mehr Computer) wird automatisch von Docker Swarm ausgeführt

Anwendung entfernen

docker stack rm helloswarm