Docker – le réseau

J’ai mis en oeuvre mon premier conteneur hier, une instance de Gitlab que j’ai exposé sur internet. La question de la configuration du réseau et la façon dont docker s’intègre se pose. L’objectif est de limiter les configurations et les compétences requises afin de montrer que c’est accessible.

Rappel sur un reseau domestique

La configuration du schéma précédent est commune dans les accès internet grand public. Comme évoqué dans le billet De la virtualisation à la conteneurisation ce reseau domestique peut peut-être utiliser pour accueillir des services autohébergés.

Avec la mutualisation comme les services sont sur la même IP, les conflits de port surviennent. Même si on pourrait definir plusieurs interfacex reseaux ou attribuer plusieurs IP à la même interface, cela complexifie la configuration de l’hôte et le routage au niveau de la box qui possède l’ip publique. Au final pour rester simple avec une seul IP sur l’hôte, on expose autant de ports qu’il y a de services.

Avec certains protocoles comme HTTP il est possible de virtualiser les serveurs basés sur le nom de domaine. Dans le DNS il suffit d’associer plusieurs noms de domaine à la même IP publique. On diminue ainsi le nombre de ports exposés sur l’IP publique.

Le paramétrage des services pour changer leur port d’écoute n’est pas le plus compliqué mais les conflits de librairies et de paramétrage des applications sur le même hôte fini par limiter l’agilité de la solution mutualisé. La virtualisation apporte des solutions.

La configuration de chaque service est autonome ainsi les virtualappliance permettent de dupliquer les services et la couche de virtualisation quemu/kvm crée automatiquement un réseau pour les VM. Ainsi on a une IP par service. Cette IP est attribuée par adresse MAC et même si elles ne sont pas visibles du réseau local, elles sont fixes et sont accessibles par l’hôte.

Reste le problème des ports de l’hôte. On peut là aussi mutualiser certains ports pour les services basés sur le nom de domaine. Dans le cas contraire il faut ouvrir un nouveau port sur la box. Ce port devra être redirigé vers l’IP de la VM. Par défaut cette IP est interne à l’hôte et non visible du reseau local (depuis le routeur de la box) donc il faudrait faire une redirection des paquets depuis l’hôte ou bien configurer la VM en mode bridge pour qu’elle ait une IP dans le réseau local et permettre de faire une redirection depuis le routeur vers l’IP de la VM.

Dans tous les cas il faudra ouvrir un nouveau port sur la box: un part instance de service. Avec le reroutage local à l’hôte la VM reste cachée derrière l’hôte et dans l’autre la VM sera visible du reseau local.

Avec les conteneurs docker

Le dernier schema vu plus haut reste vrai avec la configuration par défaut quand on utilise docker directement sur la machine hôte. On remplace les VM par des conteneurs.

On peut toujours mutualiser les ports 80 et 443 en déployant autant de services HTTP que voulu derrière le reverse proxy. On remarque déjà que les IP1 et IP2 associées à chacun des conteneurs ne sont pas utilisérs par le reverse proxy même si l’hôte les voit. Ces IP sont ephémères et changent d’un redémarrage à l’autre du service.

Docker expose chaque services sur un port de l’hôte.

On revient à l’organisation d’un serveur mutualisé… c’est d’ailleurs ce que l’on voulait en passant de la virtualisation à l’isolation autre terme pour parler de conteneurisation.

Conteneur virtualisé

On va avoir une concurrence entre les applications docker pour l’attribution des ports de l’hôte. Or la machine hôte est également une machine de développement. Nous sommes en informatique résidentielle. Il faudra séparer les réseaux en gérant soi-même 2 réseaux sur l’hôte avec 2 IP l’une pour le dev l’autre pour la production. Outre la compétence supplémentaire, la configuration de dev sera differente de celle de production. Ce qui n’est jamais bon et qu’on cherche à éviter. Cela est encore plus vrai si on veut avoir un environnent de préprod iso-prod. Une autre machine identique en guise d’hôte…. la virtualisation répond à ce besoin.

Faire tourner docker en machine virtuelle

L’utilisation de docker en VM est d’ailleurs un moyen de permettre la scalabilité. Au lieu d’augmenter la mémoire et le nombre de process sur même hôtes, on finit par trouver plus simple d’augmenter le nombre d’hôtes et distribuer les traitements à travers ceux-ci.

On voit que d’un point de vue de l’hôte (rectangle arrondi), les services conteneurisés dans une VM sont accessible par une IP spécifique car exposés par docker sur un port de l’hôte sur lequel il tourne, c’est-à-dire avec une IP fournie par la couche de virtualisation quem/kvm.

L’étape ultime sera pour moi d’avoir sur une VM tous les services du domaine bressure.net, ainsi j’aurais totalement séparé  par virtualisation  et conteneurisation les applications qui n’ont rien à faire sur un poste de travail. A partir de là, tous ces services pourront être hébergé ailleurs ou bénéficier d’une ré-allocation sur des ressources physiques plus grande sans être limité à l’hôte.

La suite au prochain billet.

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.