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.