Wie verbinde ich Docker-Dienste zwischen Hosts?


115

Mit Docker können Server aus mehreren Containern über Links und Service Discovery miteinander verbunden werden . Soweit ich jedoch sehen kann, ist diese Serviceerkennung hostlokal. Ich möchte einen Dienst implementieren, der andere Dienste verwendet, die auf einem anderen Computer gehostet werden.

Es gab verschiedene Ansätze zur Lösung dieses Problems in Docker, z. B. CoreOSjumpers , hostlokale Dienste, die im Wesentlichen einen Proxy für den anderen Computer darstellen, und eine ganze Reihe von Github-Projekten zur Verwaltung von Docker-Bereitstellungen, die anscheinend versucht haben, diesen Anwendungsfall zu unterstützen .

Angesichts des Entwicklungstempos ist es schwierig, den aktuellen Best Practices zu folgen. Daher ist meine Frage im Wesentlichen:

  1. Was (falls vorhanden) ist die derzeit vorherrschende Methode zum Verknüpfen zwischen Hosts in Docker und
  2. Gibt es Pläne, diese Funktionalität direkt im Docker-System zu unterstützen?

Antworten:


58

Aktualisieren

Docker hat kürzlich ein neues Tool namens Swarm for Docker Orchestration angekündigt .

Mit Swarm können Sie mehreren Docker-Dämonen "beitreten": Sie erstellen zuerst einen Schwarm, starten einen Schwarmmanager auf einem Computer und lassen Docker-Dämonen den Schwarmmanager mit der Kennung des Schwarms "verbinden". Der Docker-Client stellt eine Verbindung zum Schwarmmanager her, als wäre er ein normaler Docker-Server.

Wenn ein Container mit Swarm gestartet wird, wird er automatisch einem freien Knoten zugewiesen, der alle definierten Einschränkungen erfüllt. Das folgende Beispiel stammt aus dem Blog-Beitrag:

$ docker run -d -P -e constraint:storage=ssd mysql

Eine der unterstützten Einschränkungen besteht darin "node", dass Sie einen Container an einen bestimmten Hostnamen anheften können. Der Schwarm löst auch Verbindungen zwischen Knoten auf.

Bei meinen Tests hatte ich den Eindruck, dass Swarm noch nicht sehr gut mit Volumes an einem festen Ort funktioniert (oder zumindest der Prozess der Verknüpfung nicht sehr intuitiv ist), daher ist dies zu beachten.

Swarm befindet sich jetzt in der Beta-Phase.


Bis vor kurzem war das Ambassador-Muster der einzige Docker-native Ansatz für die Erkennung von Remote-Host-Diensten. Dieses Muster kann weiterhin verwendet werden und erfordert keine Magie über Docker hinaus, da das Muster aus einem oder mehreren zusätzlichen Containern besteht, die als Proxys fungieren.

Darüber hinaus gibt es mehrere Erweiterungen von Drittanbietern, um Docker clusterfähig zu machen. Zu den Lösungen von Drittanbietern gehören:

  • Durch das Verbinden der Docker-Netzwerkbrücken auf zwei Hosts gibt es leichtgewichtige und verschiedene Lösungen, jedoch im Allgemeinen mit einigen Einschränkungen
  • DNS-basierte Erkennung , z. B. mit Skydock und SkyDNS
  • Docker-Verwaltungstools wie Shipyard und Docker-Orchestrierungstools. In dieser Frage finden Sie eine ausführliche Liste: Skalieren von Docker-Containern in der Produktion

2
Im Grunde gibt es also immer noch keine Möglichkeit, Container über Hosts hinweg zu verknüpfen, die nicht das Ambasador-Muster beinhalten oder Docker umgehen und direkt mit lxc sprechen?
user3012759

@ user3012759 Ambassador Pattern ist der einzige etablierte native Weg, aber Swarm (in Alpha) ist ein anderer nativer Weg, der durch Ersetzen des Docker-Schedulers funktioniert. Entschuldigung für die späte Antwort.
Lyschoening

SkyDock bietet (noch: 03/2015) keine Multi-Host-Unterstützung . Registrator (ein einfaches Projekt, das mit SkyDNS arbeiten kann) funktioniert, die Konfiguration erfolgt jedoch eher manuell (Dienste müssen Ports Host-Ports zugeordnet haben).
Turtlemonvh

6
Meine flüchtige Untersuchung von Swarm legt nahe, dass es sich auf das Cluster-Management und nicht auf die Konnektivität zwischen Hosts konzentriert. Dieses Manko wird in Dockers eigener Demo youtube.com/watch?v=M4PFY6RZQHQ&t=3m37s
Bruno Bronosky

1
@lyschoening Docker kündigte native Multi-Host-Netzwerke an, die Sie möglicherweise aktualisieren möchten
Thomasleveil

15

UPDATE 3

Libswarm wurde in Schwarm umbenannt und ist jetzt eine separate Anwendung.

Hier ist die Demo der Github-Seite, die Sie als Ausgangspunkt verwenden können:

# create a cluster
$ swarm create
6856663cdefdec325839a4b7e1de38e8

# on each of your nodes, start the swarm agent
#  <node_ip> doesn't have to be public (eg. 192.168.0.X),
#  as long as the other nodes can reach it, it is fine.
$ swarm join --token=6856663cdefdec325839a4b7e1de38e8 --addr=<node_ip:2375>

# start the manager on any machine or your laptop
$ swarm manage --token=6856663cdefdec325839a4b7e1de38e8 --addr=<swarm_ip:swarm_port>

# use the regular docker cli
$ docker -H <swarm_ip:swarm_port> info
$ docker -H <swarm_ip:swarm_port> run ... 
$ docker -H <swarm_ip:swarm_port> ps 
$ docker -H <swarm_ip:swarm_port> logs ...
...

# list nodes in your cluster
$ swarm list --token=6856663cdefdec325839a4b7e1de38e8
http://<node_ip:2375>

UPDATE 2

Der offizielle Ansatz ist jetzt, libswarm zu verwenden. Sehen Sie sich hier eine Demo an

AKTUALISIEREN

Es gibt einen guten Kern für die Kommunikation von openvswitch-Hosts im Docker mit demselben Ansatz.

Um die Diensterkennung zu ermöglichen, gibt es einen interessanten DNS-basierten Ansatz namens skydock .

Es gibt auch einen Screencast .


Dies ist auch ein schöner Artikel, in dem dieselben Puzzleteile verwendet werden, aber auch Vlans hinzugefügt werden:

http://fbevmware.blogspot.it/2013/12/coupling-docker-and-open-vswitch.html

Das Patchen hat nichts mit der Robustheit der Lösung zu tun. Docker ist eigentlich nur eine Art DSL auf Linux-Containern, und beide Lösungen in diesen Artikeln umgehen einfach einige automatische Docker-Einstellungen und greifen direkt auf Linux-Container zurück.

Sie können die Lösungen also sicher verwenden und warten, bis sie einfacher sind, sobald Docker sie implementiert.


2
In libswarm war in letzter Zeit nicht viel los. Ich frage mich, ob sich das Docker-Team in eine andere Richtung bewegt.
Raman

12

Weave ist eine neue virtuelle Docker-Netzwerktechnologie, die als virtueller Ethernet-Switch über TCP / UDP fungiert. Sie benötigen lediglich einen Docker-Container, in dem Weave auf Ihrem Host ausgeführt wird.

Was hier interessant ist, ist

  • Verwenden Sie anstelle von Links statische IPs / Hostnamen in Ihrem virtuellen Netzwerk
  • Hosts benötigen keine vollständige Konnektivität, ein Netz wird basierend auf den verfügbaren Peers gebildet, und Pakete werden im Multi-Hop-Modus dorthin geleitet, wo sie benötigt werden

Dies führt zu interessanten Szenarien wie

  • Erstellen Sie ein virtuelles Netzwerk über das WAN. Keiner der Docker-Container weiß oder kümmert sich darum, in welchem ​​Netzwerk sie sich tatsächlich befinden
  • Verschieben Sie Ihre Container auf verschiedene physische Docker-Hosts. Weave erkennt den Peer entsprechend

Beispielsweise gibt es eine Beispielanleitung zum Erstellen eines Cassandra-Clusters mit mehreren Knoten auf Ihrem Laptop und einigen Cloud-Hosts (EC2) mit zwei Befehlen pro Host. Ich habe einen CoreOS-Cluster mit AWS CloudFormation gestartet, Weave auf jedem In / Home / Core sowie auf meiner Laptop-Vagrant-Docker-VM installiert und in weniger als einer Stunde einen Cluster eingerichtet. Mein Laptop ist durch eine Firewall geschützt, aber Weave schien damit einverstanden zu sein. Er stellt lediglich eine Verbindung zu seinen EC2-Kollegen her.


Soweit ich weiß, ist Weave ein Netzwerk-Overlay, das in Containern für die Service-Konnektivität funktioniert , während Swarm eine Clustering-Technologie ist, die die Docker-CLI für die Infrastruktur-Orchestrierung erweitert. Die Infra-Konnektivität muss außerhalb des Schwarms (z. B. mithilfe regulärer Switches) und die Service-Orchestrierung außerhalb des Webbereichs (z. B. mithilfe von Mesos / Kubernetes) erfolgen. Entspricht dies Ihrer Vorstellung davon, wie es funktioniert?
Henrik

So würde ich es sehen: Bei Docker Compose geht es um die Verknüpfung und Orchestrierung von Containern, bei Docker Swarm geht es darum, Docker auf vielen Docker-Hosts auszuführen, Socketplane (jetzt im Besitz von Docker) und Weave sind beide Overlay-Netzwerke. Socketplane basiert auf openvswitch, das üblicherweise für Overlays in VMs (z. B. Openstack) verwendet wird. Weave hingegen ist nur für Docker verfügbar. Von all diesen sind Mesos / Kubernetes / Lattice Ersatz für Docker-Schwarm mit etwas anderen Benutzererfahrungen und Skalierbarkeitsstufen als die Docker-CLI.
Stuart Charlton

7

Aktualisieren

Docker 1.12 enthält den sogenannten Schwarmmodus und fügt eine serviceAbstraktion hinzu. Sie sind wahrscheinlich nicht für jeden Anwendungsfall ausgereift genug, aber ich empfehle Ihnen, sie unter Beobachtung zu halten. Der Schwarmmodus hilft zumindest bei einem Multi-Host-Setup, was die Verknüpfung nicht unbedingt erleichtert. Der Docker-interne DNS-Server (seit 1.11) sollte Ihnen den Zugriff auf Containernamen erleichtern, sofern diese bekannt sind. Dies bedeutet, dass die generierten Namen in einem Swarm-Kontext nicht so einfach zu adressieren sind.


Mit der Docker 1.9-Version erhalten Sie ein Multi-Host-Netzwerk . Sie bieten auch ein Beispielskript zur einfachen Bereitstellung eines funktionierenden Clusters.

Sie benötigen einen K / V-Store (z. B. Consul), mit dem Sie den Status für die verschiedenen Docker-Engines auf jedem Host gemeinsam nutzen können. Jede Docker-Engine muss mit diesem K / V-Speicher konfiguriert werden, und Sie können dann Swarm verwenden, um Ihre Hosts zu verbinden.

Dann erstellen Sie ein neues Overlay-Netzwerk wie folgt:

$ docker network create --driver overlay my-network

Container können jetzt mit dem Netzwerknamen als Ausführungsparameter ausgeführt werden:

$ docker run -itd --net=my-network busybox

Sie können auch mit einem Netzwerk verbunden werden, wenn sie bereits ausgeführt werden:

$ docker network connect my-network my-container

Weitere Details finden Sie in der Dokumentation .


6

Der folgende Artikel beschreibt ausführlich, wie Docker-Container auf mehreren Hosts verbunden werden: http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/


1
Das ist in der Tat eine sehr schöne Lösung; Ich bin auch darauf gestoßen. Was mich beunruhigt ist, dass der Artikel erst gestern veröffentlicht wurde und einen Docker-Patch erfordert. (Angesichts der jüngsten Veröffentlichung würde ich etwas warten, um zu sehen, ob dieser Patch in Docker zusammengeführt wird.)
Lyschoening

Docker befindet sich in einem frühen Entwicklungsstadium, möglicherweise sind noch nicht alle Anforderungen klar und definierte Anforderungen sind nicht alle implementiert. Daher ist ein Patchen erforderlich.
Paweloque

2
Dies ist keine Antwort. Kopieren Sie die Antwort aus dem verlinkten Artikel. Das ist der SO-Standard.
Bruno Bronosky

6

Mit Open vSwitch oder Tinc können mehrere Docker-Subnetze miteinander verbunden werden. Ich habe Gists vorbereitet, um zu zeigen, wie es geht:

Der Vorteil, den ich bei der Verwendung dieser Lösung anstelle der --linkOption und des Botschaftermusters sehe, besteht darin, dass ich sie transparenter finde: Es sind keine zusätzlichen Container erforderlich, und was noch wichtiger ist, es müssen keine Ports auf dem Host verfügbar gemacht werden. Eigentlich denke ich an die --linkOption, ein vorübergehender Hack zu sein, bevor Docker eine schönere Geschichte über Multi-Host- (oder Multi-Daemon-) Setups erhält.

Hinweis: Ich weiß, dass es eine andere Antwort gibt, die auf meinen ersten Kern verweist, aber ich habe nicht genug Karma, um diese Antwort zu bearbeiten oder zu kommentieren.


Wie würden Sie die Serviceerkennung durchführen? Angenommen, ich habe Redis auf einem Computer und eine Clientanwendung auf einem anderen Computer. Wie würde die Clientanwendung die IP des Redis-Dienstes erhalten?
Lyschoening

Auf die gleiche Weise würden Sie dies auf einem einzelnen Host tun: Bereitstellen der IP / des Ports für neu gestartete Dienste oder Verwenden eines Schlüssel- / Wertspeichers (z. B. etcd) oder Verwenden eines DNS, das Dienste abfragen können. Ich verwende gerne DNS, da viele vorhandene Dienste es ohne Änderungen verwenden können.
notiert

1

Wie oben erwähnt, ist Weave definitiv eine praktikable Lösung, um Docker-Container zwischen den Hosts zu verbinden. Aufgrund meiner eigenen Erfahrung ist es ziemlich einfach, es einzurichten. Es hat jetzt auch einen DNS-Dienst, den Sie Container anhand ihrer DNS-Namen adressieren können.

Auf der anderen Seite gibt es CoreOS Flannel und Juniper Opencontrail für die Verkabelung der Container zwischen den Hosts.


1

Der Docker-Schwarm scheint 1.14Ihnen Folgendes zu ermöglichen:

  • Wenn Sie den Hostnamen mithilfe eines --hostnameTags dem Container zuordnen , aber ich konnte ihn nicht zum Laufen bringen. Container können sich nicht gegenseitig über zugewiesene Hostnamen anpingen.

  • Zuweisen von Diensten zur Maschine mit --constraint 'node.hostname == <host>'

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.