Estoy configurando un servidor con Docker y LXD. Tengo una red real con varias VLAN a las que quiero tener puentes, que se pueden compartir entre Docker y LXD. Esto fue relativamente fácil con LXD, pero Docker es como esa novia molesta que quiere controlar todo, así que tengo dificultades para lograr que funcione bien.
Aquí está la configuración de netplan:
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
Con LXD esto fue tan fácil como simplemente agregar una NIC a una de las VLAN.
devices:
enp1s0:
nictype: bridged
parent: vlan36
type: nic
Pero aparentemente no es tan fácil tratar con Docker. Después de horas de buscar fuentes en redes acoplables, se me ocurrió esto.
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
Esto parecía hacer bien el trabajo. La conexión de contenedores funcionó bien, tenían acceso a la red, mi enrutador podía verlos conectados, hacer ping a otros dispositivos en la red también funcionó, pero. No puede establecer una conexión entrante con los contenedores. Hacer ping a un contenedor solo da como resultado una red inalcanzable. Y esto no sólo afecta a Docker sino también a LXD. Entonces, aunque Docker parece simplemente adoptar el puente, le hace algo. Deshabilitar el servicio Docker y reiniciar soluciona el problema de los contenedores LXD.
Respuesta1
Esta solución no parece correcta, pero funciona y parece comportarse como quiero. Creo que el problema es que el bridge
controlador no lo soporta -o parent
. En lugar de eso, simplemente creará su propio dispositivo.
plan de red
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>
Estibador
root@host:~# docker network create <NETWORK_NAME> \
--subnet 192.168.x.x/24 \
--gateway 192.168.x.254 \
--driver macvlan \
-o parent=vlan<VLAN>