Passer au contenu principal

Données et réseau (Docker)

Réseau Docker

Docker gère son propre réseau virtuel, distinct du réseau hôte. Comprendre les drivers réseau, le DNS inter-containers, et la différence entre expose et publish est indispensable pour architecturer des applications multi-containers correctement.

Drivers réseau

  • bridge (défaut) : réseau privé isolé sur l'hôte, avec NAT vers l'extérieur
  • host : le container utilise directement la stack réseau de l'hôte (pas d'isolation réseau)
  • none : aucune interface réseau (container totalement isolé)
  • overlay : réseau multi-hôtes pour Docker Swarm
  • macvlan : attribue une adresse MAC physique au container (visible sur le réseau LAN)

Bridge personnalisé vs bridge par défaut

Le bridge par défaut (docker0) n'offre pas de résolution DNS entre containers. Il faut utiliser leur IP, qui peut changer. Les bridges personnalisés ont un DNS intégré.

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

# Lancer des containers sur ce réseau
docker run -d --name db --network app-net postgres:16
docker run -d --name api --network app-net myapi:latest

# Dans le container api, "db" est résolu directement par DNS
# curl http://db:5432 fonctionne
# Inspecter un réseau
docker network inspect app-net

# Connecter un container existant à un réseau
docker network connect app-net mon-container

# Déconnecter
docker network disconnect app-net mon-container

# Nettoyer les réseaux inutilisés
docker network prune

EXPOSE vs -p (publish)

  • EXPOSE dans le Dockerfile : documentation seulement, n'ouvre aucun port
  • -p HOST:CONTAINER au runtime : mappe un port hôte vers le container, accessible depuis l'extérieur
  • -P : publie automatiquement tous les ports EXPOSE sur des ports hôte aléatoires
# Port fixe
docker run -d -p 8080:80 nginx:alpine

# Écouter uniquement sur localhost de l'hôte
docker run -d -p 127.0.0.1:8080:80 nginx:alpine

# Port aléatoire
docker run -d -p 127.0.0.1::80 nginx:alpine
docker port CONTAINER_ID  # voir le port assigné

Mode host

docker run -d --network host nginx:alpine

Le container utilise directement les interfaces de l'hôte. Pas de NAT, meilleures performances, mais pas d'isolation réseau. À réserver aux cas où la performance réseau est critique (monitoring, load balancers).

macvlan : container sur le LAN

# Créer un réseau macvlan
docker network create -d macvlan   --subnet=192.168.1.0/24   --gateway=192.168.1.1   --ip-range=192.168.1.192/27   -o parent=eth0   macvlan-net

# Le container obtient une IP du LAN
docker run -d --network macvlan-net --ip 192.168.1.200 nginx:alpine