Mit der Container-Plattform Docker verteilen Sie An­wen­dun­gen als Tasks schnell, kom­for­ta­bel und res­sour­cen­spa­rend im Netzwerk. Alles, was Sie dazu benötigen, ist der Cluster-Manager Swarm, der seit Docker-Version 1.12.0 als „Swarm-Mode“ nativer Teil der Docker-Engine und damit der Kern­soft­ware der Container-Plattform ist. Docker Swarm erlaubt es Ihnen, Container-An­wen­dun­gen zu skalieren, indem Sie diese in beliebig vielen Instanzen auf beliebig vielen Knoten Ihres Netzwerks betreiben. Möchten Sie hingegen eine Multi-Container-Anwendung – bei Docker „Stack“ genannt – im Cluster ausführen, greifen Sie auf das Docker-Tool Compose zurück. Wir erklären Ihnen die Grund­kon­zep­te der Docker-Or­ches­trie­rung mit Swarm und Compose und ver­deut­li­chen die Im­ple­men­tie­rung anhand von Code­bei­spie­len.

Docker Swarm

Bei Swarm handelt es sich um eine Software der Docker-Ent­wick­ler, die eine beliebige Anzahl von Docker-Hosts zu einem Cluster zu­sam­men­fasst und ein zentrales Cluster-Ma­nage­ment sowie die Or­ches­trie­rung von Con­tai­nern er­mög­licht. Bis Docker-Version 1.11 musste Swarm als separates Tool im­ple­men­tiert werden. Neuere Versionen der Container-Plattform un­ter­stüt­zen einen nativen Swarm-Mode. Der Cluster-Manager steht somit jedem Docker-Nutzer mit In­stal­la­ti­on der Docker-Engine zur Verfügung.

Docker Swarm liegt eine Master-Slave-Ar­chi­tek­tur zugrunde. Jedes Docker-Cluster (der Schwarm) besteht aus min­des­tens einem Manager- und beliebig vielen Worker-Knoten. Während der Swarm-Manager für die Ver­wal­tung des Clusters und die De­le­ga­ti­on von Aufgaben ver­ant­wort­lich ist, über­neh­men die Swarm-Worker die Aus­füh­rung von Ar­beits­ein­hei­ten („Tasks“). Dabei werden Container-An­wen­dun­gen als so­ge­nann­te „Services“ auf beliebig viele Docker-Konten verteilt.

In der Docker-Ter­mi­no­lo­gie be­zeich­net der Begriff „Service“ eine abstrakte Struktur, mit der Sie Aufgaben de­fi­nie­ren, die im Cluster aus­ge­führt werden sollen. Jeder Service besteht aus einem Set einzelner Tasks, die jeweils in einem eigenen Container auf einem der Knoten im Cluster be­ar­bei­tet werden. Wenn Sie einen Service erstellen, bestimmen Sie, welches Container-Image diesem zugrunde liegt und welche Befehle in dem Container laufen, der auf Basis des Images aus­ge­führt wird. Docker Swarm un­ter­stützt zwei Modi, in denen Swarm-Services definiert werden: Wählen Sie zwischen re­pli­zier­ten und globalen Services.

  • Re­pli­zier­te Services: Bei einem re­pli­zier­ten Service handelt es sich um einen Task, der in einer be­nut­zer­de­fi­nier­ten Anzahl von Re­pli­ka­ten aus­ge­führt wird. Jedes Replikat ist eine Instanz des im Service de­fi­nier­ten Docker-Con­tai­ners. Re­pli­zier­te Services lassen sich skalieren, indem Nutzer weitere Replikate erzeugen. Ein Webserver wie NGINX lässt sich bei­spiels­wei­se je nach Bedarf mit einer einzigen Be­fehls­zei­le auf 2, 4 oder 100 Instanzen skalieren.
     
  • Globale Services: Wird ein Service im globalen Modus aus­ge­führt, startet jeder ver­füg­ba­re Knoten im Cluster einen Task für den ent­spre­chen­den Service. Wird dem Cluster ein neuer Knoten hin­zu­ge­fügt, teilt der Swarm-Manager diesem un­ver­züg­lich einen Task für den globalen Service zu. Globale Services eignen sich bei­spiels­wei­se für Mo­ni­to­ring-An­wen­dun­gen oder An­ti­vi­ren­pro­gram­me.

Ein zentrales An­wen­dungs­feld von Docker Swarm ist die Las­ten­ver­tei­lung. Im Swarm-Modus verfügt Docker über in­te­grier­te Load-Balancing-Funk­tio­nen. Führen Sie bei­spiel­wei­se einen NGINX-Webserver mit 4 Instanzen aus, verteilt Docker ein­ge­hen­de Anfragen in­tel­li­gent auf die zur Verfügung stehenden Webserver-Instanzen.

Docker Compose

Docker Compose er­mög­licht es Ihnen, Multi-Container-An­wen­dun­gen – so­ge­nann­te „Stacks“ – zu de­fi­nie­ren und wahlweise auf einem einzelnen Docker-Knoten oder im Cluster aus­zu­füh­ren. Dabei stellt das Tool Kom­man­do­zei­len­be­feh­le bereit, mit denen Sie den gesamten Le­bens­zy­klus Ihrer An­wen­dun­gen verwalten.

Docker definiert Stacks als Gruppen mit­ein­an­der ver­knüpf­ter Services, die Software-Ab­hän­gig­kei­ten teilen und gemeinsam or­ches­triert und skaliert werden. Ein Docker-Stack erlaubt es Ihnen, ver­schie­de­ne Funk­tio­na­li­tä­ten einer Anwendung in einer zentralen Datei – der docker-compose.yml –zu de­fi­nie­ren, aus dieser heraus zu starten, gemeinsam in einer iso­lier­ten Lauf­zeit­um­ge­bung aus­zu­füh­ren und zentral zu verwalten.

Je nachdem, auf welchem Be­triebs­sys­tem Sie Docker betreiben, muss Compose eventuell separat in­stal­liert werden.

Nutzen Sie die Container-Plattform Docker im Rahmen der Desktop-In­stal­la­tio­nen Docker for Mac oder Docker for Windows, ist Docker Compose bereits im Funk­ti­ons­um­fang enthalten. Das Gleiche gilt für die Docker-Toolbox, die für ältere Mac- oder Windows-Systeme zur Verfügung steht. Verwenden Sie Docker hingegen unter Linux oder auf dem Windows Server 2016, ist eine manuelle In­stal­la­ti­on des Tools er­for­der­lich.

Compose-In­stal­la­ti­on unter Linux

Öffnen Sie das Terminal und führen Sie folgenden Befehl aus, um die Compose-Bi­när­da­tei­en aus dem GitHub-Re­po­si­to­ri­um her­un­ter­zu­la­den:

sudo curl -L https://github.com/docker/compose/releases/download/1.18  
.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

Räumen Sie allen Benutzern das Recht ein, die Bi­när­da­tei­en aus­zu­füh­ren:

sudo chmod +x /usr/local/bin/docker-compose

Ob das Tool korrekt in­stal­liert wurde, testen Sie mit dem Befehl:

docker-compose -version

War die In­stal­la­ti­on er­folg­reich, erhalten Sie die Ver­si­ons­num­mer des Tools als Ter­mi­nal­aus­ga­be.

Compose-In­stal­la­ti­on unter Windows Server 2016 (nur Docker EE for Windows)

Starten Sie die Power­Shell als Ad­mi­nis­tra­tor und führen Sie den folgenden Befehl aus, um den Download der Compose-Bi­när­da­tei­en aus dem GitHub-Re­po­si­to­ri­um zu starten:

Invoke-WebRequest 
"https://github.com/docker/compose/releases/download/1.18.0/docker-compose-
Windows-x86_64.exe" -UseBasicParsing -OutFile
$Env:ProgramFiles\docker\docker-compose.exe

Starten Sie die aus­führ­ba­re Datei, um Docker Compose zu in­stal­lie­ren.

Hinweis

Weitere In­for­ma­tio­nen zu Docker-Tools wie Swarm und Compose finden Sie in unserem Artikel "Das Docker-Ökosystem: Die be­lieb­tes­ten Docker-Tools im Überblick".

Tutorial: Docker Swarm und Compose in der Anwendung

Um Multi-Container-Apps mit Docker im Cluster betreiben zu können, benötigen Sie einen Schwarm – ein Cluster von Docker-Engines im Swarm-Mode – sowie das Docker-Tool Compose.

Wie Sie mit Docker in wenigen Schritten zum eigenen Schwarm gelangen, erfahren Sie im ersten Teil unseres Tutorials. Das Erstellen von Multi-Container-Apps mit Docker Compose sowie das De­ploy­ment im Cluster sind Thema des zweitens Teils.

Tipp

Eine Ein­füh­rung zu Docker sowie eine Schritt-für-Schritt Anleitung zur In­stal­la­ti­on der Docker-Engine unter Linux finden Sie in unserem Docker-Tutorial.

Teil 1: Docker im Swarm-Mode

Bei einem Schwarm handelt es sich um eine beliebige Anzahl von Docker-Engines im Swarm-Mode. Jede Docker-Engine läuft auf einem separaten Knoten und bindet diesen ins Cluster ein.

Die Er­stel­lung von Docker-Clustern umfasst drei Schritte:

  1. Docker-Hosts be­reit­stel­len
  2. Swarm in­itia­li­sie­ren
  3. Docker-Hosts in den Schwarm einbinden
Hinweis

Al­ter­na­tiv kann eine einzelne Docker-Engine in einer lokalen Ent­wick­lungs­um­ge­bung in den Swarm-Mode versetzt werden. Man spricht in diesem Fall von einem Single-Node-Swarm.

Schritt 1: Docker-Hosts be­reit­stel­len

Für die Be­reit­stel­lung von Docker-Knoten empfiehlt es sich, auf das Pro­vi­sio­nie­rungs-Tool https://docs.docker.com/machine/overview/Docker Machine zu­rück­zu­grei­fen. Dieses ver­ein­facht die Im­ple­men­tie­rung von Docker-Hosts (auch „Do­cke­ri­zed hosts“, virtuelle Hosts inklusive Docker-Engine). Mit Docker Machine stellen Sie Konten für Ihren Schwarm auf be­lie­bi­ger In­fra­struk­tur bereit und verwalten diese per Remote. Treiber-Plug-ins für Docker Machine werden von diversen Cloud-Platt­for­men be­reit­ge­stellt. Dies reduziert den Aufwand für die Pro­vi­sio­nie­rung von Docker-Hosts bei Anbietern wie Amazon Web Services (AWS) oder Digital Ocean auf eine einfache Codezeile. Nutzen Sie folgenden Code, um einen Docker-Host (hier: docker-sandbox) in der In­fra­struk­tur von Digital Ocean zu erstellen.

$ docker-machine create --driver digitalocean --digitalocean-access-token xxxxx docker-sandbox

Bei AWS erstellen Sie einen Docker-Host (hier: aws-sandbox) mit folgendem Befehl:

$ docker-machine create --driver amazonec2 --amazonec2-access-key AKI******* --amazonec2-secret-key 8T93C******* aws-sandbox
Hinweis

Die Zeichen xxxxx und ****** fungieren als Platz­hal­ter für in­di­vi­du­el­le Zu­gangs­to­ken bzw. Schlüssel, die Sie über Ihren Kunden-Account beim je­wei­li­gen Anbieter ge­ne­rie­ren.

Schritt 2: Swarm in­itia­li­sie­ren

Haben Sie die ge­wünsch­te Anzahl vir­tu­el­ler Hosts für ihren Schwarm be­reit­ge­stellt, können Sie diese via Docker Machine verwalten und mit Docker Swarm zu einem Cluster zu­sam­men­fas­sen. Greifen Sie zunächst auf den Knoten zu, den sie als Swarm-Manager nutzen möchten. Docker Machine bietet dazu folgenden Befehl, um eine SSH-ver­schlüs­sel­te Ver­bin­dung zum Docker-Host auf­zu­bau­en.

docker-machine ssh MACHINE-NAME
Hinweis

Ersetzen Sie den Platz­hal­ter MACHINE-NAME durch den Namen des Docker-Hosts, auf den Sie zugreifen möchten.

Steht die Ver­bin­dung zum ge­wünsch­ten Knoten, nutzen Sie folgenden Befehl, um einen Schwarm zu in­itia­li­sie­ren.

docker swarm init [OPTIONS]

Der Befehl docker swarm init – wahlweise mit Optionen (siehe Do­ku­men­ta­ti­on) – definiert den aktuell aus­ge­wähl­ten Knoten als Swarm-Manager und erzeugt zwei zufällige Token: einen Manager-Token und einen Worker-Token.

Swarm initialized: current node (1ia0jlt0ylmnfofyfj2n71w0z) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-511cy9taxx5w47n80vopivx6ii6cjpi71vfncqhcfcawxfcb14-6cng4m8lhlrdfuq9jgzznre1p \
10.0.2.15:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Zudem generiert der Befehl docker swarm init eine Terminal-Ausgabe, die alle In­for­ma­tio­nen umfasst, die Sie benötigen, um Ihrem Schwarm weitere Konten hin­zu­zu­fü­gen.

Hinweis

In der Regel wird docker swarm init mit dem Flag --advertise-addr verwendet. Dieses gibt an, welche IP-Adresse für API-Zugriffe und Overlay-Net­wor­king verwendet werden soll. Wurde die IP-Adresse nicht explizit definiert, prüft Docker au­to­ma­tisch, unter welcher IP-Adresse das aus­ge­wähl­te System er­reich­bar ist, und wählt diese aus. Hat ein Knoten mehr als eine IP-Adresse, muss das ent­spre­chen­de Flag gesetzt werden. Sofern nichts anderes angegeben wurde, verwendet Docker den Port 2377.

Schritt 3: Docker-Hosts in den Schwarm einbinden

Nachdem Sie Ihren Schwarm mit dem aus­ge­wähl­ten Knoten als Swarm-Manager in­itia­li­siert haben, fügen Sie beliebig viele Knoten als Manager oder Worker hinzu. Nutzen Sie dazu den Befehl docker swarm join in Kom­bi­na­ti­on mit dem ent­spre­chen­den Token.

3.1 Worker-Knoten hin­zu­fü­gen: Möchten Sie Ihrem Schwarm einen Worker-Knoten hin­zu­fü­gen, greifen Sie via docker-machine auf den ent­spre­chen­den Knoten zu und führen folgenden Befehl aus:

docker swarm join [OPTIONS] HOST:PORT

Pflicht­be­stand­teil des Befehls docker swarm join ist das Flag --token, das den Token für den Zugang zum Cluster enthält.

docker swarm join \
--token SWMTKN-1-511cy9taxx5w47n80vopivx6ii6cjpi71vfncqhcfcawxfcb14-6cng4m8lhlrdfuq9jgzznre1p \
10.0.2.15:2377

Im aktuellen Beispiel enthält der Befehl den zuvor ge­ne­rier­ten Worker-Token sowie die IP-Adresse, unter der der Swarm-Manager zur Verfügung steht.

Haben sie den ent­spre­chen Token gerade nicht zur Hand, ermitteln sie diesen via docker swarm join-token worker.

3.2 Master-Knoten hin­zu­fü­gen: Möchten Sie Ihrem Schwarm einen weiteren Manager-Knoten hin­zu­fü­gen, ermitteln Sie zunächst den Manager-Token. Führen Sie dazu den Befehl docker swarm join-token manager auf dem Manager-Konten aus, auf dem sie den Schwarm in­itia­li­siert haben, und folgenden Sie der Anweisung auf dem Terminal.

Docker generiert einen Manager-Token, der in Kom­bi­na­ti­on mit dem Befehl docker swarm join und der von Ihnen de­fi­nier­ten IP-Adresse auf einem be­lie­bi­gen Docker-Host aus­ge­führt werden kann, um diesen als Manager in den Schwarm ein­zu­bin­den.

$ sudo docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-511cy9taxx5w47n80vopivx6ii6cjpi71vfncqhcfcawxfcb14-ed2ct6pg5rc6vp8bj46t08d0i \
10.0.2.15:2377

3.3 Übersicht aller Knoten im Schwarm: Eine Übersicht über alle in Ihren Schwarm ein­ge­bun­de­nen Knoten erhalten Sie, indem Sie den Ma­nage­ment-Befehl docker node ls auf einem Ihrer Manager-Knoten ausführen.

ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER
jhy7ur9hvzvwd4o1pl8veqms3    worker2   Ready   Active
jukrzzii3azdnub9jia04onc5    worker1   Ready   Active
1ia0jlt0ylmnfofyfj2n71w0z *  osboxes   Ready   Active        Leader

Manager-Knoten werden in der Übersicht als Leader ge­kenn­zeich­net.

Hinweis

Möchten Sie einen Knoten aus Ihrem Schwarm entfernen, loggen Sie sich in den ent­spre­chen Host ein und führen den Befehl docker swarm leave aus. Handelt es sich bei dem Knoten um einen Swarm-Manager, müssen Sie die Aus­füh­rung des Befehls mit dem Flag --force erzwingen.

Teil 2: Multi-Container-App im Cluster ausführen

Im ersten Teil unseres Docker-Tutorials haben Sie Docker-Hosts mit Docker Machine be­reit­ge­stellt und im Swarm-Mode als Cluster zu­sam­men­ge­fasst. Nun zeigen wir Ihnen, wie Sie ver­schie­de­ne Services mithilfe von Docker Compose als kompakte Multi-Container-Apps de­fi­nie­ren und im Cluster ausführen.

Die Be­reit­stel­lung von Multi-Container-Apps im Cluster erfolgt in fünf Schritten:

  1. Lokale Docker-Registry erstellen
  2. Multi-Container-App als Stack de­fi­nie­ren
  3. Multi-Container-App mit Compose testen
  4. Image in die Registry laden
  5. Stack im Cluster ausführen

Schritt 1: Lokale Docker-Registry als Service starten

Da ein Docker-Schwarm aus einer be­lie­bi­gen Anzahl von Docker-Engines besteht, lassen sich An­wen­dun­gen nur dann im Cluster betreiben, wenn alle be­tei­lig­ten Docker-Engines Zugriff auf das Image der Anwendung haben. Sie benötigen somit einen zentralen Service, der es Ihnen er­mög­licht, Images zu verwalten und im Cluster be­reit­zu­stel­len. Ein solcher Service wird Registry genannt.

Hinweis

Bei einem Image handelt es sich um ein kompaktes, aus­führ­ba­res Abbild einer Anwendung. Dieses be­inhal­tet zu­sätz­lich zum An­wen­dungs­code sämtliche Ab­hän­gig­kei­ten (Lauf­zeit­um­ge­bung, Bi­blio­the­ken, Um­ge­bungs­va­ria­blen und Kon­fi­gu­ra­ti­ons­da­tei­en), die Docker benötigt, um die ent­spre­chen­de Anwendung als Container aus­zu­füh­ren. Jeder Container ist somit eine Lauf­zeit­in­stanz eines Images.

1.1 Registry als Service im Cluster starten: Nutzen Sie den Befehl docker service create nach folgendem Schema, um einen lokalen Registry-Server als Service im Cluster zu starten.

docker service create --name registry --publish 5000:5000 registry:2

Der Befehl weist Docker an einen Service mit dem Namen registry zu starten, der an Port 5000 lauscht. Der erste Wert hinter dem Flag --publish gibt den Host-Port an, der zweite den Port des Con­tai­ners. Dem Service liegt das Image registry:2 zugrunde, das eine Im­ple­men­tie­rung der Docker Registry HTTP API V2 enthält und frei über das Docker-Hub bezogen werden kann.

1.2 Status des Registry-Service prüfen: Nutzen Sie den Befehl docker service ls, um den Status des soeben ge­star­te­ten Registry-Service zu über­prü­fen.

$ sudo docker service ls
ID            NAME      MODE        REPLICAS  IMAGE          PORTS
K2hq2ivnwuq4  registry  replicated  1/1       registry:2     *:5000->5000/tcp

Der Befehl docker service ls gibt Ihnen eine Liste alle laufenden Services in Ihrem Docker-Cluster aus.

1.3 Ver­bin­dung zur Registry mit cURL prüfen: Stellen Sie sicher, dass Sie via cURL auf Ihre Registry zugreifen können. Geben Sie dazu folgenden Befehl ein:

$ curl http://localhost:5000/v2/

Funk­tio­niert Ihre Registry wie be­ab­sich­tigt, sollte cURL folgende Ter­mi­nal­aus­ga­be liefern:

{}
Hinweis

Bei cURL handelt es sich um ein Kom­man­do­zei­len­pro­gramm, mit dem sich Web­adres­sen aufrufen und Dateien hoch- oder her­un­ter­la­den lassen. Mehr zu cURL erfahren Sie auf der Projekt-Website der Open-Source-Software: curl.haxx.se.

Schritt 2: Multi-Container-App erstellen und als Stack de­fi­nie­ren

Im nächsten Schritt erstellen Sie alle Dateien, die für das De­ploy­ment eines Stacks im Docker-Cluster benötigt werden, und legen diese in einem ge­mein­sa­men Pro­jekt­ver­zeich­nis ab.

2.1 Pro­jekt­ord­ner anlegen: Legen Sie ein Pro­jekt­ver­zeich­nis mit be­lie­bi­gem Namen an – bei­spiels­wei­se stackdemo.

$ mkdir stackdemo

Na­vi­gie­ren Sie in Ihr Pro­jekt­ver­zeich­nis.

$ cd stackdemo

Ihr Pro­jekt­ver­zeich­nis fungiert als Sam­mel­ord­ner für alle Dateien, die sie für den Betrieb Ihrer Multi-Container-App benötigen. Diese umfassen eine Datei mit dem Quellcode der App, eine Textdatei, in der Sie de­fi­nie­ren, welche Software Sie für den Betrieb Ihrer App vor­aus­set­zen, sowie eine Do­cker­file und eine Compose-File.

2.2 App erstellen: Erstellen Sie eine Python-Anwendung mit folgendem Inhalt und legen Sie diese unter dem Namen app.py im Pro­jekt­ver­zeich­nis ab.

from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'Hello World! I have been seen {} times.\n'.format(count)
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)

Bei der Bei­spiel­an­wen­dung app.py handelt es sich um eine einfache Web­an­wen­dung, deren Start­sei­te den Gruß „Hello World!“ zeigt, inklusive einer Angabe, wie oft die App auf­ge­ru­fen wurde. Die Grundlage bilden das quell­of­fe­ne Web-Framework Flask und die Open-Source-In-Memory-Datenbank Redis.

2.3 Vor­aus­set­zun­gen de­fi­nie­ren: Erstellen Sei eine Textdatei re­qui­re­ments.txt mit folgendem Inhalt und legen Sie diese im Pro­jekt­ver­zeich­nis ab.

flask
redis

In der re­qui­re­ments.txt de­fi­nie­ren Sie, auf welcher Software Ihre Anwendung aufbaut.

2.4 Do­cker­file erstellen: Erstellen Sie eine weitere Textdatei mit dem Namen Do­cker­file, fügen Sie folgenden Inhalt ein und legen Sie diese ebenfalls im Pro­jekt­ord­ner ab.

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

Die Do­cker­file enthält alle In­struk­tio­nen, die benötigt werden, um ein Image einer Anwendung zu erstellen. Bei­spiels­wei­se verweist die Do­cker­file auf die re­qui­re­ments.txt und gibt somit an, welche Software für den Betrieb der Anwendung in­stal­liert werden muss.

Die Do­cker­file im Beispiel er­mög­licht es, ein Image der Web­an­wen­dung app.py inklusive aller Vor­aus­set­zun­gen (Flask und Redis) zu erstellen.

2. 5 Compose-File erstellen: Erstellen Sie eine Kon­fi­gu­ra­ti­ons-Datei mit folgendem Inhalt und speichern Sie diese als docker-compose.yml.

version: '3'
services:
    web:
        image: 127.0.0.1:5000/stackdemo
        build: .
        ports:
            - "8000:8000"
    redis:
        image: redis:alpine

Die docker-compose.yml er­mög­licht es, ver­schie­de­ne Services mit­ein­an­der zu ver­knüp­fen und als Einheit gemeinsam aus­zu­füh­ren und zentral zu verwalten.

Hinweis

Die Compose-File wird in YAML notiert, einer ver­ein­fach­ten Aus­zeich­nungs­spra­che, die der Abbildung struk­tu­rier­ter Daten dient und in erster Linie in Kon­fi­gu­ra­ti­ons­da­tei­en verwendet wird. Bei Docker dient die docker-compose.yml der zentralen Kon­fi­gu­ra­ti­on von Services einer Multi-Container-Anwendung.

Im aktuellen Beispiel de­fi­nie­ren wir zwei Services: einen Web-Service und einen Redis-Service.

  • Web-Service: Grundlage des Web-Service ist ein Image, das auf Basis der von Ihnen er­stell­ten Do­cker­file im Ver­zeich­nis stackdemo erzeugt wird.
  • Redis-Service: Für den Redis-Service nutzen wir kein eigenes Image. Statt­des­sen greifen wir auf ein öf­fent­lich zu­gäng­li­ches Redis-Image (redis:alpine)zurück, das über das Docker-Hub zur Verfügung steht.

Schritt 3: Multi-Container-App mit Compose testen

Testen Sie die Multi-Container-App zunächst lokal, indem Sie diese auf Ihrem Manager-Knoten ausführen.

3.1 App starten: Nutzen Sie den Befehl docker-compose up in Kom­bi­na­ti­on mit dem Flag -d, um Ihr Stack zu starten. Das Flag aktiviert den „Detached mode“, wodurch alle Container im Hin­ter­grund aus­ge­führt werden. Ihr Terminal ist somit bereit für weitere Be­fehls­ein­ga­ben.

$ sudo docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.
Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.
To deploy your application across the swarm, use the bundle feature of the Docker experimental build.
More info:
https://docs.docker.com/compose/bundles
Creating network "stackdemo_default" with the default driver
Creating stackdemo_web_1
Creating stackdemo_redis_1

3.2 Status des Stacks prüfen: Führen Sie den Befehl docker-compose ps aus, um den Status Ihres Stacks zu über­prü­fen. Sie erhalten eine Ter­mi­nal­aus­ga­be, die in etwa folgendem Beispiel ent­spricht:

$ sudo docker-compose ps
    Name         Command         State          Ports     
-------------------------------------------------------------------------
stackdemo_redis_   docker-        Up             6379/tcp       
1            entrypoint.sh                            
             redis ...                                
stackdemo_web_1    python app.py    Up             0.0.0.0:8000->80 
                                       00/tcp

Der Befehl docker-compose ps gibt Ihnen eine Übersicht aller Container aus, die ihm Rahmen Ihrer Multi-Container-Anwendung gestartet wurden. Im aktuellen Beispiel umfasst die Liste zwei Container – jeweils einen für die Services Redis und Web.

3.3 Stack mit cURL testen: Testen Sie Ihr Stack, indem Sie das Kom­man­do­zei­len­pro­gramm cURL mit der Lo­kal­host­adres­se (localhost oder 127.0.0.1) ausführen.

$ curl http://localhost:8000
Hello World! I have been seen 1 times.
$ curl http://localhost:8000
Hello World! I have been seen 2 times.
$ curl http://localhost:8000
Hello World! I have been seen 3 times.

Al­ter­na­tiv lässt sich die Web­an­wen­dung im Web­brow­ser aufrufen.

3.4 App ab­schal­ten: Möchten Sie das Stack ab­schal­ten, führen Sie den Befehl docker-compose down mit dem Flag --volumes aus.

$ sudo docker-compose down --volumes
Stopping stackdemo_redis_1 ... done
Stopping stackdemo_web_1 ... done
Removing stackdemo_redis_1 ... done
Removing stackdemo_web_1 ... done
Removing network stackdemo_default

Schritt 4: Image in die Registry laden

Bevor Sie Ihre Multi-Container-App als verteilte Anwendung im Cluster ausführen können, müssen Sie alle dafür be­nö­tig­ten Images über den Registry-Service be­reit­stel­len. Im aktuellen Beispiel umfasst dies lediglich das selbst­er­stell­te Image des Web-Service (das Redis-Image steht über eine öf­fent­li­che Registry im Docker-Hub zur Verfügung).

Der Upload eines lokal er­stell­ten Images in eine zentrale Registry wird bei Docker „push“ genannt. Docker Compose stellt dafür den Befehl docker-compose push zur Verfügung. Führen Sie diesen in Ihrem Pro­jekt­ver­zeich­nis aus.

Alle in der docker-compose.yml auf­ge­führ­ten Images, die lokal erstellt wurden, werden in die Registry geladen.

$ sudo docker-compose push
Pushing web (127.0.0.1:5000/stackdemo:latest)...
The push refers to a repository [127.0.0.1:5000/stackdemo]
5b5a49501a76: Pushed
be44185ce609: Pushed
bd7330a79bcf: Pushed
c9fc143a069a: Pushed
011b303988d2: Pushed
latest: digest: sha256:a81840ebf5ac24b42c1c676cbda3b2cb144580ee347c07e1bc80e35e5ca76507 size: 1372

Im aktuellen Beispiel lädt docker-compose push das Image des Stacks stackdemo mit dem Tag latest in die lokale Registry unter 127.0.0.1:5000.

Schritt 5: Stack im Cluster ausführen.

Steht das Image Ihres Stacks über den lokalen Registry-Service zur Verfügung, kann die Multi-App-Anwendung im Cluster aus­ge­führt werden.

5.1 Stack im Cluster ausführen: Auch im Cluster führen Sie Stacks mit einer einfachen Kom­man­do­zei­le aus. Die Container-Plattform hält dazu folgenden Befehl bereit:

docker stack deploy [OPTIONS] STACK
Hinweis

Setzen Sie anstelle des Platz­hal­ters STACK den Namen des Stack-Images ein, das Sie ausführen möchten.

Führen Sie den Befehl docker stack deploy auf einem der Manager-Knoten ihres Schwarms aus.

$ sudo docker stack deploy --compose-file docker-compose.yml stackdemo
Ignoring unsupported options: build
Creating network stackdemo_default
Creating service stackdemo_web
Creating service stackdemo_redis

Das Flag --compose-file gibt den Pfad zur Compose-File an.

5.2 Status des Stacks abrufen: Nutzen Sie folgenden Befehl, um den Status ihres Stacks abzurufen:

docker stack services [OPTIONS] STACK

Docker gibt Ihnen die IDs, Namen, Modi, Replikate, Images sowie die Ports aller Services aus, die im Rahmen Ihres Stacks aus­ge­führt werden.

$ sudo docker stack services stackdemo
ID                  NAME                MODE                REPLICAS            IMAGE                             PORTS
cxyp7srukffy        stackdemo_web       replicated          1/1                 127.0.0.1:5000/stackdemo:latest   *:8000->8000/tcp
z0i2rtjbrj9s        stackdemo_redis     replicated          1/1                 redis:alpine

5.3 App mit cURL testen: Um Ihre Multi-Container-App zu testen, rufen Sie diese über die Localhost-Adresse an Port 8000 auf.

$ curl http://localhost:8000
Hello World! I have been seen 1 times.
$ curl http://localhost:8000
Hello World! I have been seen 2 times.
$ curl http://localhost:8000
Hello World! I have been seen 3 times.

Al­ter­na­tiv zu cURL lässt sich die App über den Web­brow­ser aufrufen. Nutzen Sie dazu die Localhost-Adresse oder die Adresse eines be­lie­bi­gen Knotens. Dank des internen Routing-Netzes können Sie auf jeden Knoten Ihres Schwarms an Port 8000 zugreifen, um zu Ihrer App wei­ter­ge­lei­tet zu werden.

5.4 Stack ab­schal­ten: Möchten Sie Ihr Stack ab­schal­ten, nutzen Sie den Befehl docker stack rm in Kom­bi­na­ti­on mit dem Namen des Stacks.

$ docker stack rm stackdemo
Removing service stackdemo_web
Removing service stackdemo_redis
Removing network stackdemo_default

5.5 Registry-Service ab­schal­ten: Möchten Sie den Registry-Service ab­schal­ten, nutzen Sie den Befehl docker service rm mit dem Namen des Service – hier: registry.

$ docker service rm registry
Fazit

Docker Swarm und Compose erweitern die Kern­funk­tio­na­li­tät der Container-Plattform um Tools, die es Ihnen er­mög­li­chen, komplexe An­wen­dun­gen mit geringem Ver­wal­tungs­auf­wand in ver­teil­ten Systemen zu betreiben. Der Markt­füh­rer im Bereich der Container-Vir­tua­li­sie­rung bietet Anwendern somit eine Kom­plett­lö­sung für die Container-Or­ches­trie­rung aus einer Hand. Beide Tools sind gut do­ku­men­tiert und werden in re­gel­mä­ßi­gen Abständen ak­tua­li­siert. Swarm und Compose po­si­tio­nie­ren sich damit als gute Al­ter­na­ti­ve zu eta­blier­ten Dritt­an­bie­ter-Werk­zeu­gen wie Ku­ber­netes oder Panamax.

Zum Hauptmenü