Einführung
Docker Swarm ist die native Docker-Lösung zum Bereitstellen eines Clusters von Docker-Hosts. Sie können damit schnell einen Cluster von Docker-Hosts bereitstellen, die entweder auf Ihrem lokalen Computer oder auf unterstützten Cloud-Plattformen ausgeführt werden.
Vor Docker 1.12 mussten Sie zum Einrichten und Bereitstellen eines Clusters von Docker-Hosts einen externen Schlüsselwertspeicher wieetcd oderConsul für die Serviceerkennung verwenden. Mit Docker 1.12 ist jedoch kein externer Erkennungsdienst mehr erforderlich, da Docker mit einem sofort einsatzbereiten Speicher für Schlüsselwerte im Arbeitsspeicher geliefert wird.
In diesem Lernprogramm erfahren Sie, wie Sie mit der Swarm-Funktion von Docker 1.12 auf DigitalOcean einen Cluster von Docker-Computern bereitstellen. Auf jedem Docker-Knoten im Cluster wird Ubuntu 16.04 ausgeführt. Während Sie einen Cluster ausführen können, der aus Dutzenden, Hunderten oder Tausenden von Docker-Hosts besteht, besteht der Cluster, den wir in diesem Lernprogramm einrichten, aus einem Manager-Knoten und zwei Worker-Knoten für insgesamt drei Cluster-Mitglieder . Sobald Sie dieses Lernprogramm abgeschlossen haben, können Sie Ihrem Cluster problemlos weitere Knoten hinzufügen.
Voraussetzungen
Für dieses Tutorial benötigen Sie:
-
Ein lokaler Computer, auf dem Docker installiert ist. Auf Ihrem lokalen Computer kann eine beliebige Linux-Distribution oder sogar Windows oder MacOS ausgeführt werden. Installieren Sie Docker unter Windows und MacOS mitofficial installer. Wenn Ubuntu 16.04 auf Ihrem lokalen Computer ausgeführt wird, Docker jedoch nicht installiert ist, finden Sie Anweisungen inHow To Install and Use Docker on Ubuntu 16.04.
-
Ein DigitalOcean-API-Token. Wenn Sie noch keine haben, generieren Sie diese mitthis guide. Stellen Sie beim Generieren eines Tokens sicher, dass es über einen Lese- / Schreibbereich verfügt. Dies ist die Standardeinstellung. Wenn Sie also beim Generieren keine Option ändern, verfügt diese über Lese- und Schreibfunktionen. Um die Verwendung in der Befehlszeile zu vereinfachen, müssen Sie das Token einer in diesem Artikel angegebenen Variablen zuweisen.
-
Docker Machine ist auf Ihrem lokalen Computer installiert und wird zum Erstellen von drei Hosts verwendet. Unter Windows und macOS enthält die Docker-Installation Docker Machine. Wenn Sie Ubuntu 16.04 lokal ausführen, finden Sie Installationsanweisungen unterHow To Provision and Manage Remote Docker Hosts with Docker Machine on Ubuntu 16.04.
[[Schritt 1 - Bereitstellen der Clusterknoten]] == Schritt 1 - Bereitstellen der Clusterknoten
Wir müssen mehrere Docker-Hosts für unseren Cluster erstellen. Zur Auffrischung stellt der folgende Befehl einen einzelnen Docker-Host bereit, wobei$DOTOKEN
eine Umgebungsvariable ist, die für Ihr DigitalOcean-API-Token ausgewertet wird:
docker-machine create --driver digitalocean --digitalocean-image ubuntu-16-04-x64 --digitalocean-access-token $DOTOKEN machine-name
Stellen Sie sich vor, Sie müssen dies tun, um einen Cluster mit mindestens drei Knoten einzurichten, der jeweils einen Host bereitstellt.
Mit diesem Befehl können wir die Bereitstellung einer beliebigen Anzahl von Docker-Hosts in Kombination mit einfachen Bash-Skripten automatisieren. Führen Sie diesen Befehl auf Ihrem lokalen Computer aus, um drei Docker-Hosts mit den Namennode-1
,node-2
undnode-3
zu erstellen:
for i in 1 2 3; do docker-machine create --driver digitalocean \
--digitalocean-image ubuntu-16-04-x64 \
--digitalocean-access-token $DOTOKEN node-$i; done
Nachdem der Befehl erfolgreich ausgeführt wurde, können Sie überprüfen, ob alle Computer erstellt wurden, indem Sie Ihr DigitalOcean-Dashboard aufrufen oder den folgenden Befehl eingeben:
docker-machine ls
Die Ausgabe sollte der folgenden ähneln und als Kurzreferenz für die Suche nach der IP-Adresse der Knoten dienen:
OutputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
node-1 - digitalocean Running tcp://111.111.111.111:2376 v1.12.2
node-2 - digitalocean Running tcp://111.111.111.112:2376 v1.12.2
node-3 - digitalocean Running tcp://111.111.222.222:2376 v1.12.2
Zu diesem Zeitpunkt wurden alle drei Dockerized-Hosts erstellt und Sie haben die IP-Adresse jedes Hosts. Sie führen auch alle Docker 1.12.x aus, sind jedoch noch nicht Teil eines Docker-Clusters. In den nächsten Schritten konfigurieren wir die Firewall-Regeln, nach denen die Knoten als Mitglieder eines Clusters fungieren, wählen einen der Knoten aus und machen ihn zum Docker Swarm-Manager. Den Rest konfigurieren wir als Docker Swarm-Worker.
[[Schritt-2 - Konfigurieren von Firewall-Regeln, um Docker-Schwarm-Verkehr zuzulassen]] == Schritt 2 - Konfigurieren von Firewall-Regeln, um Docker-Schwarm-Verkehr zuzulassen
Ein Cluster muss mindestens einen Knoten haben, der als Manager fungiert. Für ein Produktionssetup werden drei Manager empfohlen. Wählen Sie für dieses Setup den ersten Knoten aus und machen Sie ihn zum Schwarm-Manager. Die anderen beiden Knoten sind die Arbeitsknoten.
Bestimmte Netzwerkports müssen auf den Knoten geöffnet werden, die Teil eines Clusters sind, damit der Cluster ordnungsgemäß funktioniert. Dazu muss die Firewall so konfiguriert werden, dass der Datenverkehr über diese Ports zugelassen wird. Da es drei verschiedene Firewall-Anwendungen gibt, mit denen diese Aufgabe ausgeführt werden kann, wurden die Befehle, die Sie für jede Firewall-Anwendung auf den Knoten ausführen müssen, in einem separaten Artikel dokumentiert. Folgen Siethis guide und konfigurieren Sie die Firewalls für jeden Host. Öffnen Sie die richtigen Ports auf dem Manager und wiederholen Sie den Vorgang, um die Ports auf den beiden Clientknoten zu öffnen.
Nachdem Sie diesen Schritt ausgeführt haben, können Sie den Cluster-Manager initialisieren.
[[Schritt 3 - Initialisieren des Cluster-Managers]] == Schritt 3 - Initialisieren des Cluster-Managers
Wir haben entschieden, dassnode-1
unser Cluster-Manager sein wird. Melden Sie sich daher von Ihrem lokalen Computer aus beim Knoten an:
docker-machine ssh node-1
Die Eingabeaufforderung ändert sich, um die Tatsache widerzuspiegeln, dass Sie jetzt an diesem bestimmten Knoten angemeldet sind. Geben Sie den folgenden Befehl ein, um den Knoten als Swarm-Manager zu konfigurieren:
docker swarm init --advertise-addr node_ip_address
node_ip_address
ist die IP-Adresse des Knotens. Sie können es von der Ausgabe vondocker-machine ls
oder von Ihrem DigitalOcean-Dashboard erhalten.
Es wird eine Ausgabe angezeigt, die wie folgt aussieht:
OutputSwarm initialized: current node (a35hhzdzf4g95w0op85tqlow1) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-3k7ighcfs9352hmdfzh31t297fd8tdskg6x6oi8kpzzszznffx-6kovxm3akca2qe3uaxtu07fj3 \
111.111.111.111:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
In der Ausgabe befinden sich die ID des Knotens, in diesem Beispiela35hhzdzf4g95w0op85tqlow1, und die Anweisungen zum Hinzufügen der anderen Knoten zum Cluster.
Jetzt haben Sie einen Docker-Schwarm mit einem konfigurierten Manager. Fügen wir die verbleibenden Knoten als Worker hinzu.
[[Schritt 4 - Hinzufügen von Knoten zum Cluster]] == Schritt 4 - Hinzufügen von Knoten zum Cluster
Um diesen Schritt abzuschließen, möchten Sie möglicherweise ein anderes Terminal öffnen und die Registerkarte oder das Fenster des Terminals, in dem Sie sich angemeldet haben, für den Moment alleine lassen.
Stellen Sie zunächst von Ihrem lokalen Computer aus eine Verbindung zunode-2
her:
docker-machine ssh node-2
Führen Sie dann diesen Befehl aus, wobeiyour_swarm_token
das Token ist, das Sie beim Erstellen des Clusters im vorherigen Schritt erhalten haben, undmanager_node_ip_address
die IP des Schwarmmanagers ist:
docker swarm join \
--token your_swarm_token \
manager_node_ip_address:2377
Nachdem der Befehl erfolgreich ausgeführt wurde, wird folgende Antwort angezeigt:
OutputThis node joined a swarm as a worker.
Melden Sie sich vonnode-2
ab und wiederholen Sie diesen Vorgang mitnode-3
, um ihn Ihrem Cluster hinzuzufügen.
Sie haben dem Cluster jetzt zwei Arbeitsknoten hinzugefügt. Wenn die Firewall-Regeln korrekt konfiguriert wurden, haben Sie jetzt einen funktionierenden Docker-Schwarm, bei dem alle Knoten synchronisiert sind.
[[Schritt-5 - Verwalten des Clusters]] == Schritt 5 - Verwalten des Clusters
Nachdem die Manager- und Worker-Knoten dem Cluster zugewiesen wurden, müssen alle Docker Swarm-Verwaltungsbefehle auf den Manager-Knoten ausgeführt werden. Kehren Sie zu dem Terminal zurück, mit dem Sie den Manager hinzugefügt haben, und geben Sie diesen Befehl ein, um alle Mitglieder des Clusters anzuzeigen:
docker node ls
Die Ausgabe sollte ungefähr so aussehen:
OutputID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
2qhg0krj00i4d3as2gpb0iqer node-2 Ready Active
6yqh4bjki46p5uvxdw6d53gc0 node-3 Ready Active
a35hhzdzf4g95w0op85tqlow1 * node-1 Ready Active Leader
Diese Ausgabe zeigt, dass es sich um einen Docker-Schwarm mit drei Knoten und seinen Knoten handelt - einen Manager und zwei Mitarbeiter. Geben Sie Folgendes ein, um die anderen Verwaltungsbefehle anzuzeigen, die Sie auf dem Manager-Knoten ausführen können:
docker node --help
Ausführliche Informationen zum Cluster erhalten Sie, wenn Sie den folgenden Befehl für den Manager oder die Mitarbeiter verwenden (es handelt sich um einen allgemeinen Docker-Befehl):
docker info
Die Ausgabe sollte von dieser Art sein und den Status des Clusters (active oderpending), die Anzahl der Knoten im Cluster und die Frage angeben, ob der bestimmte Knoten ein Manager oder ein Mitarbeiter ist.
Output...
Network: bridge host null overlay
Swarm: active
NodeID: a35hhzdzf4g95w0op85tqlow1
Is Manager: true
ClusterID: f45u0lh7ag4qsl4o56yfbls31
Managers: 1
Nodes: 3
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Heartbeat Tick: 1
Election Tick: 3
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Node Address: 104.236.239.4
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-38-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
...
Wenn Sie denselben Befehl auf den Arbeitsknoten wiederholen, sollte in der ZeileIs Managerfalse
angezeigt werden.
[.tip] #Tip: Sie können jederzeit Knoten zum Cluster hinzufügen oder daraus entfernen. Darüber hinaus kann ein Worker-Knoten zu einem Manager befördert und der Manager zu einem Worker konvertiert werden.
#
Lassen Sie uns nun einen Dienst auf dem Cluster ausführen.
[[Schritt 6 - Ausführen von Diensten im Docker-Schwarm]] == Schritt 6 - Ausführen von Diensten im Docker-Schwarm
Nachdem Sie einen Docker-Schwarm eingerichtet haben, können Sie einen Testcontainer ausführen und sehen, wie der Manager damit umgeht. Auf einem Computer mit Docker Engine 1.12 oder neuer werden Container mit dem Befehldocker service
als Dienste bereitgestellt. Und wie der Befehldocker node
kann der Befehldocker service
nur auf einem Manager-Knoten ausgeführt werden.
Stellen wir also einen Webserverdienst mit dem offiziellen Nginx-Container-Image bereit:
docker service create -p 80:80 --name webserver nginx
In diesem Befehl ordnen wir Port80
im Nginx-Container Port80
im Cluster zu, sodass wir von überall auf die Standard-Nginx-Seite zugreifen können.
Geben Sie Folgendes ein, um anzuzeigen, welche Dienste in einem Cluster ausgeführt werden:
docker service ls
Die Ausgabe sollte diese Form annehmen. Die SpalteREPLICAS zeigt an, wie viele Instanzen des Dienstes ausgeführt werden:
OutputID NAME REPLICAS IMAGE COMMAND
0ymctkanhtc1 webserver 1/1 nginx
Sie können mithilfe vondocker service ps
gefolgt vom Dienstnamen bestimmen, auf welchen Knoten die Dienste ausgeführt werden.
docker service ps webserver
Die Ausgabe sollte ungefähr so aussehen:
OutputID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
39yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 7 hours ago
In diesem Beispiel wird der Dienstwebserver
aufnode-1
ausgeführt. Da dies ein Webserver ist, der an den Standardports ausgeführt wird, können Sie darauf zugreifen, indem Sie Ihren Browser aufhttp://node-1_ip_address
richten. Versuche es. Sie sehen die Standardseite von Nginx.
Mit der Magie des Mesh-Netzwerks kann auf einen Dienst, der auf einem Knoten ausgeführt wird, auf jedem anderen Knoten des Clusters zugegriffen werden. Auf diesen Nginx-Dienst kann beispielsweise auch zugegriffen werden, indem Sie Ihren Browser auf die IP-Adresse eines beliebigen Knotens im Cluster verweisen, nicht nur auf den, auf dem er ausgeführt wird. Versuche es.
Eine weitere Funktion von Docker Swarm ist die Möglichkeit, einen Dienst zu skalieren, dh zusätzliche Instanzen eines Dienstes zu starten. Angenommen, wir möchten den zuvor gestarteten Dienstwebserver
auf fünf Instanzen skalieren. Dazu geben wir einfach den folgenden Befehl ein und das System erstellt vier weitere Instanzen:
docker service scale webserver=5
Die Ausgabe vondocker service ps
zeigt an, auf welchen Knoten die neuen Instanzen gestartet wurden:
OutputID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
39yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 8 hours ago
1er2rbrnj6ltanoe47mb653wf webserver.2 nginx node-3 Running Running 14 seconds ago
evassgyvruh256ebv5pj3bqcz webserver.3 nginx node-3 Running Running 14 seconds ago
d453agrdpgng47klbl6yfjnka webserver.4 nginx node-1 Running Running 18 seconds ago
2hsdevx178rg15gqxhzrsnmg6 webserver.5 nginx node-2 Running Running 14 seconds ago
Dies zeigt, dass zwei der vier neuen Instanzen aufnode-3
gestartet wurden, eine aufnode-1
und die andere aufnode-2
.
Wenn ein Dienst ausfällt, wird er automatisch auf demselben Knoten oder auf einem anderen Knoten neu gestartet, wenn der ursprüngliche Knoten nicht mehr verfügbar ist.
Fazit
Sie haben gesehen, wie einfach es ist, einen Docker-Schwarm mit Docker Engine 1.12 und dem neuen Schwarmmodus einzurichten. Außerdem erfahren Sie, wie Sie einige Verwaltungsaufgaben im Cluster ausführen. Aber es gibt noch mehr. Führen Sie den folgenden Befehl in Ihrem Swarm-Manager aus, um die verfügbaren Docker Swarm-Befehle anzuzeigen.
docker swarm --help
Weitere Informationen zu Docker Swarm finden Sie unterofficial documentation page. Schauen Sie sich auch andereDocker-related articlesauf DigitaloOcean an.