Aller au contenu principal

Réseaux Docker


Objectifs du chapitre

  • Comprendre les types de réseaux Docker
  • Créer et configurer des réseaux
  • Connecter des conteneurs entre eux
  • Isoler les applications

1 - Introduction aux réseaux Docker

Pourquoi les réseaux Docker ?

Les réseaux Docker permettent :

  • Communication entre conteneurs
  • Isolation des applications
  • Résolution DNS automatique
  • Contrôle du trafic réseau

Les réseaux par défaut

# Lister les réseaux
docker network ls

# Résultat
NETWORK ID NAME DRIVER SCOPE
abc123... bridge bridge local
def456... host host local
ghi789... none null local

2 - Types de réseaux (drivers)

Bridge (par défaut)

┌─────────────────────────────────────────────────────────────┐
│ Hôte │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ docker0 (bridge) │ │
│ │ 172.17.0.1 │ │
│ └────────┬─────────────────┬─────────────────┬────────┘ │
│ │ │ │ │
│ ┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐ │
│ │ Container │ │ Container │ │ Container │ │
│ │ 172.17.0.2│ │ 172.17.0.3│ │ 172.17.0.4│ │
│ └───────────┘ └───────────┘ └───────────┘ │
└─────────────────────────────────────────────────────────────┘
  • Réseau isolé sur l'hôte
  • Les conteneurs peuvent communiquer entre eux
  • NAT pour accéder à l'extérieur

Host

# Le conteneur utilise directement le réseau de l'hôte
docker run --network host nginx

# Pas d'isolation réseau
# Port 80 du conteneur = Port 80 de l'hôte

None

# Aucune interface réseau
docker run --network none alpine ip addr

# Uniquement loopback (127.0.0.1)

Overlay (Swarm)

  • Communication entre plusieurs hôtes Docker
  • Utilisé avec Docker Swarm
  • Chiffrement disponible

Macvlan

# Chaque conteneur a sa propre adresse MAC
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
mon-macvlan

Comparaison

DriverIsolationMulti-hôteUsage
bridgeOuiNonDéveloppement, production simple
hostNonNonPerformance maximale
noneTotaleNonSécurité maximale
overlayOuiOuiSwarm, clusters
macvlanOuiNonIntégration réseau existant

3 - Gestion des réseaux

Créer un réseau

# Réseau bridge simple
docker network create mon-reseau

# Avec configuration personnalisée
docker network create \
--driver bridge \
--subnet 172.20.0.0/16 \
--ip-range 172.20.240.0/20 \
--gateway 172.20.0.1 \
mon-reseau-custom

# Réseau interne (sans accès externe)
docker network create --internal mon-reseau-interne

Lister et inspecter

# Lister les réseaux
docker network ls

# Filtrer
docker network ls --filter driver=bridge

# Inspecter un réseau
docker network inspect mon-reseau

# Voir les conteneurs connectés
docker network inspect mon-reseau --format '{{range .Containers}}{{.Name}} {{end}}'

Supprimer des réseaux

# Supprimer un réseau
docker network rm mon-reseau

# Supprimer les réseaux non utilisés
docker network prune

# Forcer
docker network prune -f

4 - Connecter des conteneurs

Au démarrage

# Connecter à un réseau spécifique
docker run -d --name web --network mon-reseau nginx

# Avec une IP fixe
docker run -d --name db \
--network mon-reseau \
--ip 172.20.0.10 \
postgres:15

Après démarrage

# Connecter un conteneur existant
docker network connect mon-reseau mon-conteneur

# Avec une IP spécifique
docker network connect --ip 172.20.0.20 mon-reseau mon-conteneur

# Déconnecter
docker network disconnect mon-reseau mon-conteneur

Conteneur sur plusieurs réseaux

# Créer deux réseaux
docker network create frontend
docker network create backend

# Connecter un conteneur aux deux réseaux
docker run -d --name api --network frontend mon-api
docker network connect backend api

# L'API peut communiquer avec frontend ET backend

5 - Résolution DNS

DNS automatique dans les réseaux personnalisés

# Créer un réseau
docker network create mon-app

# Lancer des conteneurs
docker run -d --name db --network mon-app postgres:15
docker run -d --name web --network mon-app nginx

# Les conteneurs peuvent se résoudre par leur nom
docker exec web ping db
# PING db (172.20.0.2): 56 data bytes

Aliases réseau

# Créer un alias
docker run -d \
--name postgres-primary \
--network mon-app \
--network-alias db \
--network-alias database \
postgres:15

# Les deux alias fonctionnent
docker exec web ping db
docker exec web ping database

DNS Round-Robin

# Plusieurs conteneurs avec le même alias
docker run -d --name web1 --network mon-app --network-alias web nginx
docker run -d --name web2 --network mon-app --network-alias web nginx
docker run -d --name web3 --network mon-app --network-alias web nginx

# Le DNS retourne toutes les IPs (load balancing basique)
docker run --rm --network mon-app alpine nslookup web

6 - Communication entre conteneurs

Exemple : Application Web + Base de données

# Créer le réseau
docker network create webapp

# Lancer la base de données
docker run -d \
--name db \
--network webapp \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=myapp \
postgres:15

# Lancer l'application
docker run -d \
--name app \
--network webapp \
-e DATABASE_URL=postgres://postgres:secret@db:5432/myapp \
-p 3000:3000 \
mon-app

Exemple : Architecture microservices

# Créer les réseaux
docker network create frontend
docker network create backend

# Base de données (backend uniquement)
docker run -d \
--name postgres \
--network backend \
-e POSTGRES_PASSWORD=secret \
postgres:15

# API (frontend + backend)
docker run -d \
--name api \
--network backend \
-e DB_HOST=postgres \
mon-api
docker network connect frontend api

# Frontend (frontend uniquement)
docker run -d \
--name nginx \
--network frontend \
-p 80:80 \
nginx
┌─────────────────────────────────────────────────────────────┐
│ │
│ ┌──────────────── frontend ────────────────┐ │
│ │ │ │
│ │ ┌───────────┐ ┌───────────┐ │ │
│ │ │ nginx │ ───── │ api │ │ │
│ │ │ :80 │ │ │ │ │
│ │ └───────────┘ └─────┬─────┘ │ │
│ │ │ │ │
│ └─────────────────────────────┼────────────┘ │
│ │ │
│ ┌──────────────── backend ────┼────────────┐ │
│ │ │ │ │
│ │ ┌─────▼─────┐ │ │
│ │ │ postgres │ │ │
│ │ │ :5432 │ │ │
│ │ └───────────┘ │ │
│ │ │ │
│ └──────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

7 - Publication de ports

Syntaxe

# Format
-p [IP_HOTE:]PORT_HOTE:PORT_CONTENEUR[/PROTOCOLE]

# Exemples
-p 8080:80 # Toutes les interfaces
-p 127.0.0.1:8080:80 # Localhost uniquement
-p 80:80 -p 443:443 # Plusieurs ports
-p 8080:80/tcp # TCP explicite
-p 5000:5000/udp # UDP

Publier tous les ports exposés

# Publie tous les ports EXPOSE sur des ports aléatoires
docker run -d -P nginx

# Voir les ports assignés
docker port mon-conteneur
# 80/tcp -> 0.0.0.0:32768

Vérifier les ports

# Ports d'un conteneur
docker port mon-conteneur

# Dans docker ps
docker ps --format "table {{.Names}}\t{{.Ports}}"

# Depuis l'extérieur
curl http://localhost:8080

8 - Sécurité réseau

Réseaux internes

# Créer un réseau sans accès externe
docker network create --internal secure-net

# Les conteneurs ne peuvent pas accéder à Internet
docker run --network secure-net alpine ping google.com
# ping: bad address 'google.com'

Isolation des applications

# Application 1 sur son propre réseau
docker network create app1-net
docker run -d --name app1-db --network app1-net postgres:15
docker run -d --name app1-web --network app1-net -p 8001:80 nginx

# Application 2 sur son propre réseau
docker network create app2-net
docker run -d --name app2-db --network app2-net postgres:15
docker run -d --name app2-web --network app2-net -p 8002:80 nginx

# app1 ne peut PAS communiquer avec app2

Bonnes pratiques

# ✅ Utiliser des réseaux personnalisés (pas bridge par défaut)
docker network create mon-app

# ✅ Exposer uniquement les ports nécessaires
-p 127.0.0.1:3000:3000 # Localhost uniquement

# ✅ Utiliser des réseaux internes pour les BDD
docker network create --internal db-net

# ✅ Séparer frontend et backend
docker network create frontend
docker network create --internal backend

9 - Debugging réseau

Inspecter la connectivité

# Voir la configuration réseau d'un conteneur
docker inspect mon-conteneur --format '{{json .NetworkSettings.Networks}}'

# Tester la connectivité
docker exec mon-conteneur ping autre-conteneur

# Voir les connexions
docker exec mon-conteneur netstat -an

# Résolution DNS
docker exec mon-conteneur nslookup service-name

Outils de debug

# Conteneur de debug avec outils réseau
docker run -it --network mon-reseau nicolaka/netshoot

# Dans le conteneur netshoot
ping db
nslookup web
curl http://api:3000
tcpdump -i eth0

Problèmes courants

ProblèmeCause probableSolution
Conteneur inaccessiblePas sur le même réseaudocker network connect
DNS ne résout pasRéseau bridge par défautUtiliser un réseau personnalisé
Port inaccessibleNon publiéAjouter -p port:port
Connection refusedService pas démarréVérifier les logs

Résumé

CommandeDescription
docker network createCréer un réseau
docker network lsLister les réseaux
docker network inspectDétails d'un réseau
docker network connectConnecter un conteneur
docker network disconnectDéconnecter un conteneur
docker network rmSupprimer un réseau
docker network pruneNettoyer les réseaux
DriverUsage
bridgeApplications isolées (défaut)
hostPerformance, pas d'isolation
noneSécurité maximale
overlayMulti-hôte (Swarm)
Points clés
  • Utilisez des réseaux personnalisés pour le DNS automatique
  • Isolez les applications avec des réseaux séparés
  • Publiez uniquement les ports nécessaires
  • Utilisez des réseaux internes pour les services sensibles

Exercices pratiques

  1. Créez un réseau et faites communiquer deux conteneurs par leur nom
  2. Configurez une architecture avec frontend/backend isolés
  3. Testez la résolution DNS entre conteneurs
  4. Créez un réseau interne et vérifiez l'absence d'accès externe

← Volumes Docker | Docker Compose →