web-dev-qa-db-fra.com

Qu'est-ce qu'un réseau de superposition et comment fonctionne la résolution DNS?

Je ne peux pas me connecter au serveur externe mongodb depuis mon docker swarm grappe.

Si je comprends bien, c'est parce que le cluster utilise un pilote de réseau de superposition. Ai-je raison?

Sinon, comment fonctionne le pilote de superposition de docker et comment puis-je me connecter au serveur externe mongodb à partir du cluster?

17
Dmitry Nalyvaiko

Q. Comment fonctionne le pilote de superposition de docker?

Je recommanderais cette bonne référence pour comprendre la superposition du réseau de swarm docker, et plus globalement, l'architecture de Docker .

Cela indique que:

Docker utilise le DNS intégré pour fournir la découverte de services pour les conteneurs s'exécutant sur un seul moteur Docker et les tâches s'exécutant dans un essaim Docker. Docker Engine dispose d'un serveur DNS interne qui fournit une résolution de noms à tous les conteneurs sur l'hôte dans les réseaux de pont, de superposition et MACVLAN définis par l'utilisateur.

Chaque conteneur Docker (ou tâche en mode Swarm) possède un résolveur DNS qui transfère les requêtes DNS à Docker Engine, qui agit comme un serveur DNS.

Donc, en multi-hôte docker swarm mode, avec cet exemple de configuration:

architecture

Dans cet exemple, il existe un service de deux conteneurs appelé myservice. Un deuxième service (client) existe sur le même réseau. client exécute deux opérations curl pour docker.com et myservice.

Ce sont les actions qui en résultent:

  • Les requêtes DNS sont lancées par client pour docker.com et myservice.
  • Le résolveur intégré du conteneur intercepte les requêtes DNS sur 127.0.0.11:53 et les envoie au serveur DNS de Docker Engine.
  • myservice se résout en IP virtuelle (VIP) de ce service qui est équilibrée en charge interne aux adresses IP des tâches individuelles. Les noms de conteneurs se résolvent également, bien que directement à leurs adresses IP.
  • docker.com n'existe pas en tant que nom de service dans le réseau Mynet et la demande est donc transmise au serveur DNS par défaut configuré .

Retour à votre question:

Comment puis-je me connecter à un cluster de formulaires de serveur mongodb externe?

Pour votre mongodb externe (disons que vous avez un DNS pour ce mongodb.mydomain.com), vous êtes dans la même situation que client dans l'architecture ci-dessus, vous voulez vous connecter à docker.com, sauf que vous ne voulez certainement pas exposer cela mongodb.mydomain.com à l'ensemble du Web, vous l'avez donc peut-être déclaré dans votre serveur DNS de cluster interne.

Ensuite, comment dire au moteur Docker d'utiliser ce serveur DNS interne pour résoudre mongodb.mydomain.com?

Vous devez indiquer dans votre docker service tâche que vous souhaitez utiliser serveur DNS interne , comme ceci:

docker service create \
--name myservice \
--network my-overlay-network \
--dns=10.0.0.2 \
myservice:latest

La chose importante ici est --dns=10.0.0.2. Cela indiquera au moteur Docker d'utiliser le serveur DNS à 10.0.0.2:53 par défaut s'il ne peut pas résoudre le nom DNS dans le VIP.

Enfin, quand vous dites:

Je ne peux pas me connecter au serveur mongodb externe à partir de mon cluster d'essaimage Docker. Si je comprends bien, c'est parce que le cluster utilise un pilote réseau de superposition. Ai-je raison?

Je dirais non, car il existe une méthode intégrée dans docker engine pour transférer le nom DNS inconnu provenant de overlay network au serveur DNS souhaité.

J'espère que cela t'aides!

27
François Maturel