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

introduction

Lors de la construction de systèmes distribués pour desservir les conteneurs Docker, la communication et la mise en réseau deviennent extrêmement importantes. L’architecture orientée service dépend indéniablement de la communication entre les composants pour fonctionner correctement.

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

Mise en œuvre de la mise en réseau native de Docker

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

Lorsque le processus Docker lui-même est activé, il configure une nouvelle interface de pont virtuel appeléedocker0 sur le système hôte. Cette interface permet à Docker d’allouer un sous-réseau virtuel à utiliser entre les conteneurs qu’il exécutera. Le pont servira d'interface principale 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 une adresse se trouve dans la plage de sous-réseau du pont. L'adresse IP est reliée au réseau interne du conteneur, fournissant au réseau du conteneur un chemin vers le pontdocker0 sur le système hôte. Docker configure automatiquement les règles deiptables pour permettre le transfert et configure le masquage NAT pour le trafic provenant dedocker0 destiné au monde extérieur.

Comment les conteneurs exposent-ils les services aux consommateurs?

Les autres conteneurs sur le même hôte peuvent accéder aux services fournis par leurs voisins sans configuration supplémentaire. Le système hôte acheminera simplement les demandes en provenance et à destination de l'interfacedocker0 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 sur le 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 deiptables 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 notera 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 en indiquant les ports exposés sur le conteneur d'origine.

Par défaut, les conteneurs seront accessibles au système hôte et à tout autre conteneur de l'hôte, que les ports soient exposés ou non. Exposer le port documente simplement l'utilisation du port et met ces informations à disposition pour les mappages et les liaisons automatisés.

En revanche, la publication d’un port mappera celui-ci sur l’interface hôte, le rendant ainsi accessible au monde extérieur. Les ports de conteneur peuvent être mappés sur un port spécifique de l'hôte ou Docker peut sélectionner automatiquement un port haut inutilisé.

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 fournissant au nouveau conteneur des informations explicites sur la manière 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 visant à étendre les capacités de réseau de Docker

Le modèle de réseau décrit ci-dessus constitue un bon point de départ pour la construction d'un réseau. La communication entre les conteneurs sur le même hôte est relativement simple et la communication entre hôtes peut être établie sur des réseaux publics normaux, à condition que les ports soient correctement mappés et que les informations de connexion soient transmises à 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é 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 élargir l'écosystème réseau Docker.

Création de réseaux superposés pour résumer 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 en superposition est un réseau virtuel construit sur les 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 sur tous les hôtes. Cela peut simplifier la mise en réseau des conteneurs, quel que soit leur emplacement. Un seul réseau virtuel 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 de recouvrement est la construction de grappes de calcul matriciel. En informatique Fabric, plusieurs hôtes sont extraits et gérés comme une seule entité plus puissante. L'implémentation d'une couche d'informatique matricielle permet à l'utilisateur final de gérer le cluster dans son ensemble plutôt que par des hôtes individuels. La mise en réseau joue un grand rôle dans cette classification.

Configuration réseau avancée

D’autres projets élargissent les capacités 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 au mieux lorsqu’il s’agit de réseaux multi-hôtes, mais peuvent également entraver des exigences de réseau plus personnalisées au sein d’un seul hôte.

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

Il existe également un certain nombre d'outils et de projets qui, même s'ils ne sont pas conçus pour Docker, sont souvent utilisés dans les environnements Docker pour fournir les fonctionnalités nécessaires. En particulier, les technologies de réseau et de tunneling privées matures sont souvent utilisées pour fournir une communication sécurisée entre les hôtes et entre les conteneurs.

Quels sont quelques projets communs pour améliorer le réseau Docker?

Quelques projets différents visent à fournir un réseau superposé aux 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é. C’est 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 cela donne l’apparence de chaque conteneur branché à un seul commutateur réseau.

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

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

Voici un exemple pertinent de logiciel existant coopté pour ajouter des fonctionnalités à Docker:

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

Conclusion

La fourniture de 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 certaines de ces fonctionnalités de manière native via la configuration des interfaces virtuelles, des sous-réseaux, desiptables et de la gestion des tables NAT, d'autres projets ont été créés pour fournir des configurations plus avancées.

Dans lesnext guide, nous verrons comment les planificateurs et les outils d'orchestration s'appuient sur cette base pour fournir des fonctionnalités de gestion de conteneurs en cluster.