Docker network

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Modèle Container Networking Model (CNM)
Driver par défaut bridge
Autres drivers host · overlay · macvlan · none
Voir aussi Docker containers · Docker volumes · Docker

Le réseau des conteneurs Docker repose sur le Container Networking Model (CNM) : chaque conteneur est rattaché à un ou plusieurs réseaux virtuels via un driver, qui détermine comment ce conteneur voit et est vu par le reste du système. Le driver bridge est utilisé par défaut ; le mode host donne au conteneur un accès direct à l'ensemble des interfaces réseau de l'hôte (sans isolation réseau), tandis que le mode bridge nécessite de publier ou d'exposer explicitement les ports pour être joignable depuis l'extérieur.

Commandes de base

docker network ls
docker network inspect ae1de386eedc

docker run -d --name c1 debian:latest sleep infinity
docker exec -ti c1 bash
# apt update && apt install iputils-ping net-tools
# ping 172.17.0.1

Publier vs exposer un port

Les deux notions sont souvent confondues :

  • Publier (-p/-P) rend un port du conteneur accessible depuis l'extérieur de l'hôte, en le reliant à un port de l'hôte.
  • Exposer (--expose) documente/ouvre un port au niveau du réseau du conteneur, y compris s'il n'y a pas encore de service qui écoute dessus, mais ne le rend pas accessible depuis l'extérieur de l'hôte sans publication.

C'est le mode ingress (utilisé par défaut) qui gère cette publication :

# publier le port 80 du conteneur sur le port 8080 de l'hôte
docker run -d --name c1 -p 8080:80 nginx

# publier tous les ports EXPOSE du Dockerfile sur des ports aléatoires de l'hôte
docker run -d --name c1 -P nginx

# exposer un port sans publication externe
docker run -d --name c1 --expose 8080 nginx

docker port nginx

En mode host (au niveau du service, pertinent surtout dans un contexte Swarm), la publication se fait directement sur l'interface de l'hôte :

docker service create -p mode=host,published=8082,target=80 --name nginx_host_pub nginx
docker service ps nginx_host_pub

Drivers réseau

Driver Principe Usage typique
bridge Réseau virtuel isolé sur l'hôte, ports publiés explicitement Par défaut, la grande majorité des cas mono-hôte
host Le conteneur partage directement la pile réseau de l'hôte (mêmes IP et ports) Performance réseau maximale, au prix de l'isolation
overlay Réseau virtuel qui s'étend sur plusieurs hôtes d'un cluster Orchestration multi-hôtes (Docker Swarm)
macvlan Attribue une adresse MAC/IP propre au conteneur sur le réseau physique Petites infrastructures, besoin de latence réduite
none Aucune interface réseau (hors loopback) Isolation réseau complète

bridge — créer un réseau dédié

Un réseau bridge personnalisé (par opposition au bridge par défaut, docker0) permet notamment la résolution de noms entre conteneurs qui y sont rattachés :

docker network create --driver=bridge --subnet=192.168.0.0/24 netw0
# le driver bridge est implicite si non précisé
docker network create my-net

docker run -d --name c2 --network netw0 debian:latest

# rattacher un conteneur existant à un réseau supplémentaire (ajoute une interface)
docker network connect netw0 c1
docker network disconnect netw0 c1

docker network rm netw0

# alias supplémentaire pour un conteneur sur un réseau
docker network connect --alias another-alias my-net my-net-nginx3

# nom personnalisé pour l'interface bridge créée sur l'hôte
docker network create -o com.docker.network.bridge.name="custom0" custom0

overlay — réseau multi-hôtes

Le driver overlay permet à des conteneurs répartis sur plusieurs hôtes d'un cluster Docker Swarm de communiquer comme s'ils étaient sur le même réseau local :

docker network create --driver overlay my-overlay-net

docker service create --name overlay-nginx --network my-overlay-net nginx
docker service logs overlay-nginx

# rendre le réseau overlay utilisable par un conteneur hors cluster Swarm
docker network create --driver overlay --attachable my-overlay

macvlan

Chaque conteneur obtient sa propre adresse MAC et apparaît comme un hôte physique distinct sur le réseau local — plus rapide que le bridge mais dédié à des infrastructures de taille limitée (une adresse MAC par conteneur peut poser problème à l'échelle) :

docker network create -d macvlan --subnet 192.168.0.0/24 --gateway 192.168.0.1 -o parent=eth0 my-macvlan-net
docker run -d --name macvlan-nginx --net my-macvlan-net nginx

none

docker run --net none -d --name none_nginx nginx

Configuration avancée

Sous-réseau des conteneurs par défaut (docker0) et forçage de résolveur DNS, via /etc/docker/daemon.json :

{
  "bip": "10.10.0.1/16"
}
systemctl restart docker

docker run --dns 8.8.4.4 nicolaka/netshoot nslookup google.com

Sécurisation du trafic overlay

Un réseau overlay peut être chiffré au niveau du transport, avec authentification mutuelle des pairs par mTLS (Mutually Authenticated Transport Layer Security) activée par défaut sur ce mode :

docker network create --opt encrypted --driver overlay my-encrypted-net

docker service create --name encrypted-overlay-nginx --network my-encrypted-net --replicas 3 nginx

Voir aussi