
Concepts de base du réseau de conteneurs
Découvrez les principes fondamentaux du réseau Docker : isolation, interfaces virtuelles, espaces de noms réseau et communication inter-conteneurs.
L'isolation réseau : le point de départ
Lorsque vous lancez un conteneur Docker, l'un des objectifs clés est l'isolation. Tout comme un conteneur isole les processus et le système de fichiers de l'hôte et des autres conteneurs, il bénéficie également par défaut d'une isolation réseau. Cela signifie que chaque conteneur obtient son propre espace réseau privé, avec sa propre pile réseau comprenant une ou plusieurs interfaces réseau virtuelles, une table de routage distincte, et son propre espace de ports (un service écoutant sur le port 80 dans un conteneur n'entre pas en conflit avec un autre service sur le même port dans un autre conteneur ou sur l'hôte).
Cette isolation est fondamentale pour la sécurité et la gestion des applications multi-conteneurs. Elle empêche les interférences directes entre les processus réseau des différents conteneurs et permet de déployer plusieurs applications utilisant les mêmes ports standards sans conflit. Mais alors, comment ces environnements isolés peuvent-ils communiquer ?
La réponse réside dans les mécanismes de réseau virtuel que Docker met en place. Docker agit comme un administrateur réseau virtuel, créant des réseaux virtuels et connectant les conteneurs à ces réseaux, tout en gérant l'adressage IP et le routage nécessaire pour permettre la communication contrôlée.
Les composants essentiels du réseau Docker
Pour comprendre comment fonctionne le réseau Docker, il faut connaître ses composants de base. Au coeur du système se trouve le concept d'espace de noms réseau (Network Namespace). Sur Linux, les namespaces sont une fonctionnalité du noyau permettant de partitionner les ressources système. Chaque conteneur s'exécute généralement dans son propre namespace réseau, ce qui lui confère sa pile réseau isolée mentionnée précédemment.
Ensuite, pour qu'un conteneur puisse communiquer, il lui faut une interface réseau. Docker crée typiquement une paire d'interfaces virtuelles Ethernet appelées veth pair. Une extrémité de cette paire est placée à l'intérieur du namespace réseau du conteneur (apparaissant comme `eth0` par exemple), tandis que l'autre extrémité est connectée à un réseau Docker (Docker Network) sur l'hôte.
Un réseau Docker peut être vu comme un commutateur (switch) ou un pont (bridge) virtuel. Les conteneurs attachés à un même réseau Docker peuvent communiquer entre eux. Docker crée plusieurs types de réseaux, le plus courant par défaut étant le réseau `bridge`. Lorsqu'un conteneur est connecté à un réseau `bridge`, son interface `veth` est connectée à ce pont virtuel sur l'hôte.
Le démon Docker joue le rôle de chef d'orchestre. Il gère la création et la suppression des réseaux, l'assignation des adresses IP aux conteneurs (fonctionnant un peu comme un serveur DHCP pour ses réseaux virtuels), la configuration du routage entre les réseaux Docker et vers l'extérieur, et la gestion des règles de pare-feu (souvent via `iptables` sur Linux) pour contrôler le trafic et implémenter le mappage de ports.
Communication inter-conteneurs et externe
Grâce à ces mécanismes, la communication devient possible. Les conteneurs connectés au même réseau Docker peuvent communiquer directement entre eux en utilisant leurs adresses IP attribuées par Docker. Mieux encore, Docker intègre un serveur DNS embarqué qui permet aux conteneurs sur les réseaux définis par l'utilisateur (user-defined networks) de se résoudre mutuellement par leur nom de conteneur. C'est une fonctionnalité extrêmement pratique pour les applications microservices.
Pour la communication entre conteneurs situés sur des réseaux Docker différents, Docker gère le routage nécessaire si la configuration le permet, bien qu'il soit généralement préférable de placer les conteneurs qui doivent communiquer fréquemment sur le même réseau pour des raisons de simplicité et de performance.
La communication d'un conteneur vers le monde extérieur (par exemple, pour télécharger une mise à jour ou appeler une API externe) se fait généralement via la machine hôte. Le réseau `bridge` par défaut, par exemple, utilise la traduction d'adresses réseau (NAT) via l'interface réseau principale de l'hôte. Le trafic sortant du conteneur semble provenir de l'adresse IP de l'hôte.
Enfin, pour que le monde extérieur puisse atteindre un service s'exécutant à l'intérieur d'un conteneur (par exemple, un serveur web), Docker utilise le mappage de ports (Port Mapping). Vous spécifiez qu'un port sur l'adresse IP de l'hôte doit être redirigé vers un port spécifique sur l'adresse IP interne du conteneur. C'est ce que font les options `-p` ou `-P` de la commande `docker run`. Sans mappage de port, les services d'un conteneur sur un réseau `bridge` ne sont pas accessibles depuis l'extérieur par défaut.
Les réseaux par défaut : un aperçu
Lorsque Docker est installé, il crée automatiquement quelques réseaux pour faciliter les cas d'usage courants. Le plus important est le réseau `bridge` par défaut (souvent nommé `docker0` sur l'hôte Linux). C'est le réseau auquel les conteneurs sont connectés si aucun autre réseau n'est spécifié lors de leur création avec `docker run`. Il permet la communication inter-conteneurs via leurs adresses IP (mais pas par nom par défaut) et la communication sortante via NAT.
Le réseau `host` supprime l'isolation réseau. Un conteneur attaché au réseau `host` partage directement la pile réseau de l'hôte. Il n'a pas sa propre adresse IP et utilise les interfaces et ports de l'hôte. C'est simple mais brise l'isolation et peut entraîner des conflits de ports.
Le réseau `none` fournit également une isolation, mais sans aucune interface réseau configurée à part l'interface de loopback (`lo`). Un conteneur sur le réseau `none` est complètement isolé du réseau et ne peut communiquer ni avec d'autres conteneurs ni avec l'extérieur. Utile pour des tâches qui n'ont pas besoin de connectivité réseau.
Comprendre ces concepts de base – isolation via namespaces, connexion via veth pairs aux réseaux Docker, gestion par le démon Docker, et principes de communication – est essentiel avant d'explorer plus en détail les différents pilotes réseau et les commandes de gestion que nous aborderons dans les sections suivantes.