L'écosystème Docker : mise en réseau et communication

De Get Docs
Aller à :navigation, rechercher

Introduction

Lors de la construction de systèmes distribués pour servir les conteneurs Docker, la communication et la mise en réseau deviennent extrêmement importantes. L'architecture orientée services repose indéniablement sur la communication entre les composants pour fonctionner correctement.

Dans ce guide, nous aborderons les différentes stratégies et outils de mise en réseau utilisés pour façonner les réseaux utilisés par les conteneurs dans l'état souhaité. Certaines situations peuvent tirer parti des solutions natives de Docker, tandis que d'autres doivent utiliser des projets alternatifs.

Implémentation du réseau Docker natif

Docker lui-même fournit bon nombre des bases de mise en réseau nécessaires à la communication de conteneur à conteneur et de conteneur à hôte.

Lorsque le processus Docker lui-même est lancé, il configure une nouvelle interface de pont virtuel appelée docker0 sur le système hôte. Cette interface permet à Docker d'allouer un sous-réseau virtuel à utiliser parmi les conteneurs qu'il exécutera. Le pont servira de point d'interface principal entre la mise en réseau dans un conteneur et la mise en réseau sur l'hôte.

Lorsqu'un conteneur est démarré par Docker, une nouvelle interface virtuelle est créée et reçoit une adresse dans la plage de sous-réseaux du pont. L'adresse IP est connectée au réseau interne du conteneur, fournissant au réseau du conteneur un chemin vers le pont docker0 sur le système hôte. Docker configure automatiquement les règles iptables pour autoriser le transfert et configure le masquage NAT pour le trafic provenant de docker0 destiné au monde extérieur.

Comment les conteneurs exposent-ils les services aux consommateurs ?

D'autres conteneurs sur le même hôte peuvent accéder aux services fournis par leurs voisins sans aucune configuration supplémentaire. Le système hôte acheminera simplement les demandes provenant de et destinées à l'interface docker0 vers l'emplacement approprié.

Les conteneurs peuvent exposer leurs ports à l'hôte, où ils peuvent recevoir le trafic transféré du monde extérieur. Les ports exposés peuvent être mappés au système hôte, soit en sélectionnant un port spécifique, soit en permettant à Docker de choisir un port aléatoire, élevé et inutilisé. Docker prend en charge toutes les règles de transfert et la configuration iptables pour acheminer correctement les paquets dans ces situations.

Quelle est la différence entre exposer et publier un port ?

Lors de la création d'images de conteneur ou de l'exécution d'un conteneur, vous avez la possibilité d'exposer des ports ou de publier des ports. La différence entre les deux est significative, mais peut ne pas être immédiatement perceptible.

Exposer un port signifie simplement que Docker prendra note que le port en question est utilisé par le conteneur. Cela peut ensuite être utilisé à des fins de découverte et de liaison. Par exemple, l'inspection d'un conteneur vous donnera des informations sur les ports exposés. Lorsque les conteneurs sont liés, des variables d'environnement seront définies dans le nouveau conteneur indiquant les ports qui étaient exposés sur le conteneur d'origine.

Par défaut, les conteneurs seront accessibles au système hôte et à tous les autres conteneurs sur l'hôte, que les ports soient exposés ou non. L'exposition du port documente simplement l'utilisation du port et rend ces informations disponibles pour les mappages et les liens automatisés.

En revanche, la publication d'un port le mappera sur l'interface hôte, le rendant disponible au monde extérieur. Les ports de conteneur peuvent soit être mappés sur un port spécifique sur l'hôte, soit Docker peut sélectionner automatiquement un port élevé et inutilisé au hasard.

Que sont les liens Docker ?

Docker fournit un mécanisme appelé "liens Docker" pour configurer la communication entre les conteneurs. Si un nouveau conteneur est lié à un conteneur existant, le nouveau conteneur recevra des informations de connexion pour le conteneur existant via des variables d'environnement.

Cela fournit un moyen simple d'établir une communication entre deux conteneurs en donnant au nouveau conteneur des informations explicites sur la façon d'accéder à son compagnon. Les variables d'environnement sont définies en fonction des ports exposés par l'autre conteneur. L'adresse IP et d'autres informations seront renseignées par Docker lui-même.

Projets pour étendre les capacités de mise en réseau de Docker

Le modèle de mise en réseau décrit ci-dessus fournit un bon point de départ pour la construction de réseaux. La communication entre les conteneurs sur le même hôte est assez simple et la communication entre les hôtes peut se produire sur des réseaux publics réguliers tant que les ports sont correctement mappés et que les informations de connexion sont fournies à l'autre partie.

Cependant, de nombreuses applications nécessitent des environnements réseau spécifiques à des fins de sécurité ou de fonctionnalité. La fonctionnalité de mise en réseau native de Docker est quelque peu limitée dans ces scénarios. Pour cette raison, de nombreux projets ont été créés pour étendre l'écosystème de réseau Docker.

Création de réseaux superposés pour abstraire la topologie sous-jacente

Une amélioration fonctionnelle sur laquelle plusieurs projets se sont concentrés est celle de l'établissement de réseaux superposés. Un réseau superposé est un réseau virtuel construit au-dessus des connexions réseau existantes.

L'établissement de réseaux superposés vous permet de créer un environnement réseau plus prévisible et uniforme entre les hôtes. Cela peut simplifier la mise en réseau entre les conteneurs, quel que soit l'endroit où ils s'exécutent. Un réseau virtuel unique peut s'étendre sur plusieurs hôtes ou des sous-réseaux spécifiques peuvent être désignés pour chaque hôte au sein d'un réseau unifié.

Une autre utilisation d'un réseau superposé est dans la construction de clusters de calcul de tissu. Dans le fabric computing, plusieurs hôtes sont extraits et gérés comme une seule entité plus puissante. La mise en œuvre d'une couche de fabric computing permet à l'utilisateur final de gérer le cluster dans son ensemble plutôt que des hôtes individuels. Le réseautage joue un grand rôle dans ce regroupement.

Configuration réseau avancée

D'autres projets étendent les capacités de mise en réseau de Docker en offrant plus de flexibilité.

La configuration réseau par défaut de Docker est fonctionnelle, mais assez simple. Ces limitations s'expriment le plus pleinement lorsqu'il s'agit de mise en réseau entre hôtes, mais peuvent également entraver des exigences de mise en réseau plus personnalisées au sein d'un même hôte.

Des fonctionnalités supplémentaires sont fournies par des capacités de « plomberie » supplémentaires. Ces projets ne fournissent pas une configuration prête à l'emploi, mais ils vous permettent d'assembler manuellement des éléments et de créer des scénarios de réseau complexes. Certaines des capacités que vous pouvez acquérir vont de la simple mise en place d'un réseau privé entre certains hôtes à la configuration de ponts, de vlans, de sous-réseaux personnalisés et de passerelles.

Il existe également un certain nombre d'outils et de projets qui, bien qu'ils ne soient pas développés avec Docker à l'esprit, sont souvent utilisés dans les environnements Docker pour fournir les fonctionnalités nécessaires. En particulier, les technologies matures de mise en réseau privé et de tunnellisation sont souvent utilisées pour fournir une communication sécurisée entre les hôtes et entre les conteneurs.

Quels sont les projets courants pour améliorer la mise en réseau Docker ?

Il existe quelques projets différents axés sur la mise en réseau de superposition pour les hôtes Docker. Les plus communs sont :

  • flannel : Développé par l'équipe CoreOS, ce projet a été initialement développé pour fournir à chaque système hôte son propre sous-réseau d'un réseau partagé. Il s'agit d'une condition nécessaire au fonctionnement de l'outil d'orchestration kubernetes de Google, mais elle est utile dans d'autres situations.
  • weave : Weave crée un réseau virtuel qui connecte chaque machine hôte ensemble. Cela simplifie le routage des applications car il donne l'impression que chaque conteneur est connecté à un seul commutateur réseau.

En termes de mise en réseau avancée, le projet suivant vise à combler ce poste vacant en fournissant une plomberie supplémentaire :

  • tuyauterie : Construit comme une mesure provisoire jusqu'à ce que le réseau natif Docker devienne plus avancé, ce projet permet une configuration facile de configurations réseau arbitrairement avancées.

Un exemple pertinent de logiciel existant coopté pour ajouter des fonctionnalités à Docker est :

  • tinc : Tinc est un logiciel VPN léger qui est mis en œuvre à l'aide de tunnels et de cryptage. Tinc est une solution robuste qui peut rendre le réseau privé transparent pour toutes les applications.

Conclusion

Fournir des services internes et externes via des composants conteneurisés est un modèle très puissant, mais les considérations de mise en réseau deviennent une priorité. Alors que Docker fournit nativement certaines de ces fonctionnalités via la configuration des interfaces virtuelles, des sous-réseaux, iptables et la gestion des tables NAT, d'autres projets ont été créés pour fournir des configurations plus avancées.

Dans le prochain guide, nous expliquerons comment les planificateurs et les outils d'orchestration s'appuient sur cette base pour fournir une fonctionnalité de gestion de conteneurs en cluster.