117 votes

Comment lier les services Docker entre les hôtes ?

Docker permet aux serveurs de plusieurs conteneurs de se connecter les uns aux autres via des liens et la découverte de services. . Cependant, d'après ce que je peux voir, cette découverte de service est locale à l'hôte. Je voudrais mettre en œuvre un service qui utilise d'autres services hébergés sur une autre machine.

Il y a eu plusieurs approches pour résoudre ce problème dans Docker, telles que Le programme de CoreOS jumpers des services locaux qui servent essentiellement de proxy à l'autre machine, et toute une série de projets github pour la gestion des déploiements Docker qui semblent avoir tenté de prendre en charge ce cas d'utilisation.

Étant donné le rythme du développement, il est difficile de suivre les meilleures pratiques actuelles. Ma question est donc essentiellement la suivante :

  1. Quelle est (le cas échéant) la méthode prédominante actuelle pour établir des liens entre les hôtes dans Docker, et
  2. Est-il prévu de prendre en charge cette fonctionnalité directement dans le système Docker ?

59voto

lyschoening Points 1079

Mise à jour

Docker a récemment a annoncé un nouvel outil appelé Essaim pour l'orchestration de Docker.

Essaim vous permet de "joindre" plusieurs démons Docker : Vous créez d'abord un essaim, vous démarrez un gestionnaire d'essaim sur une machine et vous demandez aux démons docker de "rejoindre" le gestionnaire d'essaim en utilisant l'identifiant de l'essaim. Le client docker se connecte au gestionnaire d'essaim comme s'il s'agissait d'un serveur docker ordinaire.

Lorsqu'un conteneur est lancé avec Swarm, il est automatiquement assigné à un nœud libre qui répond aux contraintes qui ont été définies. L'exemple suivant est tiré de l'article du blog :

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

L'une des contraintes prises en charge est "node" qui permet d'associer un conteneur à un nom d'hôte spécifique. L'essaim résout également les liens entre les nœuds.

Lors de mes tests, j'ai eu l'impression que Essaim ne fonctionne pas encore très bien avec les volumes situés à un emplacement fixe (ou du moins le processus de liaison n'est pas très intuitif), c'est donc un élément à garder à l'esprit.

Essaim est maintenant en phase bêta.


Jusqu'à récemment, le Patronage Ambassadeur était la seule approche native de Docker pour la découverte de services d'hôtes distants. Ce modèle peut toujours être utilisé et ne nécessite aucune magie au-delà de Docker, car il consiste en un ou plusieurs conteneurs supplémentaires qui agissent comme des mandataires.

En outre, il existe plusieurs extensions tierces permettant de rendre Docker compatible avec les clusters. Les solutions tierces incluent :

  • Connecter les ponts réseau Docker sur deux hôtes, des solutions légères et variées existent, mais généralement avec quelques réserves
  • Découverte basée sur le DNS, par exemple avec skydock et SkyDNS
  • Outils de gestion Docker tels que Chantier naval et des outils d'orchestration Docker. Voir cette question pour une liste exhaustive : Comment faire évoluer les conteneurs Docker en production

2 votes

En gros, il n'y a donc toujours pas de moyen de lier des conteneurs entre hôtes qui n'implique pas le modèle ambasador ou le contournement de docker et la communication directe avec lxc ?

0 votes

@user3012759 Ambassador Pattern est la seule méthode native établie, mais Swarm (en alpha) est une autre méthode native qui fonctionne en remplaçant le planificateur Docker. Désolé pour la réponse tardive.

0 votes

SkyDock ne comprend pas (encore : 03/2015) le support multi-hôte . Registrateur (un projet simple qui peut fonctionner avec SkyDNS) le fait, mais la configuration est plus manuelle (les services doivent avoir des ports mappés aux ports de l'hôte).

15voto

tommasop Points 5692

MISE À JOUR 3

Libswarm a été renommé en essaim et constitue désormais une application distincte.

Voici la démo de la page github à utiliser comme point de départ :

# 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>

MISE À JOUR 2

L'approche officielle consiste désormais à utiliser libswarm voir une démo aquí

UPDATE

Il existe un Bon résumé pour la communication des hôtes openvswitch dans docker en utilisant la même approche.

Pour permettre la découverte de services, il existe une approche intéressante basée sur le DNS appelée skydock .

Il existe également un Vidéo d'écran .


Il s'agit également d'un bon article qui utilise les mêmes pièces du puzzle, mais qui ajoute également des vlans par-dessus :

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

Le Parcheando n'a rien à voir avec la robustesse de la solution. Docker n'est en fait qu'une sorte de DSL sur les conteneurs Linux et les deux solutions présentées dans ces articles contournent simplement certains paramètres automatiques de Docker et se rabattent directement sur les conteneurs Linux.

Vous pouvez donc utiliser les solutions en toute sécurité et attendre de pouvoir le faire de manière plus simple lorsque Docker l'implémentera.

2 votes

Il n'y a pas eu beaucoup d'activité dans libswarm ces derniers temps. Je me demande si l'équipe Docker ne se dirige pas dans une autre direction ?

12voto

Stuart Charlton Points 51

Tissage est une nouvelle technologie de réseau virtuel Docker qui agit comme un commutateur Ethernet virtuel sur TCP/UDP. Tout ce dont vous avez besoin est un conteneur Docker exécutant Weave sur votre hôte.

Ce qui est intéressant ici c'est

  • Au lieu de liens, utilisez des IPs/hostnames statiques dans votre réseau virtuel.
  • Les hôtes n'ont pas besoin d'une connectivité totale, un maillage est formé en fonction des pairs disponibles et les paquets sont acheminés en multi-sauts jusqu'à l'endroit où ils doivent aller.

Cela conduit à des scénarios intéressants comme

  • Créez un réseau virtuel à travers le WAN, aucun des conteneurs Docker ne saura ou ne se souciera du réseau réel dans lequel il se trouve.
  • Déplacez vos conteneurs vers différents hôtes docker physiques, Weave détectera le pair en conséquence.

Par exemple, il y a un exemple de guide sur la façon de créer un cluster Cassandra multi-nœuds sur votre ordinateur portable et quelques hôtes cloud (EC2) avec deux commandes par hôte. J'ai lancé un cluster CoreOS avec AWS CloudFormation, installé weave sur chacun d'entre eux dans /home/core, ainsi que la VM docker vagrant de mon ordinateur portable, et obtenu un cluster en moins d'une heure. Mon ordinateur portable est protégé par un pare-feu, mais Weave semble s'en accommoder, il se connecte simplement à ses pairs EC2.

0 votes

D'après ce que je comprends, weave est un réseau superposé qui fonctionne dentro de pour la connectivité des services, tandis que swarm est une technologie de mise en grappe qui étend le CLI de Docker pour l'orchestration de l'infrastructure. La connectivité de l'infrastructure doit être réalisée en dehors de swarm (par exemple en utilisant des commutateurs ordinaires) et l'orchestration des services en dehors de weave (en utilisant par exemple Mesos/Kubernetes). Cela correspond-il à votre idée du fonctionnement ?

0 votes

Voici comment je vois les choses : docker compose concerne la liaison et l'orchestration des conteneurs, docker swarm permet d'exécuter docker sur de nombreux hôtes docker, socketplane (qui appartient maintenant à docker) et weave sont tous deux des réseaux superposés. Socketplane est basé sur openvswitch qui est couramment utilisé pour les superpositions dans les VM (par exemple, openstack) ; Weave, d'autre part, est réservé à docker. Parmi tous ces réseaux, Mesos/Kubernetes/Lattice sont des remplacements de docker swarm avec des expériences utilisateur et des niveaux d'extensibilité quelque peu différents de ceux de la CLI de docker.

6voto

paweloque Points 4467

L'article suivant décrit joliment comment connecter des conteneurs docker sur plusieurs hôtes : http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/

1 votes

C'est une très bonne solution ; je l'ai également rencontrée. Ce qui m'inquiète, c'est que l'article n'a été publié qu'hier et qu'il demande un correctif pour Docker. (Étant donné que l'article a été posté récemment, j'attendrais un peu pour voir s'ils fusionnent ce patch dans Docker).

0 votes

Docker est dans une phase de développement précoce, peut-être que toutes les exigences ne sont pas encore claires et que les exigences définies ne sont pas toutes mises en œuvre. D'où la nécessité du Parcheando.

2 votes

C'est une non-réponse. Copiez la réponse de l'article lié. C'est la norme de l'OS.

6voto

noteed Points 73

Il est possible de relier plusieurs sous-réseaux Docker en utilisant Open vSwitch ou Tinc. J'ai préparé des Gists pour montrer comment le faire :

L'avantage que je vois à utiliser cette solution au lieu de l'option --link et le modèle de l'ambassadeur est que je le trouve plus transparent : il n'est pas nécessaire d'avoir des conteneurs supplémentaires et surtout, il n'est pas nécessaire d'exposer des ports sur l'hôte. En fait, je pense que l'option --link n'est qu'une solution temporaire avant que Docker ne s'intéresse de plus près aux configurations multi-hôtes (ou multi-démons).

Note : Je sais qu'il y a une autre réponse qui pointe vers mon premier Gist mais je n'ai pas assez de karma pour modifier ou commenter cette réponse.

0 votes

Comment faire de la détection de service ? Par exemple, si j'ai Redis sur une machine et une application client sur une autre, comment l'application client peut-elle obtenir l'adresse IP du service Redis ?

0 votes

De la même manière que vous le feriez sur un hôte unique : en fournissant vous-même l'IP/port aux services nouvellement démarrés, ou en utilisant un magasin de clés/valeurs (par exemple etcd) ou en utilisant un DNS que les services peuvent interroger. J'aime utiliser le DNS car de nombreux services existants peuvent l'utiliser sans modification.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X