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 souhaite implémenter un service qui utilise d'autres services hébergés sur une machine différente.
Il y a eu plusieurs approches pour résoudre ce problème dans Docker, telles que CoreOSjumpers
, les services locaux de l'hôte qui sont essentiellement proxy vers l'autre machine, et tout un tas de projets github pour la gestion des déploiements Docker qui semblent avoir tenté de prendre en charge ce cas d'utilisation .
Compte tenu du rythme du développement, il est difficile de suivre les meilleures pratiques actuelles. Ma question est donc essentiellement:
- Quelle est (le cas échéant) la méthode prédominante actuelle pour la liaison entre les hôtes dans Docker, et
- Existe-t-il des plans pour prendre en charge cette fonctionnalité directement dans le système Docker?
MISE À JOUR 3
Libswarm a été renommé en essaim et est maintenant une application séparée.
Voici la démo de la page github à utiliser comme point de départ:
MISE À JOUR 2
L'approche officielle est maintenant d'utiliser libswarm voir une démo ici
METTRE À JOUR
Il y a une bonne idée 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 y a aussi un screencast .
C'est aussi un bel article utilisant les mêmes pièces du puzzle mais ajoutant également des vlans sur le dessus:
http://fbevmware.blogspot.it/2013/12/coupling-docker-and-open-vswitch.html
Le patch 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 de ces articles contournent simplement certains paramètres automatiques de Docker et reviennent directement aux conteneurs Linux.
Vous pouvez donc utiliser les solutions en toute sécurité et attendre de pouvoir le faire de manière plus simple une fois que Docker les implémentera.
la source
Weave 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
Cela conduit à des scénarios intéressants comme
Par exemple, il existe un exemple de guide sur la création d'un cluster Cassandra à plusieurs nœuds sur votre ordinateur portable et sur quelques hôtes cloud (EC2) avec deux commandes par hôte. J'ai lancé un cluster CoreOS avec AWS CloudFormation, installé le tissage sur chaque in / home / core, ainsi que ma VM docker vagrant pour ordinateur portable, et j'ai obtenu un cluster en moins d'une heure. Mon ordinateur portable est pare-feu mais Weave semble être d'accord avec cela, il se connecte simplement à ses pairs EC2.
la source
Mettre à jour
Docker 1.12 contient ce qu'on appelle le mode Swarm et ajoute également une
service
abstraction. Ils ne sont probablement pas assez matures pour chaque cas d'utilisation, mais je vous suggère de les garder sous observation. Le mode Swarm aide au moins dans une configuration multi-hôte, ce qui ne facilite pas nécessairement la liaison. Le serveur DNS interne à Docker (depuis 1.11) devrait vous aider à accéder aux noms de conteneurs, s'ils sont bien connus - ce qui signifie que les noms générés dans un contexte Swarm ne seront pas si faciles à adresser.Avec la version Docker 1.9, vous bénéficierez d' un réseau multi-hôte intégré . Ils fournissent également un exemple de script pour provisionner facilement un cluster fonctionnel.
Vous aurez besoin d'un magasin K / V (par exemple Consul) qui permet de partager l'état entre les différents moteurs Docker sur chaque hôte. Chaque moteur Docker doit être configuré avec ce magasin K / V et vous pouvez ensuite utiliser Swarm pour connecter vos hôtes.
Ensuite, vous créez un nouveau réseau de superposition comme celui-ci:
Les conteneurs peuvent désormais être exécutés avec le nom du réseau comme paramètre d'exécution:
Ils peuvent également être connectés à un réseau lorsqu'ils sont déjà en cours d'exécution:
Plus de détails sont disponibles dans la documentation .
la source
L'article suivant décrit bien comment connecter des conteneurs Docker sur plusieurs hôtes: http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/
la source
Il est possible de relier plusieurs sous-réseaux Docker en utilisant Open vSwitch ou Tinc. J'ai préparé Gists pour montrer comment le faire:
L'avantage que je vois en utilisant cette solution au lieu de l'
--link
option et du modèle d'ambassadeur est que je le trouve plus transparent: il n'est pas nécessaire d'avoir des conteneurs supplémentaires et surtout, pas besoin d'exposer les ports sur l'hôte. En fait, je pense à l'--link
option d'être un hack temporaire avant que Docker n'ait une meilleure histoire sur les 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 éditer ou commenter cette réponse.
la source
Comme mentionné ci-dessus, Weave est certainement une solution viable pour relier les conteneurs Docker entre les hôtes. D'après ma propre expérience, il est assez simple de le mettre en place. Il dispose désormais d' un service DNS auquel vous pouvez adresser le conteneur par ses noms DNS.
D'autre part, il y a Flannel de CoreOS et Opencontrail de Juniper pour câbler les conteneurs à travers les hôtes.
la source
On dirait que docker swarm
1.14
vous permet de:assing hostname to container, using
--hostname
tag, mais je n'ai pas été en mesure de le faire fonctionner, les conteneurs ne sont pas capables de se cingler les uns les autres par les noms d'hôte assignés.attribution de services à la machine en utilisant
--constraint 'node.hostname == <host>'
la source