Docker Swarm
- Orchestrierung bei Docker
- einfachere Verwendung als Kubernetes
Grundlagen
Grundlegende Schritte
swarm init
→ Erzeugung eines Swarmsswarm join
→ Hinzufügen zusätzlicher Knoten (Computer, auf denen Docker läuft)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
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
Hostname | IP-Adresse | Rolle |
---|---|---|
node1 | 192.168.210.101 | Manager und Worker |
node2 | 192.168.210.102 | Worker |
node3 | 192.168.210.103 | Worker |
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
- Befehl von
docker swarm init
-Ausgabe kopieren - 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
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