Lorsque nous lançons un conteneur Ă partir dâune image, le moteur dâexĂ©cution âdockerâ attribue Ă cette instance dâimage, un rĂ©seau privĂ©, par dĂ©faut, le rĂ©seau nommĂ© âbridgeâ.
Par rĂ©seau privĂ©, nous entendons une adresse IP et un masque de sous-rĂ©seau qui nâont aucun lien avec les paramĂštres rĂ©seau de lâordinateur hĂŽte.
Par exemple, voici les spécifications de ma station de travail:
alain@srv02:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:d1:62:6c brd ff:ff:ff:ff:ff:ff
inet 192.168.2.152/24 brd 192.168.2.255 scope global dynamic ens32
valid_lft 559772sec preferred_lft 559772sec
NOTE : Lâadresse de ma station est 192.168.2.152 dans un rĂ©seau de classe âCâ -> /24.
Voyons maintenant les paramĂštres dâune instance dâAlpine:
alpine de façon éphémÚre (--rm)$ docker run -it --rm alpine
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
56: eth0@if57: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
NOTE : Lâadresse IP de lâinstance est 172.17.0.2 dans un rĂ©seau de classe âBâ -> /16.
Comment expliquer ces paramĂštres ?
docker network ls$ docker network ls
NETWORK ID NAME DRIVER SCOPE
00a924a413f9 bridge bridge local
69c859ba51de host host local
25167b5edb8a none null local
docker network inspect bridge$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "00a924a413f9411d6c7a93ff5effb10663a86a82f1c2e2836dc2d4e7f5a33a75",
"Created": "2021-01-27T14:51:05.825275186Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
alpine et explorer les paramÚtres réseauxdocker run -it -d --name serveur01 alpine
docker run -it -d --name serveur02 alpine
docker network inspect bridge"Containers": {
"65bfb76d6d23817abfd09a9cbd7ef6131fd3c9386bed66f9570ee9f9b4f5c0c9": {
"Name": "serveur01",
"EndpointID": "2e2fb06cb65954ce00de9eea6773f6f882a3786224c80c5846f67ae35236905c",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"de8a9686b9cba97e3f9b4880a7e3619c4d4257049d2851c03a39b078a15b0f7b": {
"Name": "serveur02",
"EndpointID": "2e769ffc9bff7275a57f76889df5724dda8ee223da8f5f5ed8f930ef48f36d39",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
}
Note: Voici un article sur la structure des âMac Addressâ des conteneurs docker.
$ docker exec -it serveur01 /bin/sh
/ # ip a
188: eth0@if189: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
/ # ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.219 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.234 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.133 ms
--- 172.17.0.3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.133/0.195/0.234 ms
Note: Nous avons utilisĂ© lâadresse dans la commande prĂ©cĂ©dente. Il est aussi possible dâutiliser le nom du conteneur. Docker maintient un service de nom âDNSâ Ă lâintĂ©rieur de ses rĂ©seaux.
Testons cette fonctionnalité.
/ # ping serveur02
ping: bad address 'serveur02'
SURPRISE: Cela ne semble pas fonctionner, pourquoi? Pour que docker active un service de noms de domaines, il faut créer des réseaux privés.
docker network create reseau01
docker network ls
NETWORK ID NAME DRIVER SCOPE
6eca92520b8e bridge bridge local
5b64d4b7c1d2 host host local
786951a15a98 none null local
31bdc39ceb12 reseau01 bridge local
NOTE : Docker propose diffĂ©rents types de rĂ©seaux, sous forme de pilotes (drivers). Il est possible de prĂ©ciser le pilote dĂ©sirĂ© Ă la crĂ©ation du rĂ©seau avec lâoption âdriver. En cas dâomission, le pilote âbridgeâ sera utilisĂ©.
Exemple,
docker network create --driver bridge alpine-net
docker network inspect reseau01
[
{
"Name": "reseau01",
"Id": "31bdc39ceb129..."
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Config": [
{
"Subnet": "172.21.0.0/16",
"Gateway": "172.21.0.1"
alpine associés au nouveau réseau: docker run --networkdocker run -it -d --name serveur03 --network reseau01 alpine
docker run -it -d --name serveur04 --network reseau01 alpine
docker network inspect reseau01
{
"Name": "reseau01",
"Id": "31bdc39ceb129eb1",
"Created": "2021-02-11T15:54:40.0712897Z",
"IPAM": {
"Config": [
{
"Subnet": "172.21.0.0/16",
"Gateway": "172.21.0.1"
...
"Containers": {
"b9f491e958b52a152c4a4ed5b5b"
"Name": "serveur03",
"EndpointID": "b683ff477492183274",
"MacAddress": "02:42:ac:15:00:02",
"IPv4Address": "172.21.0.2/16",
"IPv6Address": ""
},
"c5c6c10782466065a4b400732f0": {
"Name": "serveur04",
"EndpointID": "bc6e1f000f656ca8a0a5",
"MacAddress": "02:42:ac:15:00:03",
"IPv4Address": "172.21.0.3/16",
"IPv6Address": ""
}
},
docker exec -it serveur03 /bin/sh
/ # ping serveur04
PING serveur04 (172.21.0.3): 56 data bytes
64 bytes from 172.21.0.3: seq=0 ttl=64 time=0.379 ms
--- serveur04 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.169/0.274/0.379 ms
VOILĂ!: GrĂące au nouveau rĂ©seau, il est possible dâenvoyer des requĂȘtes IP en utilisant le nom du conteneur.
Référence: Docker Network Create
Ce type dâinterface rĂ©seau va utiliser directement la carte et les paramĂštres rĂ©seau de lâhĂŽte.
Par exemple,
docker run -d --name srv_websurlhote --rm --network host nginx
Remarquez quâici, nous nâavons pas utilisĂ© le paramĂštre -p xx:xx. Le conteneur va utiliser lâinterface rĂ©seau de lâhĂŽte et le port exposĂ© du conteneur sera accessible directement via lâhĂŽte.
Par exemple:
http://localhost
# Au besoin. pour installer la commande ip sur Ubuntu:
# apt install iproute2 -y
$ ip a
ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:7a:af:bc brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 192.168.2.32/24 brd 192.168.2.255 scope global dynamic noprefixroute ens33
valid_lft 7059896sec preferred_lft 7059896sec
inet6 fe80::20c:29ff:fe7a:afbc/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
NOTE: L'adresse IP du conteneur devrait ĂȘtre identique Ă l'adresse de l'hĂŽte.
NOTE: Cette fonctionnalitĂ© nâest pas disponible sous Windows ou MacOS, seulement sur Linux.
Voir les rĂ©seaux disponibles sous Windows: Windows 10 â place container directly on local network? â Docker Desktop for Windows â Docker Community Forums
Le rĂ©seau macvlan permet Ă vos conteneurs Docker dâobtenir des adresses IP directement sur votre rĂ©seau physique, comme sâils Ă©taient des machines physiques distinctes.
Avant de commencer, vous devez connaĂźtre :
eth0, enp0s3)Pour trouver ces informations :
# Afficher les interfaces réseau
ip addr show
# Afficher la configuration réseau
ip route
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
macvlan_net
Explication des paramĂštres :
-d macvlan : spĂ©cifie le driver macvlan--subnet : la plage dâadresses IP de votre rĂ©seau--gateway : lâadresse IP de votre routeur/passerelle-o parent=eth0 : lâinterface physique parentmacvlan_net : le nom du rĂ©seauIl est recommandĂ© de rĂ©server une plage dâIP pour Docker afin dâĂ©viter les conflits :
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
Ici, --ip-range=192.168.1.192/27 réserve les adresses de 192.168.1.192 à 192.168.1.223 pour Docker.
NOTE Cette étape est importante car les adresses attribuées vont entrer en conflit avec les appareils connectés au réseau local.
docker run -d --name nginx_macvlan \
--network macvlan_net \
nginx
docker run -d --name nginx_macvlan \
--network macvlan_net \
--ip=192.168.1.200 \
nginx
# Serveur web
docker run -d --name web \
--network macvlan_net \
--ip=192.168.1.200 \
nginx
# Base de données
docker run -d --name db \
--network macvlan_net \
--ip=192.168.1.201 \
-e MYSQL_ROOT_PASSWORD=motdepasse \
mysql:8.0
# Application
docker run -d --name app \
--network macvlan_net \
--ip=192.168.1.202 \
monapp:latest
Par dĂ©faut, lâhĂŽte Docker ne peut pas communiquer directement avec les conteneurs en macvlan. Pour rĂ©soudre ce problĂšme, crĂ©ez une interface macvlan sur lâhĂŽte :
# Créer une interface macvlan sur l'hÎte
sudo ip link add macvlan_host link eth0 type macvlan mode bridge
# Assigner une IP Ă cette interface
sudo ip addr add 192.168.1.254/32 dev macvlan_host
# Activer l'interface
sudo ip link set macvlan_host up
# Ajouter une route vers les conteneurs
sudo ip route add 192.168.1.192/27 dev macvlan_host
# Lister les réseaux Docker
docker network ls
# Inspecter le réseau macvlan
docker network inspect macvlan_net
# Vérifier l'IP d'un conteneur
docker inspect -f '' nginx_macvlan
# Tester la connectivité depuis un autre appareil du réseau
ping 192.168.1.200
Voici un exemple de configuration complĂšte pour un environnement web :
# 1. Créer le 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 \
prod_network
# 2. Lancer les services
docker run -d --name reverse_proxy \
--network prod_network \
--ip=192.168.1.200 \
-v /etc/nginx:/etc/nginx:ro \
nginx
docker run -d --name webapp \
--network prod_network \
--ip=192.168.1.201 \
node:18-alpine
docker run -d --name database \
--network prod_network \
--ip=192.168.1.202 \
-e POSTGRES_PASSWORD=secret \
postgres:15
# 3. Vérifier que tout fonctionne
docker ps
docker network inspect prod_network
Avantages :
Limitations :
Le réseau macvlan est particuliÚrement utile lorsque vous voulez que vos conteneurs se comportent comme des machines physiques sur votre réseau local.
# 1 - Exemple sous Windows
docker network create -d macvlan --subnet 192.168.124.0/23 --gateway=192.168.124.1 -o parent="Ethernet 4"
# Liste des interfaces réseau sous Windows:
netsh interface show interface
Ătat admin Ătat Type Nom de l'interface
-------------------------------------------------------------------------
Activé Connecté Dédié VirtualBox Host-Only Network
Activé Connecté Dédié VirtualBox Host-Only Network #2
Activé Connecté Dédié Ethernet 2
Activé Connecté Dédié Ethernet 3
Activé Connecté Dédié Ethernet 4 (192.168.124.0)
Activé Déconnecté Dédié Wi-Fi 2
Activé Connecté Dédié vEthernet (Default Switch)
Activé Connecté Dédié vEthernet (WSL)
docker run -d --name srv_macvlan --rm --network macvlan --ip=192.168.125.100 nginx
Exemple sous Linux
# 1
$ ip a
2: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:6d:e1:4d brd ff:ff:ff:ff:ff:ff
altname enp2s5
inet 192.168.2.111/24 brd 192.168.2.255 scope global noprefixroute
# 2
$ docker network create -d macvlan --subnet 192.168.2.0/24 --gateway=192.168.2.1 -o parent="ens37" vlan01
# 3
$ docker run -d --name nginx_macvlan --rm --network vlan01 --ip=192.168.2.88 nginx
# 4
# Le serveur WEB Nginx devrait ĂȘtre accessible Ă partir du rĂ©seau local.
http://192.168.2.88
Document rédigé par Alain Boudreault © 2021-2026
Version 2025.12.03.1
Site par ve2cuy