Erstellen eines Docker-Container-Clusters mit Docker Swarm und DigitalOcean unter Ubuntu 16.04

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 Dienstwebserveraufnode-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 Dienstwebserverauf 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.