Retour à l'accueil

Explication du Réseau des Conteneurs Docker : Guide Pratique

Ce guide complet explique le réseau des conteneurs Docker de A à Z, couvrant les limitations du bridge par défaut, les avantages du bridge défini par l'utilisateur, les principaux pilotes réseau, la découverte de services DNS, la publication de ports et les étapes de configuration pratique. Il donne aux développeurs et administrateurs système les connaissances nécessaires pour construire des applications conteneurisées sécurisées, isolées et évolutives.

Réseau Docker : Guide Complet des Conteneurs
Advertisement 728x90

Réseautage des conteneurs Docker : Guide pratique

Réseautage des conteneurs Docker : Guide pratique

Lorsque vous commencez à travailler avec Docker, l'une des premières complexités que vous rencontrez est la façon dont les conteneurs communiquent entre eux et avec le monde extérieur. Le réseautage des conteneurs Docker expliqué simplement est le système de réseaux virtuels et de règles qui permet cette communication, offrant isolation, sécurité et connectivité pour vos applications conteneurisées. Comprendre ces concepts n'est pas seulement théorique ; c'est fondamental pour construire des déploiements de conteneurs sécurisés, évolutifs et maintenables.

Ce que vous allez apprendre

Vous comprendrez les concepts fondamentaux du modèle de réseautage de Docker, du pont par défaut aux pilotes spécialisés, et apprendrez à configurer des réseaux sécurisés et isolés pour vos conteneurs. À la fin, vous serez capable de concevoir des topologies réseau qui isolent les services sensibles, permettent une découverte de services transparente et résolvent les problèmes de connectivité courants, avec le point clé étant que les réseaux pont définis par l'utilisateur sont nettement supérieurs au pont par défaut pour la plupart des cas d'utilisation en production.

Google AdInline article slot

Le cœur du réseautage Docker

Au cœur du sujet, le réseautage des conteneurs fait référence à la capacité des conteneurs à se connecter et à communiquer entre eux, ainsi qu'avec les services réseau non-Docker. Par défaut, les conteneurs ont le réseautage activé et peuvent établir des connexions sortantes. Un conteneur voit une interface réseau avec une adresse IP, une passerelle, une table de routage et des services DNS, mais n'a aucune information sur le type de réseau auquel il est connecté ni sur le fait que ses pairs sont également des conteneurs Docker.

Lorsque le moteur Docker démarre pour la première fois sur Linux, il crée un seul réseau intégré appelé le réseau « pont par défaut ». Si vous exécutez un conteneur sans l'option --network, il se connecte à ce pont par défaut. Bien que fonctionnelle, cette configuration par défaut présente des limitations importantes, notamment l'absence de résolution DNS automatique entre les conteneurs.

Réseaux pont définis par l'utilisateur : le choix supérieur

Pour toute application sérieuse, vous devriez créer des réseaux pont définis par l'utilisateur. Ces réseaux personnalisés offrent plusieurs avantages critiques par rapport au pont par défaut :

Google AdInline article slot
  1. Résolution DNS automatique : Les conteneurs sur un pont défini par l'utilisateur peuvent se résoudre mutuellement par nom de conteneur ou alias. Par exemple, un conteneur web peut se connecter à un conteneur db simplement en utilisant le nom d'hôte db. Cela n'est pas possible sur le pont par défaut, qui nécessite les anciens indicateurs --link ou une manipulation manuelle de /etc/hosts.

  2. Meilleure isolation : Tous les conteneurs sans --network spécifié se connectent au réseau pont par défaut, créant un risque où des conteneurs non liés peuvent communiquer. Les réseaux définis par l'utilisateur fournissent un réseau délimité, isolant les conteneurs les uns des autres sauf s'ils sont explicitement connectés.

  3. Attacher et détacher à la volée : Vous pouvez connecter ou déconnecter un conteneur en cours d'exécution de réseaux définis par l'utilisateur sans le redémarrer. Pour changer le réseau d'un conteneur sur le pont par défaut, vous devez l'arrêter et le recréer.

    Google AdInline article slot
  4. Ponts configurables : Chaque réseau défini par l'utilisateur peut être configuré avec ses propres paramètres (comme l'unité de transmission maximale et les règles de pare-feu), vous permettant d'adapter les réseaux aux différents besoins des applications.

Comment créer et utiliser un réseau pont personnalisé

Créer et utiliser un réseau pont personnalisé est simple. C'est la base d'une configuration de réseautage Docker sécurisée et gérable.

Étape 1 : Créer le réseau.

docker network create mon-reseau-securise

Par défaut, cela crée un réseau pont. Vous pouvez également spécifier un pilote avec l'indicateur -d (par exemple, docker network create -d bridge mon-reseau).

Étape 2 : Exécuter des conteneurs sur ce réseau.

docker run -d --name web --network mon-reseau-securise nginx
docker run -d --name db --network mon-reseau-securise postgres

Le conteneur web peut maintenant communiquer avec le conteneur db en utilisant le nom d'hôte db.

Étape 3 : Connecter un conteneur en cours d'exécution au réseau.

docker network connect mon-reseau-securise conteneur-deja-en-cours

Un conteneur peut être attaché à plusieurs réseaux simultanément, une fonctionnalité puissante pour créer des schémas de réseautage complexes comme un frontal connecté à la fois à un réseau externe et à un réseau interne de backend.

Pilotes réseau clés et leurs cas d'utilisation

Le réseautage de Docker est modulaire, utilisant des pilotes pour fournir des fonctionnalités de base. Voici un aperçu des principaux pilotes que vous rencontrerez.

Pilote Description Idéal pour
bridge Le pilote réseau par défaut. Crée un réseau interne privé sur l'hôte. Applications mono-hôte où les conteneurs doivent communiquer entre eux. C'est le choix standard et le plus courant.
host Supprime l'isolation réseau. Le conteneur partage directement la pile réseau de l'hôte. Applications critiques en termes de performances ou services qui doivent gérer de nombreux ports ou opérations au niveau réseau (par exemple, un serveur DNS/DHCP à l'échelle du réseau comme Pi-hole). Avertissement de sécurité : Ce mode supprime une couche d'isolation clé.
none Désactive le réseautage pour un conteneur. Il n'a qu'une interface de boucle locale (lo). Tâches hautement isolées comme le traitement par lots hors ligne ou les tâches qui n'ont besoin d'aucun accès réseau.
overlay Connecte plusieurs démons Docker ensemble, permettant la communication entre hôtes. Clusters Docker Swarm et applications multi-hôtes.
macvlan Attribue une adresse MAC à un conteneur, le faisant apparaître comme un périphérique physique sur votre réseau. Applications héritées ou migrations de machines virtuelles où le conteneur doit être directement sur le réseau physique.
ipvlan Similaire à macvlan mais sans adresses MAC uniques, donnant un contrôle total sur l'adressage IPv4/IPv6. Environnements réseau où il y a une restriction sur le nombre d'adresses MAC pouvant être attribuées.

Pour la plupart des développeurs, le pilote bridge — spécifiquement, un pont défini par l'utilisateur — sera l'outil principal de leur arsenal.

Comprendre le mode hôte en profondeur

Le pilote réseau host est un outil puissant mais spécialisé. Il supprime l'isolation réseau entre le conteneur et l'hôte Docker, ce qui signifie que le conteneur utilise directement la pile réseau de l'hôte. Comme l'a noté un praticien, cela est idéal pour les services qui nécessitent la gestion du trafic de diffusion, tels que les services DNS et DHCP.

⚠️ Avertissement crucial : Le réseautage hôte n'est pas compatible multiplateforme. Il fonctionne comme prévu uniquement sur les hôtes Linux. Sur macOS et Windows (via Docker Desktop), il se comporte différemment en raison de l'implémentation de la machine virtuelle. De plus, vous perdez la possibilité d'utiliser la découverte de services DNS de Docker pour le conteneur et ne pouvez pas l'attacher à d'autres réseaux en mode hôte.

Exemple avec Docker Compose :

version: "3"
services:
  web:
    image: nginx:latest
    network_mode: host

Ce conteneur sera directement accessible sur l'adresse IP de votre hôte. Aucune directive ports n'est nécessaire.

Publication des ports : Connecter les conteneurs au monde extérieur

Par défaut, les ports sur les réseaux pont ne sont pas accessibles depuis l'extérieur de l'hôte. Pour rendre un service disponible à l'extérieur, vous publiez les ports en utilisant l'indicateur -p ou --publish.

docker run -d -p 8080:80 --name serveurweb nginx

Cela mappe le port 8080 sur l'hôte Docker au port 80 dans le conteneur. Le trafic arrivant à l'adresse IP de votre hôte sur le port 8080 est redirigé vers le conteneur.

  • Pour publier tous les ports exposés, utilisez l'indicateur -P.
  • Pour restreindre l'accès à l'hôte local uniquement, publiez sur 127.0.0.1 : docker run -p 127.0.0.1:8080:80 nginx.
  • Il est important de noter que vous n'avez pas besoin de publier les ports pour que les conteneurs sur le même réseau pont communiquent entre eux ; ils peuvent le faire directement en utilisant leurs noms de conteneur et leurs ports.

DNS et découverte de services

Par défaut, les conteneurs héritent des paramètres DNS de l'hôte Docker. Cependant, une différence critique existe :

  • Réseau pont par défaut : Les conteneurs reçoivent une copie du fichier /etc/resolv.conf de l'hôte.
  • Réseaux définis par l'utilisateur : Les conteneurs utilisent le serveur DNS intégré de Docker à 127.0.0.11. Ce serveur transmet les requêtes DNS externes aux serveurs configurés de l'hôte. Ce DNS intégré est ce qui permet la résolution magique des noms de conteneurs. Si une application à l'intérieur d'un conteneur doit interroger explicitement le serveur DNS de Docker, elle doit utiliser l'adresse 127.0.0.11.

Vous pouvez remplacer les paramètres DNS par conteneur en utilisant des indicateurs comme --dns, --dns-search et --dns-opt.

Flux de travail pratique : Changer le réseau d'un conteneur

Changer la configuration réseau d'un conteneur peut être fait, mais il y a des limitations importantes.

  1. Pour un conteneur sur un réseau pont : Vous pouvez l'attacher et le détacher des réseaux à la volée.

    # Attacher un conteneur en cours d'exécution à un réseau personnalisé
    docker network connect mon-nouveau-reseau mon-conteneur
    # Le détacher du pont par défaut
    docker network disconnect bridge mon-conteneur

    Vous ne pouvez pas déconnecter un conteneur de son dernier réseau ; il doit toujours être attaché à au moins un.

  2. Pour un conteneur sur un réseau hôte : Il est impossible de changer sa configuration réseau ou de le connecter à un autre réseau pendant qu'il est en cours d'exécution. Vous rencontrerez une erreur si vous essayez :

    Error response from daemon: container sharing network namespace with another container or host cannot be connected to any other network

    Pour changer son réseau, vous devez arrêter, supprimer et recréer le conteneur, en préservant sa configuration en utilisant les mêmes variables d'environnement, volumes et autres paramètres.

Questions fréquemment posées

Quelle est la différence entre le pont par défaut et un réseau pont défini par l'utilisateur ? La différence la plus importante est la résolution DNS automatique : les conteneurs sur un pont défini par l'utilisateur peuvent communiquer par nom de conteneur, tandis que les conteneurs sur le pont par défaut ne peuvent se joindre que par adresse IP. Les réseaux définis par l'utilisateur offrent également une meilleure isolation et la flexibilité d'attacher/détacher les conteneurs à la volée.

Comment rendre un conteneur accessible depuis mon réseau local ou Internet ? Vous devez publier les ports du conteneur en utilisant l'indicateur -p ou --publish. Par exemple, -p 8080:80 mappe le port 8080 sur votre hôte Docker au port 80 dans le conteneur, rendant le service disponible sur l'adresse IP de votre hôte.

Puis-je connecter un conteneur à plusieurs réseaux ? Oui, c'est une fonctionnalité puissante. Un conteneur peut être connecté à plusieurs réseaux simultanément en utilisant l'indicateur --network plusieurs fois lors de sa création ou la commande docker network connect pour les conteneurs en cours d'exécution. Cela est utile pour créer une application avec à la fois des réseaux externes et internes privés.

Pourquoi ne puis-je pas pinguer mes conteneurs depuis l'hôte Docker ? Sur Docker Desktop pour Mac et Windows, vous ne pouvez pas pinguer directement les conteneurs Linux depuis l'hôte en raison de la façon dont le réseautage est implémenté dans la machine virtuelle. C'est une limitation connue, et l'interface pont docker0 n'est pas visible sur l'hôte. Un utilisateur Windows, cependant, peut pinguer les conteneurs Windows.

Quand devrais-je utiliser le pilote réseau host ? Vous devriez utiliser le pilote host uniquement pour des cas d'utilisation spécifiques où les performances réseau natives sont critiques ou que le service doit gérer des fonctions au niveau réseau (comme un serveur DNS/DHCP). Cela se fait au détriment de la sécurité et de la portabilité, car cela ne fonctionne de manière fiable que sur Linux et supprime l'isolation réseau.

Sources

— Editorial Team

Advertisement 728x90

Lire ensuite