macvlan

Comment avoir une adresse IP locale sur son réseau attribué par son routeur avec Docker ? Je m'étais posé cette question quand j'ai vu Dada le faire avec des VM depuis VirtualBox, je me suis demandé si il m'était possible de faire pareil avec Docker.

À l'époque ma problématique était d'avoir des attributions d'IP directement depuis K8s sur un réseau local, depuis j'utilise un routeur traefik sans avoir besoin spécifiquement d'une IP complète.

Or LVS est venu vers moi avec cette problématique également et je vais documenter comment faire sur cette page en utilisant le driver macvlan de Docker.

Dans un premier temps il faut créer un réseau utilisant le driver et le paramétrer en indiquant qui attribue les addresses IP sur le réseau local.

docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --ip-range=192.168.1.128/25 \
  --gateway=192.168.1.254 \
  --aux-address="my-router=192.168.1.1" \
  -o parent=eth0 mymacnetwork

création d'un réseau docker

Dans un deuxième temps, il suffit d'indiquer qu'on souhaite utiliser le réseau créé qui va demander à chaque nouveau conteneur une adresse IP accessible sur le réseau, car celui-ci aura une adresse MAC matérielle virtuelle. Cette adresse MAC est d'ailleurs paramétrable.

docker run --rm --network mymacnetwork \
  --mac-address 00:00:00:00:00:11 --name mycontainer nginx

avec cet exemple, il est possible d'accéder à NGINX sur 192.168.1.128

Si les cas d'usages peuvent êtres assez variés, pour LVS il lui fallait pouvoir avoir une machine virtuelle écoutant sur le port 80 et 443, or la machine hôte avait ces ports déjà utilisés. Ainsi, sa box/routeur peut rediriger tout le trafic allant sur les ports 80 et 443 vers un load balancer ayant une adresse MAC virtuelle.


Sources et documentation

Blog de dada - DevOps, bidouilleur et routard plein de logiciels libres
Papoter autour des logiciels libres, des serveurs, des conteneurs et j’en passe.
Macvlan network driver
All about using Macvlan to make your containers appear like physical machines on the network
Macvlan network driver: Assign MAC address to Docker containers
The macvlan network driver allows you to assign a MAC address to Docker containers, which enables your containerized application to connect directly to your physical network.