Alles über den Docker Swarm und wie er alle Container in einem Cluster verwaltet und orchestriert.
What is Docker Swarm?
Docker-Schwarm ist ein Modus zur Behandlung eines Clusters von Docker-Engines, daher der Name Schwarm. Der Cluster von Docker-Hosts wird im Schwarmmodus ausgeführt und besteht aus Managern und Mitarbeitern. Die Docker-Engine-Instanzen, die am Schwarm teilnehmen, werden als Knoten bezeichnet.
Eine Schwarmbereitstellung auf Produktionsebene besteht aus Docker-Knoten, die auf mehrere Server verteilt sind.
Why use it? – Container Orchestration
Wenn Sie in einer Produktionsumgebung arbeiten, werden in Hunderten von Docker-Containern mehrere Anwendungen ausgeführt. Die Verwaltung all dieser Container kann für alle ein großer Schmerz sein DevOps Ingenieure; Hier hilft Ihnen Docker Swarm. Es verwaltet und orchestriert problemlos den Cluster, in dem mehrere Docker-Container ausgeführt werden.
Im Folgenden sind einige seiner Funktionen aufgeführt:
- Hohe Verfügbarkeit - zielt darauf ab, keine Ausfallzeiten oder Ausfälle anzubieten.
- Lastverteilung - Ordnen Sie die Ressourcen und Anforderungen automatisch anderen Knoten im Cluster zu, wenn ein Knoten ausfällt.
- Dezentralisiert - In einer Produktionsumgebung werden mehrere Manager-Knoten ausgeführt. Daher ist der Cluster niemals von einem einzelnen Manager-Knoten abhängig.
- Skalierbarkeit - Mit einem einzigen Docker-Schwarmbefehl können Sie Container im Cluster problemlos vergrößern oder verkleinern.
Orchestrate Docker Containers
Nachdem Sie die Grundlagen von Docker Swarm kennen, sehen wir uns ein Beispiel für dessen Implementierung an.
In diesem Beispiel werden drei Computer in einem Cluster mit den folgenden Details ausgeführt:
manager1: 192.168.56.104
worker1: 192.168.56.105
worker2: 192.168.56.102
Führen Sie den folgenden Befehl auf dem Manager-Knoten aus, um den Schwarmmodus im Docker zu initialisieren. Die Flagge --advertise-addr
wird verwendet, um sich selbst auf den Knoten zu bewerben, die dem Cluster beitreten können.
geekflare@manager1:~$ docker swarm init --advertise-addr 192.168.56.104
Swarm initialized: current node (lssbyfzuiuh3sye1on63eyixf) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Der obige Befehl generiert ein Token, das von anderen Knoten verwendet wird, um diesem Cluster beizutreten. Kopieren Sie den Befehl mit dem generierten Token und führen Sie ihn auf den Arbeitsknoten aus.
Ausführen des Tokens auf dem Knoten worker1.
geekflare@worker1:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377
This node joined a swarm as a worker.
Ausführen des Tokens auf dem Knoten worker2.
geekflare@worker2:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377
This node joined a swarm as a worker.
Jetzt können Sie auf dem Manager-Knoten überprüfen, welche Knoten im Cluster ausgeführt werden.
geekflare@manager1:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
lssbyfzuiuh3sye1on63eyixf * manager1 Ready Active Leader 18.09.6
utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6
xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6
Lassen Sie uns das bauen geekflare_mongodb
Docker-Image, in dem wir verwendet haben Dockerfile-Tutorial.
docker build -t geekflare_mongodb .
Führen Sie einen Container mit dem MongoDB-Docker-Image aus, indem Sie einen Schwarmdienst erstellen. 27017 ist die Portnummer, an der MongoDB verfügbar ist.
geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 geekflare_mongodb
image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image.
kok58xa4zi05psh3uy6s5x9e6
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged
Überprüfen Sie, ob der Docker-Schwarmdienst gestartet wurde. MODUS repliziert bedeutet, dass der Container auf allen Knoten im Cluster repliziert wurde und REPLICAS 1/1 bedeutet, dass derzeit nur ein Schwarmdienst ausgeführt wird.
geekflare@manager1:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
kok58xa4zi05 Mongo-Container replicated 1/1 geekflare_mongodb:latest *:27017->27017/tcp
Lassen Sie uns überprüfen, auf welchem Knoten im Cluster dieser einzelne Dienst ausgeführt wird. Es wird auf dem Knoten manager1 ausgeführt.
geekflare@manager1:~$ docker service ps Mongo-Container
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
jgqjo92rbq23 Mongo-Container.1 geekflare_mongodb:latest manager1 Running Running about a minute ago
Führen Sie den Befehl docker ps aus, um weitere Details zu dem Container abzurufen, in dem dieser Schwarmdienst ausgeführt wird.
geekflare@manager1:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05d77e7b4850 geekflare_mongodb:latest "/bin/sh -c usr/bin/…" 2 minutes ago Up 2 minutes 27017/tcp Mongo-Container.1.jgqjo92rbq23sv01hrufdigtx
Sie können den Schwarmdienst in ausführen "Global" Modus auch anstelle des Standardmodus "repliziert". Im globalen Modus wird eine Aufgabe des Schwarmdienstes auf allen Knoten im Cluster ausgeführt.
Lassen Sie mich den vorhandenen laufenden Container entfernen, bevor ich den Dienst im globalen Modus ausführe.
geekflare@manager1:~$ docker service rm Mongo-Container
Mongo-Container
Starten Sie den Schwarmdienst in einem Docker-Container im globalen Modus mit dem Flag –mode.
geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --mode global geekflare_mongodb
image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image.
mfw8dp0zylffppkllkcjl8391
overall progress: 3 out of 3 tasks
utdr3dnngqf1: running
lssbyfzuiuh3: running
xs6jqp95lw4c: running
verify: Service converged
Überprüfen Sie, ob der Schwarmdienst im globalen Modus gestartet wurde. Da im Cluster drei Knoten (1 Manager, 2 Worker) ausgeführt werden, beträgt die Anzahl der Replikate 3.
geekflare@manager1:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
mfw8dp0zylff Mongo-Container global 3/3 geekflare_mongodb:latest *:27017->27017/tcp
3 Dienste werden jetzt auf 3 Knoten ausgeführt. Überprüfen Sie dies, indem Sie den folgenden Befehl ausführen.
geekflare@manager1:~$ docker service ps Mongo-Container
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
zj2blvptkvj6 Mongo-Container.xs6jqp95lw4cml1i1npygt3cg geekflare_mongodb:latest worker2 Running Running about a minute ago
3eaweijbbutf Mongo-Container.utdr3dnngqf1oy1spupy1qlhu geekflare_mongodb:latest worker1 Running Running about a minute ago
yejg1o2oyab7 Mongo-Container.lssbyfzuiuh3sye1on63eyixf geekflare_mongodb:latest manager1 Running Running about a minute ago
Lassen Sie mich als Nächstes zeigen, wie Sie die Anzahl der Replikate definieren können. Vorher werde ich den aktuellen Container entfernen, der ausgeführt wird.
geekflare@manager1:~$ docker service rm Mongo-Container
Mongo-Container
Verwenden Sie das Flag –replicas im Befehl und geben Sie die Anzahl der Replikate an, die Sie für den Schwarmdienst benötigen. Zum Beispiel möchte ich zwei Repliken des Schwarmdienstes haben:
geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --replicas=2 geekflare_mongodb
image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image.
4yfl41n7sfak65p6zqwwjq82c
overall progress: 2 out of 2 tasks
1/2: running
2/2: running
verify: Service converged
Überprüfen Sie die derzeit ausgeführten Schwarmdienste. Sie können sehen, dass ein Replikat auf dem Manager1-Knoten und das andere auf dem Worker1-Knoten ausgeführt wird.
geekflare@manager1:~$ docker service ps Mongo-Container
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
xukodj69h79q Mongo-Container.1 geekflare_mongodb:latest worker1 Running Running 9 seconds ago
e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 9 seconds ago
Gehen Sie zum Knoten worker1 und überprüfen Sie, ob auf dem Docker-Container der Schwarmdienst ausgeführt wird.
geekflare@worker1:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5042b7f161cb geekflare_mongodb:latest "/bin/sh -c usr/bin/…" About a minute ago Up About a minute 27017/tcp Mongo-Container.1.xukodj69h79q3xf0pouwm7bwv
Führen Sie den folgenden Befehl aus, um diesen Container zu stoppen.
geekflare@worker1:~$ docker stop 5042b7f161cb
5042b7f161cb
Wenn Sie nun vom Manager1-Knoten aus überprüfen, auf welchen Knoten der Dienst ausgeführt wird, wird er auf dem Manager1-Knoten und dem Worker2-Knoten ausgeführt. Der CURRENT STATE des Worker1-Knotens ist Shutdown (da der Container, in dem der Dienst ausgeführt wird, gestoppt wurde). Da jedoch zwei Replikate dieses Dienstes ausgeführt werden müssen, wurde auf Worker 2 ein anderer Dienst gestartet.
So erreichen Sie mit Docker Swarm eine hohe Verfügbarkeit.
geekflare@manager1:~$ docker service ps Mongo-Container
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 30 seconds ago
xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 38 seconds ago "task: non-zero exit (137)"
e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 3 minutes ago
Es ist sehr einfach, Docker-Container zu vergrößern oder zu verkleinern. Mit dem folgenden Befehl wird der Mongo-Container auf 5 skaliert.
geekflare@manager1:~$ docker service scale Mongo-Container=5
Mongo-Container scaled to 5
overall progress: 5 out of 5 tasks
1/5: running
2/5: running
3/5: running
4/5: running
5/5: running
verify: Service converged
Überprüfen Sie, wie viele Replikate des Mongo-Containers gerade ausgeführt werden. Es muss 5 sein.
geekflare@manager1:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
4yfl41n7sfak Mongo-Container replicated 5/5 geekflare_mongodb:latest *:27017->27017/tcp
Überprüfen Sie, wo diese 5 Replikate im Cluster ausgeführt werden. Auf Manager1-Knoten wird jeweils 1 Replikat und auf beiden Worker-Knoten jeweils 2 Replikate ausgeführt.
geekflare@manager1:~$ docker service ps Mongo-Container
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 2 minutes ago
xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 2 minutes ago "task: non-zero exit (137)"
e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 5 minutes ago
qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 47 seconds ago
9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 46 seconds ago
e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 44 seconds ago
Wenn Sie in Ihrem Cluster nicht möchten, dass Ihre Dienste auf Manager-Knoten ausgeführt werden, und diese nur für die Verwaltung der Knoten beibehalten möchten, können Sie den Manager-Knoten entleeren.
geekflare@manager1:~$ docker node update --availability drain manager1
manager1
Überprüfen Sie die Verfügbarkeit des Manager-Knotens.
geekflare@manager1:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
lssbyfzuiuh3sye1on63eyixf * manager1 Ready Drain Leader 18.09.6
utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6
xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6
Sie werden sehen, dass die Dienste nicht mehr auf dem Manager-Knoten ausgeführt werden. Sie sind auf die Arbeitsknoten im Cluster verteilt.
geekflare@manager1:~$ docker service ps Mongo-Container
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 5 minutes ago
xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 5 minutes ago "task: non-zero exit (137)"
qo405dheuutj Mongo-Container.2 geekflare_mongodb:latest worker1 Running Running 41 seconds ago
e66zllm0foc8 \_ Mongo-Container.2 geekflare_mongodb:latest manager1 Shutdown Shutdown 44 seconds ago
qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 3 minutes ago
9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 3 minutes ago
e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 3 minutes ago
Das war alles über Docker Swarm und wie man Container orchestrieren im Docker-Schwarm-Modus. Probieren Sie diese in Ihrer Nicht-Produktionsumgebung aus, um eine Vorstellung davon zu bekommen, wie es funktioniert.