Adicionar ponte não gerenciada ao Docker

Adicionar ponte não gerenciada ao Docker

Estou configurando um servidor com Docker e LXD. Eu tenho uma rede real com várias vlans para as quais quero ter pontes, que podem ser compartilhadas entre Docker e LXD. Isso foi relativamente fácil com o LXD, mas o Docker é como aquela namorada chata que quer controlar tudo, então estou tendo dificuldade em fazê-lo funcionar bem.

Aqui está a configuração do 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

Com o LXD isso foi tão fácil quanto simplesmente adicionar uma NIC a uma das vlans.

devices:
  enp1s0:
    nictype: bridged
    parent: vlan36
    type: nic

Mas aparentemente não é tão fácil lidar com o Docker. Depois de horas pesquisando fontes em redes docker, descobri isso.

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

Isso parecia funcionar perfeitamente. A conexão de contêineres funcionou bem, eles tinham acesso à rede, meu roteador podia vê-los conectados, o ping de outros dispositivos na rede também estava funcionando, mas. Você não pode estabelecer uma conexão de entrada com os contêineres. Fazer ping em um contêiner apenas resulta em uma rede inacessível. E isso não está afetando apenas o Docker, mas também o LXD. Portanto, mesmo que o Docker pareça simplesmente adotar a ponte, ele faz alguma coisa com ela. Desativar o serviço Docker e reinicializar corrige o problema dos contêineres LXD.

Responder1

Esta solução não parece certa, mas funciona e parece se comportar da maneira que eu quero. Acho que o problema é que o bridgedriver não suporta -o parent. Em vez disso, apenas criará seu próprio dispositivo.

plano de rede

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>

informação relacionada