Docker in eigenem VLAN inklusive IPv6

Um AdGuard Home zu testen wollte ich schnell einen Docker Container erstellen. Das hat auch auf Anhieb geklappt, nur leider hat er die IPv6 Adressen der Clients nicht richtig geloggt. Die Lösung war den Container als eigenen Host im Netzwerk einzurichten.

Schritt 1: VLAN auf Unifi UDM-Pro anlegen

Da die Container mit macvlan nicht richtig DHCP können, habe ich mir ein VLAN erstellt mit einem eigenen IP-Bereich. Dazu geht man auf dem Webinterface der UDM-Pro auf “Settings”, “Network” und dann auf “New Virtual Network”. Hier werden ein IP-Bereich und eine VLAN-ID vergeben. Ich habe die ID 2 genommen. DHCP muss auf None gestellt werden. Unter IPv6 wird ebenso ein Subnet vergeben. Beispielsweise fd01::1/64.

Schritt 2: Erstellen vom macvlan in Docker

Das Netzwerk für Docker wurde mit folgendem Kommando erstellt, entsprechend der Doku1 von Docker.

docker network create -d macvlan --ipv6 --subnet=192.168.3.0/24 --gateway=192.168.3.1 --subnet=fd01::/64 --gateway=fd01::1  -o parent=eno1.2 -o macvlan_mode=bridge macvlan1
  • ipv6: um IPv6 im Netzwerk zu aktivieren
  • subnet: hier der IP-Bereich des VLANs, einmal für IPv4 und einmal für IPv6
  • gateway: Gateway / Router
  • parent: Übergeordnete Netzwerkschnittstelle. Wichtig ist die .2 dahinter, damit wird die VLAN ID vergeben.

Schritt 3: Test-Container starten

Einen Container starten und schauen ob alles funktioniert.

[root@server docker_macvlan]: docker run -it --rm --network=macvlan1 archlinux
[root@218c8aacb6b8 /]: ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host proto kernel_lo 
       valid_lft forever preferred_lft forever
47: eth0@if40: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:03:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.3.2/24 brd 192.168.3.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fd01::42:c0ff:fea8:302/64 scope global tentative dynamic mngtmpaddr proto kernel_ra 
       valid_lft 86399sec preferred_lft 86399sec
    inet6 fd01::3/64 scope global nodad 
       valid_lft forever preferred_lft forever
    inet6 fe80::42:c0ff:fea8:302/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

[root@218c8aacb6b8 /]: ping 192.168.3.1
PING 192.168.3.1 (192.168.3.1) 56(84) bytes of data.
64 bytes from 192.168.3.1: icmp_seq=1 ttl=64 time=0.305 ms
^C
--- 192.168.3.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.305/0.305/0.305/0.000 ms

Schritt 4: AdguardHome

Den AdguardHome Container mit folgendem Befehl erstellen: 2

Hier wird eine feste IP-Adresse mitgegeben, damit diese später als DNS-Server an die Clients gegeben werden kann. Ohne den Parameter --ip würde Docker selbst eine Adresse aus dem Subnet vergeben, welche jedes mal unterschiedlich sein könnte.

docker run --name adguardhome\
  --restart unless-stopped\
  -v adguard-workdir:/opt/adguardhome/work\
  -v adguard-confdir:/opt/adguardhome/conf\
  --network=macvlan1\
  --ip 192.168.3.20\
  -d adguard/adguardhome