Suche…


Einführung

Ein Schwarm ist eine Reihe von Docker Engines (oder Knoten ), die Dienste gemeinsam bereitstellen. Swarm wird verwendet, um die Verarbeitung auf viele physische, virtuelle oder Cloud-Maschinen zu verteilen.

Syntax

Bemerkungen

Der Schwarmmodus implementiert die folgenden Funktionen:

  • Cluster-Management in Docker Engine integriert
  • Dezentrales Design
  • Deklaratives Servicemodell
  • Skalieren
  • Gewünschter Staatenabgleich
  • Multi-Host-Netzwerk
  • Service Discovery
  • Lastverteilung
  • Standardmäßig sicheres Design
  • Aktualisierungen

Weitere offizielle Docker-Dokumentation zu Swarm finden Sie unter: Swarm-Modusübersicht


CLI-Befehle für den Schwarmmodus

Klicken Sie zur Beschreibung auf die Befehlsbeschreibung

Einen Schwarm initialisieren

docker swarm init [OPTIONS]

Treten Sie einem Knoten als Knoten und / oder Manager bei

docker swarm join [OPTIONS] HOST:PORT

Erstellen Sie einen neuen Dienst

docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

Detaillierte Informationen zu einem oder mehreren Diensten anzeigen

docker service inspect [OPTIONS] SERVICE [SERVICE...]

Services auflisten

docker service ls [OPTIONS]

Entfernen Sie einen oder mehrere Dienste

docker service rm SERVICE [SERVICE...]

Skalieren Sie einen oder mehrere replizierte Dienste

docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]

Listen Sie die Aufgaben eines oder mehrerer Dienste auf

docker service ps [OPTIONS] SERVICE [SERVICE...]

Aktualisieren Sie einen Dienst

docker service update [OPTIONS] SERVICE

Erstellen Sie einen Schwarm unter Linux mit Docker-Machine und VirtualBox

# Create the nodes
# In a real world scenario we would use at least 3 managers to cover the fail of one manager.
docker-machine create -d virtualbox manager
docker-machine create -d virtualbox worker1

# Create the swarm
# It is possible to define a port for the *advertise-addr* and *listen-addr*, if none is defined the default port 2377 will be used.
docker-machine ssh manager \
    docker swarm init \
    --advertise-addr $(docker-machine ip manager)
    --listen-addr $(docker-machine ip manager)

# Extract the Tokens for joining the Swarm
# There are 2 different Tokens for joining the swarm.
MANAGER_TOKEN=$(docker-machine ssh manager docker swarm join-token manager --quiet)
WORKER_TOKEN=$(docker-machine ssh manager docker swarm join-token worker --quiet)


# Join a worker node with the worker token
docker-machine ssh worker1 \
    docker swarm join \
    --token $WORKER_TOKEN \
    --listen-addr $(docker-machine ip worker1) \
    $(docker-machine ip manager):2377



Finde heraus, wie Arbeiter und Manager Token beitreten

Wenn Sie die Bereitstellung neuer Knoten für einen Schwarm automatisieren, müssen Sie wissen, was der richtige Join-Token für den Schwarm ist, sowie die angegebene Adresse des Managers. Sie können dies herausfinden, indem Sie die folgenden Befehle auf einem der vorhandenen Managerknoten ausführen:

# grab the ipaddress:port of the manager (second last line minus the whitespace)
export MANAGER_ADDRESS=$(docker swarm join-token worker | tail -n 2 |  tr -d '[[:space:]]')

# grab the manager and worker token
export MANAGER_TOKEN=$(docker swarm join-token manager -q)
export WORKER_TOKEN=$(docker swarm join-token worker -q)

Die Option -q gibt nur das Token aus. Ohne diese Option erhalten Sie den vollständigen Befehl zur Registrierung bei einem Schwarm.

Auf neu bereitgestellten Knoten können Sie dann mit dem Schwarm beitreten.

docker swarm join --token $WORKER_TOKEN $MANAGER_ADDRESS

Hallo Weltanwendung

Normalerweise möchten Sie einen Stapel von Services erstellen, um eine replizierte und orchestrierte Anwendung zu bilden.

Eine typische moderne Webanwendung besteht aus Datenbank, API, Frontend und Reverse Proxy.

Beharrlichkeit

Die Datenbank benötigt Persistenz, daher benötigen wir ein Dateisystem, das von allen Knoten eines Schwarms gemeinsam genutzt wird. Es kann sich dabei um NAS, NFS-Server, GFS2 oder etwas anderes handeln. Das Einrichten ist hier nicht möglich. Momentan enthält Docker keine Persistenz in einem Schwarm und verwaltet diese auch nicht. In diesem Beispiel wird davon /nfs/ dass /nfs/ shared location auf allen Knoten bereitgestellt ist.

Netzwerk

Um miteinander kommunizieren zu können, müssen sich Dienste in einem Schwarm im selben Netzwerk befinden.

Wählen Sie einen IP-Bereich (hier 10.0.9.0/24 ) und den Netzwerknamen ( hello-network ) und führen Sie einen Befehl aus:

docker network create \
  --driver overlay \
  --subnet 10.0.9.0/24 \
  --opt encrypted \
  hello-network

Datenbank

Der erste Service, den wir brauchen, ist eine Datenbank. Verwenden wir postgresql als Beispiel. Erstellen Sie einen Ordner für eine Datenbank in nfs/postgres und führen Sie diesen aus:

docker service create --replicas 1 --name hello-db \
       --network hello-network -e PGDATA=/var/lib/postgresql/data \
       --mount type=bind,src=/nfs/postgres,dst=/var/lib/postgresql/data \
       kiasaki/alpine-postgres:9.5

Beachten Sie, dass wir die Optionen --network hello-network und --mount haben.

API

Das Erstellen einer API ist außerhalb des Anwendungsbereichs dieses Beispiels. Nehmen wir also an, Sie haben ein API-Image unter username/hello-api .

docker service create --replicas 1 --name hello-api \
       --network hello-network \
       -e NODE_ENV=production -e PORT=80 -e POSTGRESQL_HOST=hello-db \
       username/hello-api

Beachten Sie, dass wir einen Namen unseres Datenbankdienstes übergeben haben. Der Docker-Schwarm verfügt über einen integrierten Round-Robin-DNS-Server, sodass die API unter Verwendung ihres DNS-Namens eine Verbindung zur Datenbank herstellen kann.

Reverse Proxy

Lassen Sie uns einen Nginx-Service erstellen, um unsere API für eine äußere Welt bereitzustellen. Erstellen Sie Nginx-Konfigurationsdateien an einem freigegebenen Speicherort und führen Sie Folgendes aus:

docker service create --replicas 1 --name hello-load-balancer \
       --network hello-network \
       --mount type=bind,src=/nfs/nginx/nginx.conf,dst=/etc/nginx/nginx.conf \
       -p 80:80 \
       nginx:1.10-alpine

Beachten Sie, dass wir die Option -p , um einen Port zu veröffentlichen. Dieser Port steht jedem Knoten in einem Schwarm zur Verfügung.

Verfügbarkeit der Knoten

Verfügbarkeit des Schwarmmodusknotens:

  • Aktiv bedeutet, dass der Scheduler einem Knoten Aufgaben zuweisen kann.
  • Pause bedeutet, dass der Scheduler dem Knoten keine neuen Aufgaben zuweist, aber vorhandene Aufgaben bleiben aktiv.
  • Entleeren bedeutet, dass der Scheduler dem Knoten keine neuen Aufgaben zuweist. Der Scheduler fährt alle vorhandenen Aufgaben herunter und plant sie auf einem verfügbaren Knoten.

So ändern Sie die Verfügbarkeit des Modus:

#Following commands can be used on swarm manager(s)
docker node update --availability drain node-1
#to verify:
docker node ls

Schwarmknoten fördern oder herabstufen

Führen Sie zum docker node promote eines Knotens oder einer Knotengruppe einen docker node promote von einem Managerknoten aus aus:

docker node promote node-3 node-2

Node node-3 promoted to a manager in the swarm.
Node node-2 promoted to a manager in the swarm.

Führen Sie zum Herabstufen eines Knotens oder einer Gruppe von Knoten einen docker node demote von einem Manager-Knoten aus aus:

docker node demote node-3 node-2

Manager node-3 demoted in the swarm.
Manager node-2 demoted in the swarm.

Den Schwarm verlassen

Arbeiterknoten:

#Run the following on the worker node to leave the swarm.

docker swarm leave
Node left the swarm.

Wenn der Knoten die Manager- Rolle hat, erhalten Sie eine Warnung, dass das Quorum der Manager beibehalten wird. Sie können --force verwenden, um auf dem Manager-Knoten zu bleiben:

#Manager Node

docker swarm leave --force
Node left the swarm.

Knoten, die den Swarm verlassen haben, werden weiterhin in der Ausgabe des docker node ls .

So entfernen Sie Knoten aus der Liste:

docker node rm node-2

node-2


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow