Wann wird Docker-Compose verwendet und wann wird Docker-Swarm verwendet?

81

Ich versuche die Unterschiede oder Ähnlichkeiten zwischen Docker-Compose und Docker-Swarm zu verstehen .

Durch das Lesen der Dokumentation habe ich verstanden, dass Docker-Compose einen Mechanismus bietet, um verschiedene Container miteinander zu verbinden und als ein einziger Dienst zusammenzuarbeiten (ich vermute, es verwendet dieselbe Funktionalität wie der Befehl --link, der zum Verknüpfen zweier Container verwendet wird).

Mein Verständnis von Docker-Schwarm ist auch, dass Sie damit einen Cluster verschiedener Docker-Hosts verwalten können , auf denen jeweils mehrere Container-Instanzen einiger Docker-Images ausgeführt werden. Wir könnten Verbindungen als Overlay-Netzwerke zwischen verschiedenen Containern im Schwarm definieren (selbst wenn sie sich über zwei Docker-Hosts im Schwarm erstrecken), um sie als Einheit zu verbinden.

Ich versuche zu verstehen, ob Docker-Swarm Docker-Compose erfolgreich abgeschlossen hat und Overlay-Netzwerke die neue (empfohlene) Methode zum Verbinden von Containern sind.

Oder ist Docker-Compose immer noch ein integraler Bestandteil der gesamten Docker-Familie, und es wird erwartet und empfohlen, damit Container zu verbinden, um zusammenzuarbeiten. Wenn ja, funktioniert Docker-Compose mit Containern über verschiedene Knoten im Schwarm?

Oder dienen Overlay-Netzwerke zum Verbinden von Containern zwischen verschiedenen Hosts im Schwarm und Docker-Compose zum Erstellen interner Links?

Außerdem sehe ich auch, dass in der Docker-Dokumentation erwähnt wird, dass --links nicht mehr empfohlen werden und bald veraltet sein werden.

Ich bin ein bisschen verwirrt???

Danke vielmals!

Shabirmean
quelle
9
Beantwortet keine der Antworten Ihre Frage? Wenn dies der Fall ist, aktivieren Sie das Kontrollkästchen, um eine davon als Antwort zu akzeptieren.
JoeG

Antworten:

102

Es wird wahrscheinlich helfen, mit ein paar Definitionen zu beginnen:

  • Docker-Compose : Befehl zum Konfigurieren und Verwalten einer Gruppe verwandter Container. Es ist ein Frontend zu denselben APIs, die von der Docker-CLI verwendet werden, sodass Sie das Verhalten mit Befehlen wie reproduzieren können docker run.
  • docker-compose.yml : Definitionsdatei für eine Gruppe von Containern, die von Docker-Compose und jetzt auch vom Schwarmmodus verwendet wird.
  • Schwarmmodus : Wird verwendet, um eine Gruppe von Docker-Engines als eine Einheit zu verwalten und Orchestrierung bereitzustellen (wobei ständig versucht wird, Unterschiede zwischen dem aktuellen Status und dem Zielstatus zu korrigieren).
  • Service : Ein oder mehrere Container für dasselbe Image und dieselbe Konfiguration innerhalb von Swarm. Mehrere Container bieten Skalierbarkeit.
  • Stack : Ein oder mehrere Dienste innerhalb eines Schwarms. Diese können mithilfe einer DAB- oder einer docker-compose.yml-Datei definiert werden.
  • Brückennetzwerk : Netzwerk, das von einer einzelnen Docker-Engine verwaltet wird, in der mehrere Container miteinander kommunizieren können. Möglicherweise werden mehrere Netzwerke von einer Engine verwaltet, und Container können an null oder mehr Netzwerke angehängt werden.
  • Overlay-Netzwerk : Ähnlich wie ein Bridge-Netzwerk, jedoch über mehrere Docker-Engines hinweg. Diese erfordern einen Schlüssel- / Wertspeicher, um ihren Status beizubehalten. Der Schwarmmodus bietet dies, aber wenn der Schwarmmodus deaktiviert ist, können Sie auch etcd, consul oder zookeeper verwenden.
  • Links : Eine Methode zum Verbinden von Containern vor dem überbrückten Netzwerk. Die Verwendung wird nicht mehr empfohlen.
  • klassischer Schwarm : Ein Vorgänger des integrierten Schwarmmodus, der als Container ausgeführt wird, ermöglicht, dass mehrere Engines als eine angezeigt werden, bietet jedoch keine Orchestrierung oder enthält keinen eigenen k / v-Speicher.

Um die Fragen zu beantworten:

Hat Docker-Swarm Docker-Compose- und Overlay-Netzwerke erfolgreich abgeschlossen? Ist dies die neue (empfohlene) Methode zum Verbinden von Containern?

Oder ist Docker-Compose immer noch ein integraler Bestandteil der gesamten Docker-Familie, und es wird erwartet und empfohlen, damit Container zu verbinden, um zusammenzuarbeiten. Wenn ja, funktioniert Docker-Compose mit Containern über verschiedene Knoten im Schwarm?

Sie bieten unterschiedliche Funktionen und erfüllen weiterhin beide einen Zweck. Docker-Compose kann keine Container im Schwarmmodus starten, aber eine neuere Version der Datei docker-compose.yml (Version 3) kann verwendet werden, um einen Stapel direkt im Schwarmmodus zu definieren, ohne Docker-Compose selbst zu verwenden. Docker-Compose wird benötigt, um Container außerhalb des Schwarmmodus, auf einer einzelnen Docker-Engine oder mit klassischem Schwarm zu verwalten.

Oder dienen Overlay-Netzwerke zum Verbinden von Containern zwischen verschiedenen Hosts im Schwarm und Docker-Compose zum Erstellen interner Links?

Außerdem sehe ich auch, dass in der Docker-Dokumentation erwähnt wird, dass --links nicht mehr empfohlen werden und bald veraltet sein werden.

Docker-Compose ab Version 2 der yml-Datei verbindet standardmäßig mehrere Container mit einem neuen überbrückten Netzwerk pro Projekt (das Projekt verwendet standardmäßig den Verzeichnisnamen). Bei klassischem Schwarm wird standardmäßig ein Overlay-Netzwerk verwendet, das einen externen k / v-Speicher verwendet. Und mit einem Schwarmmodus-Stack wäre dies ein Overlay-Netzwerk.

Die Verwendung von Docker-Netzwerken ist die bevorzugte Methode, um Container miteinander kommunizieren zu lassen. Sie möchten ein Netzwerk pro Gruppe von Containern, die Sie vom Rest Ihrer Docker-Umgebung isolieren möchten. docker-compose automatisiert diese Netzwerkerstellung, aber Sie können dies auch über die Befehlszeile mit tun docker networks create.

Die Verknüpfung wurde weitgehend durch Docker-Netzwerke mit integrierter DNS-Erkennung ersetzt. Wenn Sie Links aus Ihrer docker-compose.yml entfernen, müssen Sie diese möglicherweise durch einen depends_onAbschnitt ersetzen, um die Startreihenfolge des Containers zu erzwingen. Ansonsten gibt es nur sehr wenige Szenarien, in denen das Verknüpfen sinnvoll ist und die gesamte Verwendung, die ich gesehen habe, von jemandem stammt, der veraltete Dokumentation verfolgt.

BMitch
quelle
3
Das ist hilfreich. Könnten Sie bitte definieren DAB?
Matthew James Briggs
3
Der DAB war ein experimentelles Dateiformat, das nie an Bedeutung gewonnen hat. Es ist jetzt im Grunde eine v3 docker-compose.yml Datei. docs.docker.com/compose/bundles/#bundle-file-format
BMitch
22

Compose oder Swarm oder Swarm Overlay-Netzwerke

Sie werden feststellen, dass Sie alle oben genannten Funktionen verwenden müssen, wenn Sie etwas anderes als eine Demo auf Ihrem Laptop usw. ausführen.

Ich habe absichtlich Schwarm- und Schwarm-Overlay-Netzwerke getrennt, da Sie nicht beide verwenden müssen, aber Sie können kein Overlay-Netzwerk erhalten, ohne einen Schwarm darunter zu haben.

Compose dient zum Zusammenführen mehrerer Container. Jetzt macht es Sinn, dass sie miteinander verwandt sind, obwohl dies möglicherweise nicht der Fall ist. Nehmen wir jedoch einen typischen Fall an, in dem die Container für Dienste bestimmt sind, die miteinander in Beziehung stehen. Dann möchten Sie, dass sie auf irgendeine Weise miteinander kommunizieren, aber dennoch steuern, wie sie über Netzwerke miteinander kommunizieren. Nehmen Sie zum Beispiel eine dreistufige App mit einem Webserver, einem App-Server und einer Datenbank. Angenommen, alle drei Komponenten sind dockerisiert und Sie verwenden compose, um sie zusammenzuführen, anstatt sie auszuführendocker run..dreimal mit unterschiedlichen Parametern usw. Alle drei werden angezeigt, aber Sie möchten steuern, wie sie miteinander verbunden sind. Sie möchten, dass der Webserver mit dem App-Server kommunizieren kann, nicht jedoch direkt mit der Datenbank. Und Sie möchten, dass der App-Server den DB-Server-Container spricht (pingt) und auch den Webserver pingt. Alle Verbindungen sind bidirektional, jedoch nur auf die Dienste beschränkt, mit denen Sie kommunizieren möchten. Für eine solche Anordnung würden Sie normalerweise zwei Netzwerke einrichten - sagen wir frontendund backend. Die Web- und App-Container sind mit dem Frontend-Netzwerk verbunden. Die App- und DB-Container sind mit dem Backend-Netzwerk verbunden. Da es kein gemeinsames Netzwerk zwischen dem Datenbank- und dem Webcontainer gibt, können sie sich nicht berühren (pingen), was Ihre Absicht ist.

Wenn Sie nun möchten, dass diese drei Dienste auf Ihrem Cluster von Hunderten von Computern ausgeführt werden können und Sie auch über sie hinweg skalieren möchten, benötigen Sie ein Netzwerk, das mehrere Hosts umfasst. Hier kommt das Overlay-Networking (im Schwarm) ins Spiel. Overlay-Netzwerke sind nichts anderes als Multi-Host-Netzwerke, die über die VxLAN-Technologie aufgebaut sind. Sie müssen nicht über VxLAN Bescheid wissen, außer dass es sich um eine Standardnetzwerktopologie handelt, die in fast allen modernen Netzwerkinfrastrukturen unterstützt wird.

Ich hoffe das klärt sich.

Edit: Ich habe nicht gesehen, dass du schon eine Antwort hast!

Anoop
quelle
1
Vielen Dank, dass Sie @Anoop. Ich denke, es ist richtig, wenn ich sage, dass Compose und Swarm beide eine .yaml- basierte Dienstbeschreibung zum Starten von Diensten verwenden und beide benutzerdefinierte Netzwerke verwenden, die zum Verbinden dieser Dienste erstellt wurden. Der einzige Unterschied besteht darin, dass Compose für eine Reihe von Containern gilt, die auf einem einzelnen Docker-Host ausgeführt werden, und Swarm für eine Multi-Host-Plattform.
Shabirmean
Ja, aber Sie können mischen und anpassen, was bedeutet, dass Sie dieselbe Compose-Datei verwenden können, um auf einen Schwarmcluster anstatt auf einen einzelnen Docker-Host abzuzielen. Auf diese Weise ist es äußerst flexibel.
Anoop
8

Ich denke, Sie haben das meiste Verständnis dafür, was jedes ist, aber einige Anpassungen sind erforderlich.

Docker-Compose ist richtig, wenn Sie Anwendungen mit mehreren Containern aufrufen. Früher haben Sie docker run ..jeden Container gestartet. Normalerweise können moderne Anwendungen, die das Paradigma der Mikrodienste umfassen, aus Dutzenden von Diensten bestehen, und die Verwendung docker run ..wird sehr bald sehr mühsam. Mit Docker-Compose können Sie daher alle Container und ihre Eigenschaften sowie deren Verbindung als yamloder als jsonDatei ausdrücken, um sie einfacher zu verwalten.

Docker-Compose ist also der Container-Orchestrierungs-Teil im Docker-Ökosystem.

Links sind unterschiedlich, sie sind nur ein Teil von Docker-Compose oder docker runBefehlen und werden abgelehnt, software defined networksfür die overlay networksnur einer von ihnen ist.

Schwarm ist die Planungskomponente im Docker. Was ist Zeitplanung? Es ist nichts anderes als herauszufinden, wo Ihre Container in Ihrem Cluster von Docker-Hosts "platziert" werden sollen. Sie können einen Cluster von Hunderten von Servern und Hunderte von Containern haben, die jeweils einen Dienst für ein Dutzend verschiedener Anwendungen kapseln. Wie sollten diese Container nun auf Ihren Cluster von Hunderten von Servern verteilt werden, sollten einige Container nur auf bestimmten Hosts platziert werden, weil sie bestimmte Kriterien erfüllen, oder sollten sie näher an anderen Containern sein (oder nicht), die irgendwie verwandt sind ... All dies ist Teil der Planungskomponente, die von Docker Swarm ausgeführt wird.

Ich schlage vor, dass Sie die Dokumentation zu den ersten Schritten auf docker.com hier durchgehen: https://docs.docker.com/engine/getstarted-voting-app/

Anoop
quelle
Vielen Dank. Ich hatte dieses Tutorial gemacht. Ich versuche herauszufinden, ob es eine spezifische Empfehlung der Docker-Entwickler selbst gibt, was zum Verbinden eng verwandter Container verwendet werden muss - zum Erstellen oder Schwärmen von Overlay-Netzwerken . Das Dilemma, das ich habe, ist, dass die Idee, Container über ein Netzwerk zu verbinden , nicht die gleiche zu sein scheint wie das Verbinden von Containern durch so etwas wie Compose (oder sind sie gleich ???). Ist das Binden wie Container sicherer als eine Verbindung im Overlay-Netzwerk-Stil?
Shabirmean