Réseau utilisant un réseau macvlan
Cette série de tutoriels traite de la mise en réseau de conteneurs autonomes qui
se connectent aux réseaux macvlan
. Dans ce type de réseau, l'hôte Docker accepte
les requêtes pour plusieurs adresses MAC à son adresse IP, et route ces requêtes
vers le conteneur approprié. Pour d'autres sujets de réseau, voir la
vue d'ensemble.
Objectif
L'objectif de ces tutoriels est de configurer un réseau macvlan
en pont et d'y attacher
un conteneur, puis de configurer un réseau macvlan
trunk 802.1Q et d'y attacher un
conteneur.
Prérequis
-
La plupart des fournisseurs de cloud bloquent le réseau
macvlan
. Vous pourriez avoir besoin d'un accès physique à votre équipement réseau. -
Le pilote de réseau
macvlan
ne fonctionne que sur les hôtes Linux, et n'est pas pris en charge sur Docker Desktop ou Docker Engine sur Windows. -
Vous avez besoin d'au moins la version 3.9 du noyau Linux, et la version 4.0 ou supérieure est recommandée.
-
Les exemples supposent que votre interface ethernet est
eth0
. Si votre dispositif a un nom différent, utilisez-le à la place. -
Le pilote
macvlan
n'est pas pris en charge en mode rootless.
Exemple bridge
Dans l'exemple bridge simple, votre trafic passe par eth0
et Docker
route le trafic vers votre conteneur en utilisant son adresse MAC. Pour les dispositifs réseau
de votre réseau, votre conteneur semble être physiquement attaché au réseau.
-
Créez un réseau
macvlan
appelémy-macvlan-net
. Modifiez les valeurssubnet
,gateway
, etparent
pour des valeurs qui ont du sens dans votre environnement.$ docker network create -d macvlan \ --subnet=172.16.86.0/24 \ --gateway=172.16.86.1 \ -o parent=eth0 \ my-macvlan-net
Vous pouvez utiliser les commandes
docker network ls
etdocker network inspect my-macvlan-net
pour vérifier que le réseau existe et est un réseaumacvlan
. -
Démarrez un conteneur
alpine
et attachez-le au réseaumy-macvlan-net
. Les drapeaux-dit
démarrent le conteneur en arrière-plan mais vous permettent de vous y attacher. Le drapeau--rm
signifie que le conteneur est supprimé quand il est arrêté.$ docker run --rm -dit \ --network my-macvlan-net \ --name my-macvlan-alpine \ alpine:latest \ ash
-
Inspectez le conteneur
my-macvlan-alpine
et remarquez la cléMacAddress
dans la cléNetworks
:$ docker container inspect my-macvlan-alpine ...tronqué... "Networks": { "my-macvlan-net": { "IPAMConfig": null, "Links": null, "Aliases": [ "bec64291cd4c" ], "NetworkID": "5e3ec79625d388dbcc03dcf4a6dc4548644eb99d58864cf8eee2252dcfc0cc9f", "EndpointID": "8caf93c862b22f379b60515975acf96f7b54b7cf0ba0fb4a33cf18ae9e5c1d89", "Gateway": "172.16.86.1", "IPAddress": "172.16.86.2", "IPPrefixLen": 24, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:10:56:02", "DriverOpts": null } } ...tronqué
-
Regardez comment le conteneur voit ses propres interfaces réseau en exécutant quelques commandes
docker exec
.$ docker exec my-macvlan-alpine ip addr show eth0 9: eth0@tunl0: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:10:56:02 brd ff:ff:ff:ff:ff:ff inet 172.16.86.2/24 brd 172.16.86.255 scope global eth0 valid_lft forever preferred_lft forever
$ docker exec my-macvlan-alpine ip route default via 172.16.86.1 dev eth0 172.16.86.0/24 dev eth0 scope link src 172.16.86.2
-
Arrêtez le conteneur (Docker le supprime à cause du drapeau
--rm
), et supprimez le réseau.$ docker container stop my-macvlan-alpine $ docker network rm my-macvlan-net
Exemple de bridge trunk 802.1Q
Dans l'exemple de bridge trunk 802.1Q, votre trafic passe par une sous-interface
de eth0
(appelée eth0.10
) et Docker route le trafic vers votre conteneur en utilisant
son adresse MAC. Pour les dispositifs réseau de votre réseau, votre conteneur semble
être physiquement attaché au réseau.
-
Créez un réseau
macvlan
appelémy-8021q-macvlan-net
. Modifiez les valeurssubnet
,gateway
, etparent
pour des valeurs qui ont du sens dans votre environnement.$ docker network create -d macvlan \ --subnet=172.16.86.0/24 \ --gateway=172.16.86.1 \ -o parent=eth0.10 \ my-8021q-macvlan-net
Vous pouvez utiliser les commandes
docker network ls
etdocker network inspect my-8021q-macvlan-net
pour vérifier que le réseau existe, est un réseaumacvlan
, et a le parenteth0.10
. Vous pouvez utiliserip addr show
sur l'hôte Docker pour vérifier que l'interfaceeth0.10
existe et a une adresse IP séparée -
Démarrez un conteneur
alpine
et attachez-le au réseaumy-8021q-macvlan-net
. Les drapeaux-dit
démarrent le conteneur en arrière-plan mais permettent de s'y attacher. Le drapeau--rm
signifie que le conteneur est supprimé quand il est arrêté.$ docker run --rm -itd \ --network my-8021q-macvlan-net \ --name my-second-macvlan-alpine \ alpine:latest \ ash
-
Inspectez le conteneur
my-second-macvlan-alpine
et remarquez la cléMacAddress
dans la cléNetworks
:$ docker container inspect my-second-macvlan-alpine ...tronqué... "Networks": { "my-8021q-macvlan-net": { "IPAMConfig": null, "Links": null, "Aliases": [ "12f5c3c9ba5c" ], "NetworkID": "c6203997842e654dd5086abb1133b7e6df627784fec063afcbee5893b2bb64db", "EndpointID": "aa08d9aa2353c68e8d2ae0bf0e11ed426ea31ed0dd71c868d22ed0dcf9fc8ae6", "Gateway": "172.16.86.1", "IPAddress": "172.16.86.2", "IPPrefixLen": 24, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:10:56:02", "DriverOpts": null } } ...tronqué
-
Regardez comment le conteneur voit ses propres interfaces réseau en exécutant quelques commandes
docker exec
.$ docker exec my-second-macvlan-alpine ip addr show eth0 11: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:10:56:02 brd ff:ff:ff:ff:ff:ff inet 172.16.86.2/24 brd 172.16.86.255 scope global eth0 valid_lft forever preferred_lft forever
$ docker exec my-second-macvlan-alpine ip route default via 172.16.86.1 dev eth0 172.16.86.0/24 dev eth0 scope link src 172.16.86.2
-
Arrêtez le conteneur (Docker le supprime à cause du drapeau
--rm
), et supprimez le réseau.$ docker container stop my-second-macvlan-alpine $ docker network rm my-8021q-macvlan-net