Docker Swarm für Container-Orchestrierung
Veröffentlicht: 2019-08-08Alles über den Docker Swarm und wie er alle Container in einem Cluster verwaltet und orchestriert.
Was ist Docker Swarm?
Docker Swarm ist ein Modus zur Handhabung eines Clusters von Docker Engines, daher der Name Swarm. Der Cluster von Docker-Hosts wird im Schwarmmodus ausgeführt, der aus Managern und Arbeitern besteht. Die Docker-Engine-Instanzen, die am Schwarm teilnehmen, werden Knoten genannt.
Eine Schwarmbereitstellung auf Produktionsebene besteht aus Docker-Knoten, die über mehrere Server verteilt sind.
Warum verwenden? – Container-Orchestrierung
Wenn Sie in einer Produktionsumgebung arbeiten, werden Hunderte von Docker-Containern mehrere Anwendungen darin ausführen. Die Verwaltung all dieser Container kann für alle DevOps-Ingenieure sehr mühsam sein; Hier hilft Ihnen Docker Swarm. Es verwaltet und orchestriert mühelos den Cluster, auf dem mehrere Docker-Container ausgeführt werden.
Im Folgenden sind einige seiner Funktionen aufgeführt:
- Hochverfügbarkeit – zielt darauf ab, keine Ausfallzeiten oder Ausfälle zu bieten.
- Load Balancing – Weisen Sie die Ressourcen und Anfragen automatisch anderen Knoten im Cluster zu, wenn ein Knoten ausfällt.
- Dezentral – mehrere Manager-Knoten werden in einer Produktionsumgebung ausgeführt; daher ist der Cluster niemals von einem einzelnen Manager-Knoten abhängig.
- Skalierbarkeit – Mit einem einzigen Docker-Swarm-Befehl können Sie Container im Cluster einfach hoch- oder herunterskalieren.
Orchestrieren Sie Docker-Container
Nachdem Sie nun die Grundlagen von Docker Swarm kennen, wollen wir uns ein Beispiel für seine Implementierung ansehen.
In diesem Beispiel habe ich drei Maschinen, die in einem Cluster mit den folgenden Details ausgeführt werden:
manager1: 192.168.56.104 worker1: 192.168.56.105 worker2: 192.168.56.102
Um den Schwarmmodus im Docker zu initialisieren, führen Sie den folgenden Befehl auf dem Manager-Knoten aus. Das Flag --advertise-addr
wird verwendet, um sich selbst bei den Knoten anzukündigen, 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 Worker-Knoten aus.
Ausführen des Tokens auf dem worker1-Knoten.
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 worker2-Knoten.
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 Docker-Image geekflare_mongodb
, das wir im Dockerfile-Tutorial verwendet haben.
docker build -t geekflare_mongodb .
Führen Sie einen Container des MongoDB-Docker-Images aus, indem Sie einen Schwarmdienst erstellen. 27017 ist die Portnummer, auf der MongoDB verfügbar gemacht wird.
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-Swarm-Dienst gestartet wurde. MODE 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 läuft auf dem Manager1-Knoten.
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 zu erhalten, der diesen Schwarmdienst ausführt.
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 auch im „globalen“ Modus anstelle des standardmäßigen „replizierten“ Modus ausführen. Der globale Modus führt eine Aufgabe des Swarm-Dienstes auf allen Knoten im Cluster aus.
Bevor ich den Dienst im globalen Modus ausführe, möchte ich den vorhandenen laufenden Container entfernen.
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 daher 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. Davor 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 gewünschten Replikate des Schwarmdienstes an. Ich möchte zum Beispiel zwei Nachbildungen 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 worker1-Knoten und prüfen Sie, ob der Docker-Container den Swarm-Dienst ausführt.
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 jetzt vom Manager1-Knoten aus überprüfen, auf welchen Knoten der Dienst ausgeführt wird, sehen Sie, dass er auf dem Manager1-Knoten und dem Worker2-Knoten ausgeführt wird. Der AKTUELLE STATUS des worker1-Knotens ist Shutdown (da wir den Container angehalten haben, auf dem der Dienst ausgeführt wird). Da aber von diesem Dienst zwei Replicas laufen müssen, wurde auf Worker 2 ein anderer Dienst gestartet.
So erreichen Sie Hochverfügbarkeit mit docker swarm.
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. Der folgende Befehl skaliert den Mongo-Container auf 5.
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 jetzt ausgeführt werden, es müssen 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. 1 Replikat wird auf dem Manager1-Knoten und jeweils 2 Replikate auf beiden Worker-Knoten 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 Sie ihn nur für die Verwaltung der Knoten behalten 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 laufen; Sie sind über die Worker-Knoten 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 im Docker-Swarm-Modus orchestriert. Probieren Sie diese in Ihrer Nicht-Produktionsumgebung aus, um eine Vorstellung davon zu bekommen, wie es funktioniert.