Ich richte einen Server mit Docker und LXD ein. Ich habe ein echtes Netzwerk mit mehreren VLANs, zu denen ich Brücken haben möchte, die zwischen Docker und LXD geteilt werden können. Mit LXD war das relativ einfach, aber Docker ist wie diese nervige Freundin, die alles kontrollieren will, also habe ich Schwierigkeiten, es zum Laufen zu bringen.
Hier ist die Netplan-Konfiguration:
network:
version: 2
ethernets:
enp5s0:
match:
macaddress: 84:a9:3e:86:7b:d4
set-name: enp5s0
enx0s0:
match:
macaddress: 00:e0:4c:02:61:57
set-name: enx0s0
bridges:
vlan69: # Untagged
interfaces:
- enp5s0
parameters:
stp: true
forward-delay: 4
dhcp4: yes
dhcp6: no
vlan36:
interfaces:
- enx0s0.36
parameters:
stp: true
forward-delay: 4
dhcp4: no
dhcp6: no
vlan32:
interfaces:
- enp5s0.32
parameters:
stp: true
forward-delay: 4
dhcp4: no
dhcp6: no
vlan1:
interfaces:
- enp5s0.1
parameters:
stp: true
forward-delay: 4
dhcp4: no
dhcp6: no
vlans:
enx0s0.36:
accept-ra: no
id: 36
link: enx0s0
enp5s0.32:
accept-ra: no
id: 32
link: enp5s0
enp5s0.1:
accept-ra: no
id: 1
link: enp5s0
Mit LXD war dies so einfach wie das Hinzufügen einer Netzwerkkarte zu einem der VLANs.
devices:
enp1s0:
nictype: bridged
parent: vlan36
type: nic
Aber Docker ist offenbar nicht so einfach zu handhaben. Nach stundenlanger Suche in Quellen zu Docker-Netzwerken bin ich auf Folgendes gestoßen.
root@host:~# docker network create vlan32 \
-o com.docker.network.bridge.inhibit_ipv4=true \
-o com.docker.network.bridge.name=vlan32 \
--subnet=192.168.32.0/24 \
--gateway=192.168.32.254
Das schien gut zu funktionieren. Das Verbinden der Container funktionierte einwandfrei, sie hatten Zugriff auf das Netzwerk, mein Router konnte die Verbindung erkennen, das Pingen anderer Geräte im Netzwerk funktionierte auch, aber. Sie können keine eingehende Verbindung zu den Containern herstellen. Das Pingen eines Containers führt nur zu einem nicht erreichbaren Netzwerk. Und das betrifft nicht nur Docker, sondern auch LXD. Auch wenn Docker die Bridge scheinbar einfach übernimmt, hat es etwas damit zu tun. Das Deaktivieren des Docker-Dienstes und ein Neustart beheben das Problem für die LXD-Container.
Antwort1
Diese Lösung scheint nicht richtig zu sein, aber sie funktioniert und verhält sich anscheinend so, wie ich es möchte. Ich glaube, das Problem liegt darin, dass der bridge
Treiber dies nicht unterstützt -o parent
. Stattdessen erstellt er einfach sein eigenes Gerät.
Netzplan
network:
version: 2
ethernets:
<NIC>:
dhcp4: yes
bridges:
vlan<VLAN>:
interfaces:
- <NIC>.<VLAN>
parameters:
stp: true
forward-delay: 4
dhcp4: no
dhcp6: no
vlans:
<NIC>.<VLAN>:
accept-ra: no
id: <VLAN>
link: <NIC>
LXD
devices:
enp1s0:
nictype: bridged
parent: vlan<VLAN>
Docker
root@host:~# docker network create <NETWORK_NAME> \
--subnet 192.168.x.x/24 \
--gateway 192.168.x.254 \
--driver macvlan \
-o parent=vlan<VLAN>