Menu Fermer

Configurer les vlans sous Docker

Dans mon cas de figure sous Docker je souhaite présenter mes conteneurs sur plusieurs vlans différents.

Pour ce faire mon serveur dispose de deux interfaces réseau :

  • eth0 : dédié a l’administration du serveur, aucun conteneur ne sera présenté, est connecté sur un vlan dédié administration docker
  • eth1 : connecté sur un port switch avec les vlans souhaité tagués

Pré-requis

Avoir un docker opérationnel. Pour l’installation de docker se reporter a la procédure officielle : https://docs.docker.com/engine/install/debian/

Installer le paquet vlan

apt update && apt install vlan

Configurer eth1

Pour la configuration de l’interface eth1 j’ai créé un fichier dans /etc/network/interfaces.d/99-vlans comme je suis sous Debian et n’utilise pas netplan. Attention a ne déclarer l’interface pour les vlans qu’une seule et unique fois. Dans cet exemple j’utiliserais les vlans 10 et 20. A adapter selon votre cas d’usage.

# Parent Interface
allow-hotplug eth1
iface eth1 inet manual
    up ip link set eth1 up
    down ip link set eth1 down

# Vlan 10 Interface
auto eth1.10
iface eth1.10 inet manual
    vlan-raw-device eth1
    up ip link set eth1.10 up
    down ip link set eth1.10 down
    
# Vlan 20 Interface
auto eth1.20
iface eth1.20 inet manual
    vlan-raw-device eth1
    up ip link set eth1.20 up
    down ip link set eth1.20 down

Comme vous pouvez le remarquer aucune adresse IP n’est définie sur le fichier de configuration. Cela car seulement les conteneurs seront présentés sur les vlans.
Les interfaces vlans sont nommées <parent>.<vlanid> afin de donner l’id vlan a utilisé. Soit eth1.10 et eth1.20

On applique ensuite la configuration via un redémarrage du service networking

systemctl restart networking.service

On peux ensuite vérifier que la configuration a bien été prise en compte via la commande ip link, les nouvelles interfaces doivent être présentes et dans le status LOWER_UP

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 6e:de:8d:cf:52:f3 brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    altname ens18
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 6d:f3:61:4f:8c:b4 brd ff:ff:ff:ff:ff:ff
    altname enp0s19
    altname ens19
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
    link/ether 74:03:aa:8b:85:7e brd ff:ff:ff:ff:ff:ff
60: eth1.1202@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 6d:f3:61:4f:8c:b4 brd ff:ff:ff:ff:ff:ff
61: eth1.3202@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 6d:f3:61:4f:8c:b4 brd ff:ff:ff:ff:ff:ff

Création des docker networks

On passe ensuite à la création des networks, pour cela on utilise le driver macvlan, ici il faudra remplacer les subnets par ce qui sera utilisé sur chacun des vlans

docker network create -d macvlan \
  --subnet=192.168.10.0/24 \
  --gateway=192.168.10.1 \
  -o parent=eth1.10 \
  vlan10

docker network create -d macvlan \
  --subnet=192.168.20.0/24 \
  --gateway=192.168.20.1 \
  -o parent=eth1.20 \
  vlan20

On peux ensuite lister les networks pour valider qu’ils sont bien présents via la commande suivante :

docker network ls
NETWORK ID     NAME       DRIVER    SCOPE
xxxxxxxxxxxx   bridge     bridge    local
xxxxxxxxxxxx   host       host      local
xxxxxxxxxxxx   none       null      local
xxxxxxxxxxxx   vlan10     macvlan   local
xxxxxxxxxxxx   vlan20     macvlan   local

Configurer un conteneur via compose.yaml

Pour mon déploiement de conteneur j’ai fait le choix de passer par un fichier compose.yaml
Ci dessous un exemple générique de configuration pour présenter le conteneur sur l’adresse IP 192.168.20.15 sur le vlan 20

services:
  bind9:
    image: myimage
    container_name: mycontainer
    restart: unless-stopped
    networks:
      vlan20:
        ipv4_address: 192.168.20.15
networks:
  vlan20:
    external: true

A noter qu’ici aucun port n’est déclarer, en effet dans le cas de la configuration d’une adresse IP tous les ports du conteneurs sont présentés sur le réseau de destination.

Le external: true permet d’indiquer qu’il faut utiliser le réseau déjà configuré sur le serveur docker, cela évite de le redéclarer dans chaque fichier de configuration.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.