Clustering mit Docker Swarm

Dieses Tutorial führt Java-Entwickler in Docker Swarm ein. Sie erfahren, warum so viele Unternehmensshops die containergesteuerte Entwicklung über Docker übernommen haben und warum Clustering eine wichtige Technik für die Arbeit mit Docker-Containern ist. Außerdem erfahren Sie, wie zwei beliebte Docker-Clustering-Technologien - Amazon ECS und Docker Swarm - miteinander verglichen werden, und erhalten eine Kurzanleitung zur Auswahl der richtigen Lösung für Ihren Shop oder Ihr Projekt. Das Lernprogramm schließt mit einer praktischen Demonstration der Verwendung von Docker Swarm zum Entwickeln und Verwalten eines Unternehmensclusters mit zwei Knoten.

Lesen Sie jetzt: Container-verwaltete Entwicklung mit Docker

Es ist eine gute Idee, sich mit der Entwicklung von Containern und den Docker-Grundlagen vertraut zu machen, bevor Sie in Docker Swarm eintauchen. Im Folgenden finden Sie eine Übersicht. Weitere Informationen finden Sie in meiner Einführung in Docker. Entwickler, die mit diesen Grundlagen vertraut sind, sollten mit dem nächsten Abschnitt fortfahren.

Was ist mit Docker los?

Docker ist eine offene Plattform zum Erstellen, Versenden und Ausführen verteilter Anwendungen. Dockerisierte Anwendungen können lokal auf dem Computer eines Entwicklers ausgeführt und für die Produktion in einer Cloud-basierten Infrastruktur bereitgestellt werden. Docker eignet sich für eine schnelle Entwicklung und ermöglicht eine kontinuierliche Integration und Bereitstellung wie kaum eine andere Technologie. Aufgrund dieser Funktionen ist es eine Plattform, die jeder Entwickler verwenden sollte.

Es ist wichtig zu verstehen, dass Docker eine Containerisierungstechnologie und keine Virtualisierungstechnologie ist. Während eine virtuelle Maschine ein vollständiges Betriebssystem enthält und von einem schweren Prozess verwaltet wird, der als Hypervisor bezeichnet wird, ist ein Container sehr leicht und in sich geschlossen. Jeder Server führt einen Daemon-Prozess aus, der als Docker-Engine bezeichnet wird und Container ausführt und Betriebssystemaufrufe im Container in native Aufrufe des Host-Betriebssystems übersetzt. Ein Container, der einer virtuellen Maschine entspricht und nur viel kleiner ist, hostet Ihre Anwendung, die Laufzeitumgebung und ein Barebone-Betriebssystem. Container werden normalerweise auf virtuellen Maschinen ausgeführt. Während der Start einer virtuellen Maschine Minuten dauern kann, kann ein Container dies in Sekunden erledigen.

Abbildung 1 zeigt den Unterschied zwischen einem Container und einer virtuellen Maschine.

Docker-Container sind in sich geschlossen, dh sie enthalten alles, was sie zum Ausführen Ihrer Anwendung benötigen. Für eine Webanwendung, die in Tomcat ausgeführt wird, enthält der Container beispielsweise Folgendes:

  • Eine WAR-Datei
  • Kater
  • JVM
  • Das Basisbetriebssystem

Abbildung 2 zeigt die Architektur einer Web-App in einem Docker-Container.

Im Fall von Docker führt jede virtuelle Maschine einen Dämonprozess aus, der als Docker-Engine bezeichnet wird . Sie erstellen Ihre Anwendung, z. B. Ihre WAR-Datei, und erstellen dann eine entsprechende Docker-Datei . Eine Docker-Datei ist eine Textdatei, in der beschrieben wird, wie ein Docker-Image erstellt wird. Hierbei handelt es sich um eine Binärdatei, die alles enthält, was zum Ausführen der Anwendung erforderlich ist. Als Beispiel könnten Sie eine Docker-Datei aus einem Tomcat-Basisimage erstellen, das ein Linux-Basisbetriebssystem, Java-Laufzeit und Tomcat enthält. Nachdem Docker angewiesen wurde, eine WAR-Datei in das Webanwendungsverzeichnis von Tomcat zu kopieren, wird die Docker-Datei in ein Docker-Image kompiliert, das aus dem Basisbetriebssystem, JVM, Tomcat und Ihrer WAR-Datei besteht. Sie können das Docker-Image lokal ausführen, es wird jedoch letztendlich in einem Docker-Repository veröffentlicht, wie DockerHub.

Während ein Docker-Image eine Binärversion Ihres Containers ist, wird eine Laufzeitinstanz eines Docker-Images als Docker-Container bezeichnet . Docker-Container werden von Ihrer Docker-Engine ausgeführt . Der Computer, auf dem Ihre Docker-Engine ausgeführt wird, wird als Docker-Host bezeichnet . Dies kann je nach Umfang Ihrer Anwendung Ihr lokaler Laptop oder eine Cloud-Plattform sein.

Die Grundlagen in diesem Abschnitt bieten eine Grundlage für das Verständnis, warum Clustering eine wichtige Ergänzung Ihres Docker-Toolkits ist. Weitere Informationen finden Sie in meiner Einführung zu Docker.

Clustering Docker

Die meisten Entwickler, die mit Docker beginnen, erstellen eine Docker-Datei und führen sie lokal auf einem Laptop aus. Container-verwaltete Entwicklung bietet jedoch mehr als das lokale Ausführen einzelner Docker-Container. Die Supermacht von Docker ist die Fähigkeit, Container dynamisch nach oben oder unten zu skalieren. In der Produktion bedeutet dies, Docker in einem Cluster auf einer Vielzahl von Maschinen oder virtuellen Maschinen auszuführen.

Es stehen verschiedene Docker-Clustering-Technologien zur Verfügung. Die beiden beliebtesten sind jedoch Amazon EC2 Container Service (ECS) und Docker Swarm.

Amazon ECS

Die Docker-Clustering-Technologie von Amazon nutzt Amazon Web Services (AWS), um einen Cluster virtueller Maschinen zu erstellen, auf denen Docker-Container ausgeführt werden können. Ein ECS-Cluster besteht aus verwalteten ECS-Instanzen , bei denen es sich um EC2-Instanzen mit einer Docker-Engine und einem ECS-Agenten handelt. ECS verwendet eine Autoscaling-Gruppe, um die Anzahl der Instanzen basierend auf CloudWatch-Richtlinien zu erweitern und zu verkleinern. Wenn beispielsweise die durchschnittliche CPU-Auslastung der ECS-Instanzen zu hoch ist, können Sie ECS auffordern, weitere Instanzen zu starten, bis zur maximalen Anzahl von Instanzen, die in der Autoscaling-Gruppe definiert sind.

Docker-Container werden von einem ECS-Dienst verwaltet und anhand der Rechenkapazität (CPU) und des Arbeitsspeichers konfiguriert, die der Container ausführen muss. Dem ECS-Dienst ist ein Elastic Load Balancer (ELB) zugeordnet. Beim Starten und Stoppen von Docker-Containern registriert und registriert der ECS-Dienst diese Container bei der ELB. Sobald Sie die Regeln für Ihren Cluster eingerichtet haben, stellt Amazon ECS sicher, dass die gewünschte Anzahl von Containern ausgeführt wird und auf diese Container alle über die ELB zugegriffen werden kann. Abbildung 3 zeigt eine allgemeine Ansicht von Amazon ECS.

Es ist wichtig, zwischen ECS- Instanzen und Aufgaben zu unterscheiden . Der ECS-Cluster verwaltet Ihre ECS-Instanzen. Hierbei handelt es sich um spezielle EC2-Instanzen, die in einer Autoscaling-Gruppe ausgeführt werden. Der ECS-Dienst verwaltet die Aufgaben, die einen oder mehrere Docker-Container enthalten können und die im Cluster ausgeführt werden. Eine ELB befindet sich vor den ECS-Instanzen, auf denen Ihre Docker-Container ausgeführt werden, und verteilt die Last auf Ihre Docker-Container. Die Beziehung zwischen ECS-Tasks und Docker-Containern besteht darin, dass eine Taskdefinition dem ECS-Service mitteilt, welche Docker-Container ausgeführt werden sollen, und die Konfiguration dieser Container. Der ECS-Dienst führt die Aufgabe aus, mit der die Docker-Container gestartet werden.

Siehe meine Einführung in Amazon ECS auf VMTurbo.com.

Hafenschwarm

Mit Docker Swarm, der nativen Clustering-Technologie von Docker, können Sie mehrere Docker-Container in einem Cluster virtueller Maschinen ausführen. Docker Swarm definiert einen Manager- Container, der auf einer virtuellen Maschine ausgeführt wird, die die Umgebung verwaltet, Container für die verschiedenen Agenten bereitstellt und den Containerstatus und die Bereitstellungsinformationen für den Cluster meldet.

Beim Ausführen eines Docker-Schwarms ist der Manager die primäre Schnittstelle zu Docker. Agenten sind "Docker-Maschinen", die auf virtuellen Maschinen ausgeführt werden, die sich beim Manager registrieren und Docker-Container ausführen. Wenn der Client eine Anforderung zum Starten eines Containers an den Manager sendet, findet der Manager einen verfügbaren Agenten, um ihn auszuführen. Es wird ein am wenigsten genutzter Algorithmus verwendet, um sicherzustellen, dass der Agent, der die geringste Anzahl von Containern ausführt, den neu angeforderten Container ausführt. Abbildung 4 zeigt eine Beispielkonfiguration für Docker Swarm, die Sie im nächsten Abschnitt entwickeln werden.

Der Managerprozess kennt alle aktiven Agenten und die Container, die auf diesen Agenten ausgeführt werden. Wenn die virtuellen Maschinen des Agenten gestartet werden, registrieren sie sich beim Manager und stehen dann zum Ausführen von Docker-Containern zur Verfügung. Das Beispiel in Abbildung 4 enthält zwei Agenten (Agent1 und Agent2), die beim Manager registriert sind. Jeder Agent führt zwei Nginx-Container aus.

Docker Swarm gegen Amazon ECS

Dieser Artikel enthält Docker Swarm, aber es ist nützlich, Containertechnologien zu vergleichen. Während Amazon ECS eine gut entwickelte schlüsselfertige Lösung bietet, können Sie mit Docker Swarm mehr von Ihrer eigenen Infrastruktur konfigurieren. Beispielsweise verwaltet Amazon ECS sowohl Container als auch Load Balancer, während Sie in Docker Swarm eine Load Balancing-Lösung wie Cisco LocalDirector, F5 BigIp oder einen Apache- oder Nginx-Softwareprozess konfigurieren.

Wenn Sie Ihre App bereits in AWS ausführen, erleichtert ECS das Ausführen und Verwalten von Docker-Containern erheblich als eine externe Lösung. Als AWS-Entwickler nutzen Sie wahrscheinlich bereits Autoscaling-Gruppen, ELBs, VPCs (Virtual Private Clouds), IAM-Rollen und -Richtlinien (Identity and Access Management) usw. ECS lässt sich gut in alle integrieren, also ist es der richtige Weg. Wenn Sie jedoch nicht in AWS ausgeführt werden, ist Docker Swarm aufgrund seiner engen Integration in die Docker-Tools eine gute Wahl.

AWS und Docker Swarm in der Hybrid Cloud

Amazon Web Services can be configured for very high availability, scalability, and performance, which is probably why it services 25% of all internet traffic, including the massively scaled Netflix services infrastructure. Recently, however, there's been a push toward hybrid cloud environments. A hybrid cloud is a cloud in which part of the application, or sometimes a full copy of it, runs in a public cloud like AWS, and part of it runs in a private cloud. A popular option in this case is to run OpenStack in a private data center.

A hybrid cloud is a safe strategy for a company that is moving some or all operations to the cloud, but needs to go slowly and gain confidence in public clouds. When you choose a hybrid cloud option, you need to create an abstraction layer on top of the underlying cloud technologies, which means you can just as easily deploy to Docker Swarm running on OpenStack in your own data center as you can to ECS running on AWS. Tools like Chef and Puppet can help by allowing you to define your environments abstractly, delegating to them to handle many of the differences between the different environments.

Getting Started with Docker Swarm

In the previous section you saw a sample architecture for a two-node Docker Swarm cluster. Now you'll develop that cluster using two Nginx Docker container instances. Nginx is a popular web server, publicly available as a Docker image on DockerHub. Because this article is focused on Docker Swarm, I wanted to use a Docker container that it quick and easy to start and straightforward to test. You are free to use any Docker container you wish, but for illustrative purposes I chose Nginx for this example.

My introduction to Docker includes a guide to setting up Docker in your development environment. If you've installed and setup the Docker Toolbox then it includes everything that you need to run Docker Swarm. See Docker's official documentation for further setup instructions.

Docker Swarm on the command line

Wenn Sie zuvor Docker verwendet haben, sind Sie mit der Verwendung der dockerBefehlszeile zum Starten und Stoppen von Containern vertraut . Wenn Sie Docker Swarm verwenden, werden Sie dockerfür handeln docker-machine. Docker Machine ist in der Docker-Dokumentation wie folgt definiert:

Docker Machine ist ein Tool, mit dem Sie Docker Engine auf virtuellen Hosts installieren und die Hosts mit Docker-Machine-Befehlen verwalten können. Mit Machine können Sie Docker-Hosts auf Ihrem lokalen Mac oder Ihrer Windows-Box, in Ihrem Unternehmensnetzwerk, in Ihrem Rechenzentrum oder bei Cloud-Anbietern wie AWS oder Digital Ocean erstellen. Mit Docker-Machine-Befehlen können Sie einen verwalteten Host starten, überprüfen, stoppen und neu starten, den Docker-Client und -Dämon aktualisieren und einen Docker-Client für die Kommunikation mit Ihrem Host konfigurieren.

If you've installed Docker then your installation already includes Docker Machine. To get started with Docker Swarm, start Docker and open a terminal on your computer. Execute the following docker-machine ls command to list all the VMs on your local machine:

 $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM default * virtualbox Running tcp://192.168.99.100:2376 

If you've only run Docker from your local machine, then you should have the default Docker virtual machine running with an IP address of 192.168.99.100. To conserve resources on your local machine you can stop this virtual machine by executing: docker-machine stop default.

Create a swarm

A Docker swarm consists of two or virtual machines running Docker instances. For this demo, we'll create three new virtual machines: manager, agent1, and agent2. Create your virtual machines using the docker-machine create command:

$ docker-machine create -d virtualbox manager $ docker-machine create -d virtualbox agent1 $ docker-machine create -d virtualbox agent2 

Der docker-machine createBefehl erstellt eine neue "Maschine". Wenn Sie das -dArgument übergeben, können Sie den Treiber angeben, der zum Erstellen des Computers verwendet werden soll. Lokal laufen, das sollte sein virtualbox. Der erste erstellte Computer ist der manager, auf dem der Managerprozess gehostet wird. Die letzten beiden Computer agent1und agent2sind die Agentencomputer, auf denen die Agentenprozesse gehostet werden.

Zu diesem Zeitpunkt haben Sie die virtuellen Maschinen erstellt, aber noch nicht den tatsächlichen Swarm-Manager oder die Agenten. Führen Sie den folgenden docker-machine lsBefehl aus, um die virtuellen Maschinen und ihren Status anzuzeigen :

 $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS agent1 - virtualbox Running tcp://192.168.99.101:2376 v1.11.1 agent2 - virtualbox Running tcp://192.168.99.102:2376 v1.11.1 default - virtualbox Stopped Unknown manager * virtualbox Running tcp://192.168.99.100:2376 v1.11.1