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
macvlanne 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
macvlann'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
macvlanappelémy-macvlan-net. Modifiez les valeurssubnet,gateway, etparentpour 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-netVous pouvez utiliser les commandes
docker network lsetdocker network inspect my-macvlan-netpour vérifier que le réseau existe et est un réseaumacvlan. -
Démarrez un conteneur
alpineet attachez-le au réseaumy-macvlan-net. Les drapeaux-ditdémarrent le conteneur en arrière-plan mais vous permettent de vous y attacher. Le drapeau--rmsignifie 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-alpineet remarquez la cléMacAddressdans 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
macvlanappelémy-8021q-macvlan-net. Modifiez les valeurssubnet,gateway, etparentpour 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-netVous pouvez utiliser les commandes
docker network lsetdocker network inspect my-8021q-macvlan-netpour vérifier que le réseau existe, est un réseaumacvlan, et a le parenteth0.10. Vous pouvez utiliserip addr showsur l'hôte Docker pour vérifier que l'interfaceeth0.10existe et a une adresse IP séparée -
Démarrez un conteneur
alpineet attachez-le au réseaumy-8021q-macvlan-net. Les drapeaux-ditdémarrent le conteneur en arrière-plan mais permettent de s'y attacher. Le drapeau--rmsignifie 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-alpineet remarquez la cléMacAddressdans 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