Objectifs
- Comprendre les concepts de base du réseau dans Docker pour l’isolation et la communication.
- Connaître les principaux types de réseaux (drivers) :
bridge,hostetnone. - Créer et gérer un réseau “bridge” personnalisé pour faire communiquer des conteneurs.
- Connecter des conteneurs à un réseau et vérifier leur communication par nom.
L’isolation réseau par défaut
Par défaut, Docker fournit une isolation réseau forte. Un conteneur ne peut pas communiquer avec un autre conteneur, ni avec la machine hôte, sauf si vous l’y autorisez explicitement. Cette isolation est une fonctionnalité de sécurité clé.
Les principaux drivers réseau
1. bridge (le pont)
C’est le driver par défaut. Docker crée un réseau privé virtuel sur votre machine. Chaque conteneur attaché à ce réseau obtient sa propre adresse IP interne.
- Réseau
bridgepar défaut : Si vous lancez des conteneurs sans spécifier de réseau, ils sont attachés à un réseaubridgepar défaut. La communication entre eux est possible mais déconseillée (via leur IP interne qui peut changer). - Réseau
bridgepersonnalisé : C’est la bonne pratique. En créant votre propre réseau, vous obtenez une meilleure isolation et, surtout, un service de découverte par nom (DNS). Les conteneurs sur le même réseau personnalisé peuvent se “trouver” et communiquer en utilisant simplement leur nom.
2. host (l’hôte)
Avec ce driver, le conteneur partage directement l’interface réseau de la machine hôte. Il n’y a plus d’isolation réseau.
- Avantage : Performance maximale (pas de couche de virtualisation réseau).
- Inconvénient : Moins de sécurité. Le conteneur peut accéder à tous les services tournant sur
localhostde l’hôte. À utiliser avec précaution.
3. none (aucun)
Le conteneur est complètement isolé du réseau. Il a une interface de “loopback” (lo) mais aucune interface externe. C’est utile pour des conteneurs qui effectuent des tâches de traitement en batch et n’ont pas besoin de communiquer.
Utiliser les réseaux personnalisés
C’est ce que vous ferez le plus souvent (et c’est ce que docker-compose fait pour vous automatiquement).
Étape 1 : Créer un réseau
docker network create mon_super_reseau
Étape 2 : Lancer des conteneurs sur ce réseau
# On lance un premier conteneur (une base de données)
docker run -d --name ma_db --network mon_super_reseau postgres:15-alpine
# On lance un deuxième conteneur (une application)
docker run -it --name mon_app --network mon_super_reseau bash
Étape 3 : Vérifier la communication
Vous êtes maintenant dans le shell du conteneur mon_app. Vous pouvez communiquer avec le conteneur ma_db en utilisant son nom.
# À l'intérieur du conteneur 'mon_app'
# On peut "pinger" le service 'ma_db' par son nom
ping ma_db
# PING ma_db (172.19.0.2): 56 data bytes
# 64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.082 ms
La résolution DNS a fonctionné !
Commandes utiles
docker network ls: Lister tous les réseaux Docker sur votre machine.docker network create <nom_reseau>: Créer un nouveau réseau (de typebridgepar défaut).docker network inspect <nom_reseau>: Afficher des informations détaillées sur un réseau, y compris les conteneurs qui y sont connectés.docker network rm <nom_reseau>: Supprimer un réseau.docker network connect <reseau> <conteneur>: Connecter un conteneur en cours d’exécution à un réseau supplémentaire.docker network disconnect <reseau> <conteneur>: Le déconnecter.
Bonnes pratiques
- Créez toujours un réseau
bridgepersonnalisé pour votre application. Ne vous fiez pas au réseau par défaut. Cela garantit une meilleure isolation et la découverte par nom. - Utilisez
docker-composepour vos projets multi-conteneurs ; il gère la création du réseau pour vous. - N’exposez publiquement (
-p) que les ports qui doivent être accessibles de l’extérieur (ex: le port de votre serveur web). Les communications entre services (ex: entre le web et la base de données) doivent rester sur le réseau privé Docker.
Exercices
-
Créez et inspectez :
- Créez un nouveau réseau nommé
test-net. - Utilisez
docker network lspour vérifier qu’il est bien créé. - Utilisez
docker network inspect test-netpour voir ses détails.
- Créez un nouveau réseau nommé
-
Lancez deux conteneurs :
- Lancez un conteneur Nginx nommé
web1sur le réseautest-net. - Lancez un conteneur
busyboxen mode interactif (-it) nommédebugsur le même réseau.docker run -it --name debug --network test-net busybox sh
- Lancez un conteneur Nginx nommé
-
Testez la communication :
- Depuis le shell du conteneur
debug, exécutezping web1. Vous devriez voir que la communication fonctionne. - Essayez d’exécuter
wget -O - http://web1. Vous devriez recevoir le code HTML de la page d’accueil de Nginx.
- Depuis le shell du conteneur
-
Nettoyez :
- Quittez le conteneur
debug(exit). - Arrêtez et supprimez les deux conteneurs (
web1etdebug). - Supprimez le réseau
test-net.
- Quittez le conteneur