Agregar un puente no administrado a Docker

Agregar un puente no administrado a Docker

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 bridgecontrolador 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>

información relacionada