Aller au contenu

Comprendre le réseau Docker

Mise à jour :

logo docker

Le choix du bon type de réseau Docker est essentiel pour assurer une communication efficace et sécurisée entre vos conteneurs. Que ce soit pour connecter des services au sein d’une même machine avec le réseau bridge, pour maximiser les performances avec le réseau host, ou pour gérer des environnements distribués avec overlay, Docker vous offre des options adaptées à vos besoins.

En maîtrisant ces différents types de réseaux, vous pouvez concevoir des infrastructures conteneurisées robustes et flexibles, capables de s’adapter à une grande variété de scénarios, du développement à la production.

Les 6 types de réseaux Docker

Docker propose plusieurs types de réseaux pour connecter vos conteneurs de manière sécurisée et performante. Voici les principaux types de réseaux Docker :

  • Bridge : Le réseau bridge est le réseau par défaut lorsque vous ne spécifiez pas de réseau particulier. Il permet aux conteneurs de communiquer entre eux sur un même hôte.
  • Host : Le réseau host permet à un conteneur de partager directement le réseau de l’hôte, sans passer par la virtualisation réseau de Docker. Le conteneur utilise directement l’adresse IP de la machine hôte.
  • Overlay : Le réseau overlay connecte plusieurs conteneurs sur différents hôtes, idéal pour les clusters Docker Swarm ou Kubernetes. Il permet une communication inter-hôtes sécurisée.
  • None : Le réseau none désactive tout réseau pour un conteneur, isolant totalement ce dernier du reste du système et du réseau externe.
  • Macvlan : Le réseau Macvlan attribue à chaque conteneur une adresse MAC unique, lui permettant de se comporter comme un périphérique réseau distinct sur le réseau physique.
  • Ipvlan : Le réseau Ipvlan permet aux conteneurs de partager l’interface réseau de l’hôte tout en attribuant à chaque conteneur une adresse IP distincte, en utilisant l’adresse MAC de l’hôte pour simplifier la gestion des adresses.

Le type None

Le réseau none dans Docker désactive complètement l’accès réseau pour un conteneur. Lorsque vous choisissez ce type de réseau, le conteneur n’a pas de connexion réseau, aucune interface réseau n’est attachée, et il est totalement isolé du reste du réseau, y compris des autres conteneurs. Ce mode est principalement utilisé dans des cas où le conteneur n’a pas besoin de communication externe ou pour des raisons de sécurité afin d’éviter toute interaction non désirée avec d’autres systèmes ou réseaux.

Fonctionnement

En utilisant le mode none, Docker n’associe aucune interface réseau au conteneur. Cela signifie que le conteneur ne peut ni recevoir ni envoyer de trafic réseau, que ce soit vers d’autres conteneurs, la machine hôte ou le réseau externe. Le conteneur n’a donc accès qu’aux ressources internes du système, sans possibilité de communication extérieure.

Ce type de réseau est souvent utilisé dans des situations où le conteneur n’a pas besoin de se connecter à Internet ou à d’autres services, par exemple, pour des traitements de données ou des tâches qui ne nécessitent aucun accès réseau.

Exemple d’utilisation

Supposons que vous ayez un conteneur qui effectue uniquement des tâches de traitement de données hors ligne. Dans ce cas, il serait inutile (et potentiellement dangereux) de lui donner accès au réseau. Vous pouvez alors utiliser le mode none pour isoler complètement ce conteneur.

  1. Lancez un conteneur avec le réseau none :

    Terminal window
    docker run --network none my_offline_container

Dans cet exemple, le conteneur my_offline_container sera lancé sans interface réseau, et il sera totalement isolé de tout autre service ou réseau.

Cas d’usage

Le réseau none est utile dans les cas suivants :

  1. Tâches hors ligne : Pour les traitements qui n’ont pas besoin de réseau, comme des scripts de calcul intensif ou des processus d’analyse de fichiers, utiliser le mode none permet d’isoler ces conteneurs tout en minimisant les ressources réseau consommées.
  2. Sécurité : Dans certaines situations, vous pouvez vouloir empêcher toute communication entre le conteneur et d’autres services ou réseaux pour des raisons de sécurité. Par exemple, si vous exécutez un conteneur avec des données sensibles qui ne doivent en aucun cas être accessibles depuis l’extérieur, le mode none garantit une isolation complète.
  3. Environnements de tests : Si vous testez des comportements spécifiques d’applications sans réseau, par exemple pour voir comment une application se comporte sans accès à Internet, le mode none vous permet de simuler cette situation.

Le réseau none est donc idéal pour les conteneurs qui n’ont pas besoin d’accès réseau ou pour des cas où l’isolation est indispensable. Bien que son utilisation soit plus rare que les autres types de réseaux, il offre une solution simple pour éviter toute interaction réseau dans des environnements spécifiques.

Le type Bridge

Le réseau bridge est le réseau par défaut utilisé par Docker lorsque vous créez des conteneurs sans spécifier de réseau. Il permet aux conteneurs de communiquer entre eux sur un même hôte. Chaque conteneur dans un réseau bridge reçoit une adresse IP locale, et les conteneurs peuvent se joindre via leurs noms ou leurs adresses IP internes.

Fonctionnement

Le réseau bridge fonctionne en créant un réseau isolé dans lequel les conteneurs peuvent interagir. Cependant, les conteneurs sur un réseau bridge ne peuvent pas être accessibles directement depuis l’extérieur, sauf si vous exposez explicitement des ports.

Le bridge agit comme un commutateur virtuel (switch) pour connecter les conteneurs, tout en les isolant des autres réseaux présents sur la machine hôte.

Supposons que vous avez une application web dans un conteneur et une base de données Postgresql dans un autre conteneur. Vous voulez que ces deux services communiquent entre eux tout en étant isolés du reste du réseau. Voici comment vous pourriez utiliser un réseau bridge.

  1. Créez un réseau personnalisé :

    Terminal window
    docker network create mon_reseau
  2. Lancez votre base de données dans ce réseau :

    Terminal window
    docker run -d --name db --network mon_reseau postgres
  3. Lancez ensuite votre application web dans le même réseau :

    Terminal window
    docker run -d --name app --network mon_reseau my_web_app

Dans cet exemple, votre application web pourra se connecter à la base de données en utilisant le nom de conteneur db comme adresse réseau interne. Cela simplifie la communication entre conteneurs sans exposer les services sur le réseau externe, garantissant ainsi une certaine isolation et sécurité.

Paramètres disponibles

  • com.docker.network.bridge.enable_icc : Permet ou non la communication entre les conteneurs. (true ou false)
  • com.docker.network.bridge.enable_ip_masquerade : Active le masquage IP pour l’accès au réseau externe.
  • subnet : Définir un sous-réseau spécifique.
  • gateway : Spécifier la passerelle du réseau.

Cas d’usage

Le réseau bridge est idéal dans plusieurs situations :

  1. Applications multi-conteneurs sur un hôte unique : Vous pouvez héberger une application web et ses services associés, comme une base de données ou un serveur de cache, sur un même hôte en utilisant un réseau bridge pour leur permettre de communiquer entre eux.
  2. Développement local : Si vous développez des applications localement avec Docker, le réseau bridge est parfait pour tester des microservices ensemble, sans avoir besoin de les exposer publiquement.
  3. Séparation des services : Utiliser des réseaux bridge vous permet de créer des environnements cloisonnés, où chaque groupe de conteneurs communique de manière isolée des autres conteneurs qui tournent sur la même machine hôte.

Le réseau bridge offre une configuration simple, mais puissante pour relier vos conteneurs, tout en garantissant que vos services ne sont pas directement exposés au reste du réseau, sauf si vous le souhaitez explicitement.

Le type Overlay

Le réseau overlay est utilisé pour connecter des conteneurs déployés sur plusieurs hôtes dans un cluster Docker. Il permet à des services ou conteneurs exécutés sur des machines différentes de communiquer entre eux comme s’ils se trouvaient sur le même réseau local. C’est une solution essentielle pour des environnements de production distribués, particulièrement lors de l’utilisation de Docker Swarm ou Kubernetes.

Fonctionnement

Le réseau overlay permet de créer un réseau distribué sécurisé qui relie plusieurs hôtes Docker. Cela est possible grâce à une combinaison de tunnels réseau et de cryptage, garantissant une communication inter-hôtes fluide et sécurisée. Chaque conteneur qui rejoint un réseau overlay peut communiquer avec d’autres conteneurs sur ce réseau, peu importe sur quel hôte ils sont exécutés.

Ce type de réseau est utilisé principalement dans des configurations de Docker Swarm ou Kubernetes, où plusieurs nœuds doivent communiquer entre eux pour faire fonctionner un ensemble de services distribués.

Exemple d’utilisation

Imaginons que vous ayez un cluster Docker Swarm avec plusieurs nœuds, et que vous souhaitiez déployer un service de base de données Postgresql et un service web sur différents nœuds de votre cluster. Le réseau overlay vous permet de connecter ces services ensemble même s’ils ne tournent pas sur la même machine.

  1. Créez votre cluster Docker Swarm

  2. Créez un réseau overlay :

    Terminal window
    docker network create -d overlay mon_reseau_distribue
  3. Déployez vos services sur différents nœuds du cluster en les connectant au réseau overlay :

    Terminal window
    docker service create --name db --network mon_reseau_distribue postgres
    docker service create --name app --network mon_reseau_distribue my_web_app

Dans cet exemple, les services de base de données et d’application web peuvent communiquer entre eux via le réseau overlay, même s’ils sont exécutés sur des hôtes différents au sein du cluster Docker Swarm.

Paramètres disponibles

  • attachable : Permet aux conteneurs de rejoindre individuellement un réseau overlay.
  • encryption : Chiffre le trafic entre les nœuds du réseau overlay.
  • subnet : Définit le sous-réseau du réseau overlay.
  • gateway : Spécifie la passerelle.

Cas d’usage

Le réseau overlay est idéal pour les situations suivantes :

  1. Clusters distribués : Lors de l’utilisation de Docker Swarm ou Kubernetes, le réseau overlay est nécessaire pour connecter des services ou des conteneurs qui s’exécutent sur différents hôtes. C’est indispensable pour des architectures multi-nœuds.

  2. Haute disponibilité : Les applications distribuées, comme une application web déployée sur plusieurs nœuds pour la tolérance aux pannes, bénéficient de overlay pour assurer que tous les services peuvent interagir de manière fiable.

  3. Environnements de production : Les entreprises qui déploient des applications à grande échelle, avec des microservices répartis sur différents serveurs ou datacenters, utilisent overlay pour maintenir une communication constante et sécurisée entre leurs conteneurs.

Le réseau overlay est donc la solution puissante pour connecter des infrastructures conteneurisées dans des environnements distribués. Il permet une communication fluide et sécurisée entre les services, même lorsque ceux-ci s’exécutent sur des hôtes différents, rendant possible la mise en place d’applications distribuées complexes.

Le type Host

Le réseau host permet à un conteneur Docker de partager directement le réseau de la machine hôte sans passer par la virtualisation réseau habituelle de Docker. Cela signifie que le conteneur utilise l’interface réseau de l’hôte et partage la même adresse IP que la machine hôte. Contrairement aux autres types de réseaux, le mode host élimine la couche de translation d’adresses IP (NAT), ce qui peut améliorer les performances réseau dans certains cas.

Fonctionnement

Dans le mode host, le conteneur ne possède pas sa propre interface réseau isolée. Il accède directement à l’interface réseau de la machine hôte, ce qui signifie que tout port ouvert dans le conteneur sera également ouvert sur l’hôte. Cela permet d’accéder plus rapidement aux ressources réseau de l’hôte, car il n’y a pas de couche de virtualisation entre les deux.

Cependant, ce mode présente également des risques potentiels de sécurité, car le conteneur partage entièrement le réseau de l’hôte. Il est donc recommandé de l’utiliser uniquement lorsque vous avez une bonne raison d’exploiter l’interface réseau directement.

Exemple d’utilisation

Imaginons que vous exécutiez un service de surveillance comme Prometheus et que vous vouliez qu’il puisse accéder aux métriques du réseau de l’hôte directement, sans surcouche de virtualisation réseau.

  1. Lancez le conteneur en mode host :

    Terminal window
    docker run --network host postgres

Cas d’usage

Le mode host est idéal dans plusieurs situations spécifiques :

  1. Performance réseau : Si vous exécutez des applications nécessitant une latence réseau extrêmement faible ou des transferts de données très rapides, comme des outils de monitoring (par exemple Postgres) ou des serveurs de jeu, le mode host permet d’éviter la surcouche de NAT et d’accéder directement à l’interface réseau.
  2. Accès aux interfaces réseau spécifiques : Certaines applications doivent interagir directement avec les interfaces réseau de l’hôte, comme la capture de paquets réseau ou la gestion d’adresses IP spécifiques.
  3. Tests et diagnostics : Si vous effectuez des tests de diagnostic réseau et que vous souhaitez observer le comportement d’un conteneur dans le même environnement réseau que la machine hôte, le mode host permet d’éliminer les différences induites par la virtualisation réseau de Docker.

Cependant, il est important de noter que le mode host n’est pas recommandé pour des applications nécessitant une forte isolation réseau ou des configurations où la sécurité est une priorité, car les conteneurs peuvent avoir accès aux mêmes ports que l’hôte, augmentant les risques de conflits ou d’intrusions.

Le type Macvlan

Le réseau Macvlan permet d’attribuer une adresse MAC unique à chaque conteneur, le faisant apparaître comme un périphérique physique sur le réseau. Contrairement aux autres types de réseaux Docker, Macvlan permet au conteneur d’avoir sa propre adresse MAC distincte, permettant une intégration directe avec l’infrastructure réseau sous-jacente. Cela est particulièrement utile pour les applications héritées qui nécessitent une communication réseau directe, ou lorsque vous souhaitez éviter la surcouche de translation d’adresses réseau.

Fonctionnement

Le réseau Macvlan crée une interface virtuelle qui attribue une adresse MAC distincte à chaque conteneur. Les conteneurs peuvent ainsi apparaître comme des périphériques physiques sur le réseau local. La communication entre les conteneurs via Macvlan passe par le réseau physique externe, contrairement aux autres réseaux Docker qui utilisent des couches de virtualisation internes.

Ce mode est souvent utilisé lorsque l’on souhaite une séparation claire et distincte entre les conteneurs et l’hôte, tout en permettant une intégration native dans les réseaux d’entreprise.

Exemple d’utilisation

Imaginons que vous devez connecter un conteneur exécutant un serveur de base de données directement sur votre réseau d’entreprise, en lui attribuant une adresse IP distincte et en le faisant apparaître comme un appareil physique.

  1. Créez un réseau Macvlan avec une plage d’adresses IP spécifique :

    Terminal window
    docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 mon_reseau_macvlan
  2. Lancez un conteneur en le connectant à ce réseau :

    Terminal window
    docker run -d --network mon_reseau_macvlan --name db_container postgres

Dans cet exemple, le conteneur db_container obtiendra sa propre adresse MAC et une adresse IP distincte dans le réseau 192.168.1.0/24, ce qui lui permet de communiquer directement avec les autres appareils sur le réseau.

Paramètres disponibles

  • parent : Spécifie l’interface réseau physique utilisée.
  • macvlan_mode : Mode de fonctionnement (bridge, private, passthru, VEPA).
  • subnet : Spécifie le sous-réseau.
  • gateway : Définit la passerelle du réseau.

Cas d’usage

Le réseau Macvlan est utilisé dans les scénarios suivants :

  1. Applications héritées : Certaines applications anciennes nécessitent une intégration réseau directe avec une infrastructure physique et ne fonctionnent pas bien avec les couches de virtualisation réseau modernes.
  2. Isolation réseau complète : Vous pouvez isoler totalement un conteneur du réseau de l’hôte tout en le connectant directement à un réseau externe avec sa propre adresse IP et MAC.
  3. Environnements d’entreprise : Dans les environnements où la gestion des adresses IP et des adresses MAC est stricte, Macvlan permet d’intégrer des conteneurs directement dans les réseaux d’entreprise sans compromis sur l’infrastructure existante.

Le réseau Macvlan est une solution efficace lorsque vous avez besoin d’une intégration réseau directe et de hautes performances, tout en maintenant une séparation stricte entre les conteneurs et l’hôte.

Le type Ipvlan

Le réseau Ipvlan est une variante de Macvlan, qui permet également aux conteneurs de partager une interface réseau avec l’hôte. Cependant, contrairement à Macvlan, le réseau Ipvlan utilise l’adresse MAC de l’hôte et crée des interfaces réseau IP séparées pour chaque conteneur. Cela rend Ipvlan plus simple à configurer dans des environnements avec des restrictions strictes sur les adresses MAC, comme certains réseaux d’entreprise.

Fonctionnement

Avec Ipvlan, les conteneurs partagent l’interface physique de l’hôte, mais chaque conteneur a sa propre adresse IP distincte. Cela permet une séparation claire au niveau des adresses IP, tout en évitant d’ajouter de nouvelles adresses MAC sur le réseau. Il existe deux modes pour Ipvlan : L2 (couche de liaison) et L3 (couche réseau).

  • Mode L2 : Les conteneurs partagent la même interface physique et apparaissent comme des entités séparées sur le réseau, avec des adresses IP distinctes.
  • Mode L3 : Le routage est effectué au niveau de la couche 3, permettant une gestion plus flexible des adresses IP, mais limitant la découverte automatique des voisins sur le réseau local.

Exemple d’utilisation

Imaginons que vous souhaitiez utiliser Ipvlan pour attribuer des adresses IP distinctes aux conteneurs tout en conservant la même interface MAC. Voici comment configurer un réseau en mode L2.

  1. Créez un réseau Ipvlan :

    Terminal window
    docker network create -d ipvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 mon_reseau_ipvlan
  2. Lancez un conteneur connecté à ce réseau :

    Terminal window
    docker run -d --network mon_reseau_ipvlan --name my_container my_image

Dans cet exemple, chaque conteneur aura sa propre adresse IP dans le sous-réseau 192.168.1.0/24, tout en partageant l’interface MAC de l’hôte.

Paramètres disponibles

  • parent : Définit l’interface réseau physique.
  • ipvlan_mode : Mode de fonctionnement (L2 ou L3).
  • subnet : Définit le sous-réseau pour les conteneurs.
  • gateway : Spécifie la passerelle du réseau.

Cas d’usage

Le réseau Ipvlan est adapté pour les situations suivantes :

  1. Environnements avec limitations d’adresses MAC : Si votre réseau impose des restrictions sur le nombre d’adresses MAC, Ipvlan permet de contourner cette limitation en ne créant pas de nouvelles adresses MAC pour les conteneurs.

  2. Applications nécessitant une séparation d’adresses IP : Dans des scénarios où chaque conteneur doit avoir une adresse IP distincte pour des raisons de routage ou de gestion, Ipvlan permet de le faire sans ajouter de complexité au niveau des adresses MAC.

  3. Réseaux à haute densité : Lors de la gestion de nombreux conteneurs sur un réseau d’entreprise, Ipvlan offre une solution plus simple et flexible que Macvlan pour l’intégration dans l’infrastructure réseau existante.

Le réseau Ipvlan est une solution idéale pour des environnements à forte densité de conteneurs ou avec des contraintes d’adressage MAC, tout en permettant une gestion fine des adresses IP.

Conclusion

La configuration des réseaux dans Docker est un aspect fondamental pour garantir la communication et l’isolation entre vos conteneurs. Grâce aux différents types de réseaux comme bridge, host, overlay, ipvlan, macvlan et none, vous pouvez répondre à des besoins variés, que ce soit pour des applications distribuées, des tests locaux, ou des services nécessitant une isolation totale. En plus de cela, Docker vous offre des paramètres avancés comme la définition des sous-réseaux, des passerelles, et des plages d’adresses IP, permettant une personnalisation fine de vos environnements réseau.

Comprendre comment configurer ces paramètres et choisir le type de réseau adéquat vous permet de concevoir des infrastructures conteneurisées robustes, sécurisées et adaptées aux exigences de votre projet, qu’il s’agisse d’une simple application locale ou d’un cluster distribué complexe. Docker vous donne les outils nécessaires pour gérer efficacement la connectivité réseau de vos conteneurs, tout en assurant flexibilité et contrôle.