Le Réseau Docker : Partie 1
Un focus technique sur la manière dont Docker connecte les conteneurs au monde extérieur.
Nous explorerons l'interface docker0, le mécanisme de NAT et les différents drivers.
Révision : Volumes & Bind Mounts
Testez vos connaissances de la semaine précédente avant d'attaquer le réseau.
Théorie : L'architecture Réseau
L'interface docker0
Par défaut, Docker crée un "pont virtuel" (bridge) nommé docker0 sur la machine hôte.
- Agit comme un Switch Virtuel.
- Attribue une IP privée à chaque conteneur (ex: 172.17.0.2).
- Permet aux conteneurs de communiquer entre eux sur ce même pont.
172.17.0.2
172.17.0.3
Port Mapping & NAT
Les conteneurs sont isolés. Pour qu'un utilisateur externe accède à un service, on utilise le NAT (Network Address Translation) via l'option -p.
8080 : Port sur la machine Hôte (Public)
80 : Port interne du Conteneur (Privé)
Les 3 Drivers Réseau principaux
| Driver | Description | Cas d'usage |
|---|---|---|
| bridge | Le défaut. Réseau privé isolé, communication via IP, accès externe via NAT (-p). | Applications standards, Microservices isolés. |
| host | Le conteneur partage l'IP de l'hôte. Pas d'isolation réseau. Pas besoin de -p. | Performance max, Protocoles complexes (VoIP), Outils réseau. |
| none | Aucune interface réseau (juste localhost). Totalement coupé du monde. | Traitements batch sécurisés, Tâches de fond sans besoin internet. |
Pratique : Exploration & Manipulation
Exercice 1 : Inspecter le réseau Bridge
Objectif : Comprendre la structure du réseau par défaut et identifier l'interface Gateway.
1. Lister les réseaux disponibles :
docker network ls
2. Inspecter le réseau "bridge" pour voir la Gateway et le sous-réseau :
docker network inspect bridge
Exercice 2 : Communication Inter-Conteneurs
Nous allons lancer deux conteneurs `alpine` (très légers) et les faire communiquer via Ping.
1. Lancer deux conteneurs en mode détaché :
docker run -dit --name box1 alpine ash
docker run -dit --name box2 alpine ash
2. Récupérer l'adresse IP de box2 :
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' box2
3. Entrer dans box1 et pinger box2 (remplacez l'IP par celle obtenue) :
docker exec -it box1 ash
# Une fois à l'intérieur :
ping 172.17.0.3
Exercice 3 : Les modes Host et None
Mode Host (Linux Uniquement*)
*Sur Docker Desktop (Mac/Win), le mode host est émulé et ne fonctionne pas exactement pareil.
docker run --rm -it --network host alpine ip addr show
Observez que les interfaces sont identiques à votre machine hôte.
Mode None
docker run --rm -it --network none alpine ip addr show
Observez qu'il n'y a que l'interface lo (loopback).
Exercice 4 : Architecture Client-Serveur (MySQL & PMA)
Objectif : Connecter deux conteneurs via un réseau personnalisé pour qu'ils communiquent par nom DNS (le conteneur `pma` trouvera `db` par son nom).
1. Créer un réseau dédié (User-Defined Bridge) :
docker network create net-app
2. Lancer MySQL sur ce réseau :
docker run -d --name db --network net-app -e MYSQL_ROOT_PASSWORD=secret mysql:5.7
3. Lancer phpMyAdmin (connecté au même réseau) :
docker run -d --name pma --network net-app -p 8080:80 -e PMA_HOST=db phpmyadmin
net-app, nous avons pu dire à phpMyAdmin que l'hôte de la base de données est db (le nom du conteneur). Docker gère la résolution DNS automatiquement.Accédez à http://localhost:8080 pour tester (User: root, Pass: secret).
Nettoyage global :
docker rm -f box1 box2 db pma && docker network rm net-app