⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

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.

  1. Créez un réseau macvlan appelé my-macvlan-net. Modifiez les valeurs subnet, gateway, et parent 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 et docker network inspect my-macvlan-net pour vérifier que le réseau existe et est un réseau macvlan.

  2. Démarrez un conteneur alpine et attachez-le au réseau my-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
    
  3. 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é
    
  4. 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
    
  5. 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.

  1. Créez un réseau macvlan appelé my-8021q-macvlan-net. Modifiez les valeurs subnet, gateway, et parent 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 et docker network inspect my-8021q-macvlan-net pour vérifier que le réseau existe, est un réseau macvlan, et a le parent eth0.10. Vous pouvez utiliser ip addr show sur l'hôte Docker pour vérifier que l'interface eth0.10 existe et a une adresse IP séparée

  2. Démarrez un conteneur alpine et attachez-le au réseau my-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
    
  3. 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é
    
  4. 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
    
  5. 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
    

Autres tutoriels de réseau