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.


1

Révision : Volumes & Bind Mounts

Testez vos connaissances de la semaine précédente avant d'attaquer le réseau.

1. Quelle est la différence principale entre un Volume et un Bind Mount ?

2. Si je supprime un conteneur, les données dans un Volume nommé sont-elles perdues ?

3. Quelle option permet de monter le dossier courant (`.`) dans `/app` du conteneur ?

2

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.
Host (192.168.x.x)
docker0 (172.17.0.1)
Container A
172.17.0.2
Container B
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.

docker run -p 8080:80 nginx

8080 : Port sur la machine Hôte (Public)
80 : Port interne du Conteneur (Privé)

User
Requête :8080
Host
:8080
NAT
Container
:80

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.
3

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.

Assurez-vous que Docker Desktop ou le démon Docker est lancé.

1. Lister les réseaux disponibles :

bash
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
Concept clé : Grâce au réseau 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