Unter Docker haben Container in der Regel eine dynamische IP in einem docker-internen Netzwerk. In einigen Fällen ist es jedoch sinnvoll, Container direkten Zugang zum LAN über eine eigene LAN-IP zu gewähren. Beispiele dafür sind dockerisierte VPN-Gateways, über die geroutet werden soll sowie Dienste, welche auf Layer 3 im Netzwerk ereichbar sein sollen.

Docker bietet mit MacVLAN einen Netwerktreiber, der ein solchen Setup ermöglicht. Eine Einschränkung ist jedoch, dass ein solches Netzwerk keine Kommunikation zwischen dem Host und den Containern zulässt – dies kann man jedoch recht einfach ändern.

MacVLAN Device auf dem Host einrichten

Der Grund, warum der Host nicht auf die Container im MacVLAN zugreifen kann ist, dass der Host die physikalische Netzwerkkarte direkt benutzt, die Container aber daran gebundene MacVLAN-Devices verwenden. Daher muss auch der Host ein MacVLAN device verwenden. Dieses wird, ganz ähnlich einer Bridge, anstatt dem Device der physikalischen Netzwerkkarte für die Netzwerkkonfiguration eingerichtet.

Unter Debian sieht die Konfiguration (für die physikalische Netzwerkkarte eno1) wie folgt aus:

auto eno1
iface eno1 inet manual

auto macvlan0
iface macvlan0 inet static
    address 192.168.1.1
    network 192.168.1.0
    netmask 255.255.255.0
    broadcast 192.168.1.255
    gateway 192.168.1.254
    dns-nameservers 192.168.1.254
    pre-up ip link add link eno1 name macvlan0 type macvlan mode bridge

Nach einem Reboot hat eno1 keine IP-Adresse mehr – diese ist stattdessen auf macvlan0 konfiguriert.

Docker Netzwerk erzeugen

docker network create \
  --driver=macvlan \
  --subnet=192.168.1.0/24 \
  --gateway 192.168.1.254 \
  -o parent=eno1 \
  -o macvlan_mode=bridge \
  macvlan0

Dies erzeugt ein Netzwerk mit dem Namen macvlan0 welches an eno1 gebunden ist. Zu beachten ist, dass jedem Container, der in diesem Netzwerk gestartet wird, eine feste IP zugeordnet wird. Ansonsten vergibt Docker wahllos IPs aus dem Bereich 192.168.1.0/24, welche ggf. mit bereits verwendeten IPs kollidieren.

Einzelne IPs kann man auch mit der Option –aux-address=“myexternalserver=192.168.1.123″ (ggf. auch mehrfach) ausschließen. Ebenso lassen sich mit der Option „–ip-range=192.168.1.199/32“ die automatischen IPs auf ein kleines Subnetz oder gar auf eine einzelne IP einschränken.

Docker Netzwerk testen

Der folgende Befehl erzeugt einen Container im MacVLAN-Netzwerk mit der festen IP-Adresse 192.168.1.211:

docker run -it --rm --net macvlan0 --ip 192.168.1.211 alpine

Vom Container aus sind der Host, das Gateway, externe Hosts sowie andere Container im MacVLAN-Netzwerk erreichbar.

Auch von einem Container im normalen docker0-Netzwerk aus sind der Host, das Gateway, externe Hosts sowie Container im MacVLAN-Netzwerk ereichbar:

docker run -it --rm alpine

In Docker-Compose verwenden

Das neue Netzwerk kann auch in docker-compose mit der folgenden Konfiguration verwendet werden:

service:
  test:
    image: alpine
    networks:
      macvlan0:
        ipv4_address: 192.168.1.212
    restart: unless-stopped

networks:
  macvlan0:
    external:
      name: macvlan0

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*

code