Tutoriel Docker: Premiers pas avec la mise en réseau Docker

Un cas d'utilisation courant de Docker est celui des services en réseau, et Docker dispose de son propre modèle de mise en réseau pour permettre aux conteneurs de se parler à la fois et au monde extérieur.

À l'origine, les conteneurs Docker devaient être mis en réseau à la main ou exposés manuellement au monde extérieur. Le modèle de réseau actuel permet aux conteneurs de se trouver automatiquement sur le même hôte (ou sur différents hôtes) et d'être exposés au monde dans son ensemble de manière plus contrôlée.

Docker fournit aux développeurs la mise en réseau des conteneurs de quatre manières de base. Les deux premiers, les réseaux de pont et de superposition , couvrent les cas d'utilisation les plus courants en production. Les deux autres, les réseaux hôte et Macvlan , existent pour couvrir des cas moins courants.

Réseau Docker: Réseaux de pont

Les réseaux de pont permettent aux conteneurs exécutés sur le même hôte Docker de communiquer entre eux. Une nouvelle instance de Docker est livrée avec un réseau de pont par défaut nommé bridge, et par défaut tous les conteneurs nouvellement démarrés s'y connectent.

Le bridgeréseau est livré avec de nombreux paramètres par défaut prêts à l'emploi, mais ils peuvent nécessiter des réglages précis en production. Par exemple, les conteneurs bridgeactivés ont automatiquement tous les ports exposés les uns aux autres, mais aucun au monde extérieur. C'est utile lorsque vous devez tester la communication entre les conteneurs, mais pas pour déployer un service en direct.

Pour de meilleurs résultats, créez votre propre réseau de ponts. Les ponts définis par l'utilisateur ont de nombreuses fonctionnalités que le bridgepont n'a pas:

  • La résolution DNS fonctionne automatiquement entre les conteneurs sur un pont personnalisé. De cette façon, vous n'avez pas besoin d'utiliser des adresses IP brutes pour communiquer entre elles comme vous le faites sur le bridgepont. Les conteneurs peuvent localiser d'autres conteneurs via DNS en utilisant le nom du conteneur.
  • Les conteneurs peuvent être ajoutés et supprimés d'un pont personnalisé pendant leur exécution.
  • Les variables d'environnement peuvent être partagées entre les conteneurs sur un pont personnalisé.

En bref, vous pouvez commencer à bricoler des conteneurs en utilisant le pont par défaut, mais pour tout travail de production sérieux, vous voudrez créer un pont personnalisé.

Réseau Docker: superposer les réseaux

Les réseaux de pont sont destinés aux conteneurs sur le même hôte. Les réseaux de superposition sont destinés aux conteneurs s'exécutant sur différents hôtes, tels que ceux d'un essaim Docker. Cela permet aux conteneurs à travers les hôtes de se trouver et de communiquer, sans que vous ayez à vous soucier de la façon de configurer cela pour chaque conteneur participant individuel.

Le mode essaim de Docker de orchestrateur crée automatiquement un réseau de recouvrement, ingress. Par défaut, tous les services de l'essaim se rattachent à ingress. Mais comme pour la valeur par défaut bridge, ce n'est pas le meilleur choix pour un système de production, car les valeurs par défaut peuvent ne pas être appropriées. Votre meilleur pari est de créer un réseau de superposition personnalisé, avec ou sans essaim, et d'y attacher des nœuds si nécessaire.

Si vous souhaitez utiliser un réseau de superposition avec des conteneurs qui ne s'exécutent pas dans un essaim, c'est un autre cas d'utilisation pour créer un réseau de superposition personnalisé. Notez que chaque hôte Docker sur un réseau de superposition doit avoir les ports appropriés ouverts à ses pairs pour être vu, et sans le mode Swarm, chaque nœud a besoin d'accéder à un magasin clé-valeur d'un type quelconque.

Notez également que les réseaux de superposition, par défaut, n'autorisent que 256 adresses IP distinctes. Vous pouvez augmenter cette limite, mais Docker recommande d'utiliser plusieurs superpositions à la place.

Réseau Docker: mise en réseau hôte

Le hostpilote réseau permet aux conteneurs d'exécuter leurs piles réseau côte à côte avec la pile sur l'hôte. Un serveur Web sur le port 80 dans un hostconteneur en réseau est disponible à partir du port 80 sur l'hôte lui-même.

Le plus grand avantage de la mise en réseau hôte est la vitesse. Si vous devez donner un accès au port de conteneur et que vous souhaitez le rendre aussi proche que possible du système d'exploitation sous-jacent, c'est la voie à suivre. Mais cela se fait au détriment de la flexibilité: si vous mappez le port 80 à un conteneur, aucun autre conteneur ne peut l'utiliser sur cet hôte.

Réseau Docker: mise en réseau Macvlan

Un réseau Macvlan est destiné aux applications qui fonctionnent directement avec le réseau physique sous-jacent, telles que les applications de surveillance du trafic réseau. Le macvlanpilote n'attribue pas seulement une adresse IP à un conteneur, mais également une adresse MAC physique.

Notez que ce type de réseau Docker comporte de nombreuses mises en garde que vous auriez si, par exemple, vous créiez des adresses MAC virtuelles à l'aide de machines virtuelles. En bref, Macvlan doit être réservé uniquement aux applications qui ne fonctionnent pas à moins qu'elles ne reposent sur une adresse réseau physique.

Réseau Docker: création et gestion de réseaux

Toute la gestion du réseau dans Docker se fait à l'aide de la docker networkcommande. Beaucoup de ses sous-commandes sont similaires aux autres commandes Docker; par exemple, docker network lsaffiche tous les réseaux configurés sur l'instance Docker actuelle:

$ docker network ls NETWORK ID NAME DRIVER SCOPE 2e0adaa0ce4a bridge bridge local 0de3da43b973 host host local 724a28c6d86d none null local

Pour créer un réseau, utilisez la createsous - commande avec l' --driverindicateur pour indiquer le pilote à utiliser ( bridge, overlay, macvlan):

$ docker network create --driver bridge my-bridge 

Les conteneurs en réseau hôte ne nécessitent pas la création d'un réseau pour eux. À la place, lancez le conteneur avec l' --network hostindicateur. Tous les processus du conteneur écoutent leurs ports préconfigurés, assurez-vous donc qu'ils sont définis en premier.

Les options de création d'un réseau incluent également la spécification de son sous-réseau, de sa plage d'adresses IP et de sa passerelle réseau, comme ce serait le cas pour la création d'un réseau à l'aide d'autres moyens.

Les conteneurs s'exécutent par défaut sur le bridgeréseau. Pour utiliser un réseau particulier, utilisez simplement l' --networkindicateur lors du lancement du conteneur et spécifiez le nom du réseau.

Vous pouvez également associer un conteneur en cours d'exécution à un réseau:

$ docker network connect bridge my_container

Cela se  connecte my_containerau bridgeréseau, tout en préservant les connexions réseau existantes dont il dispose déjà.

Lorsqu'un conteneur est arrêté, tous les réseaux qui lui sont associés restent intacts. Si vous souhaitez supprimer des réseaux manuellement, vous pouvez le faire avec la docket network rm commande ou utiliser docker network prunepour supprimer tous les réseaux qui ne sont plus utilisés sur l'hôte.

Réseau Docker et réseau Kubernetes

Si vous envisagez Kubernetes comme solution d'orchestration, mais que vous avez déjà beaucoup de travail dans une configuration de réseau Docker, vous ne serez pas ravi d'apprendre qu'il n'y a pas de correspondance univoque entre la façon dont Docker et Kubernetes gèrent le réseau.

Les détails sont décrits dans la documentation de Kubernetes, mais la version courte est qu'ils ont des modèles fondamentalement différents pour la façon dont les ressources réseau sont allouées et gérées. Vous devrez donc concevoir une configuration réseau spécifique à Kubernetes pour votre application.

Une approche intermédiaire possible consiste à utiliser un plugin CNI (Container Network Interface) Kubernetes qui fonctionne avec les propres contrôles réseau de Docker. Mais c'est au mieux une solution provisoire; à un moment donné, vous devrez créer vos projets Kubernetes en utilisant ses propres métaphores de mise en réseau de l'intérieur.