Добавить неуправляемый мост в Docker

Добавить неуправляемый мост в Docker

Я настраиваю сервер с Docker и LXD. У меня есть настоящая сеть с несколькими vlan, к которым я хочу иметь мосты, которые можно совместно использовать между Docker и LXD. Это было относительно легко с LXD, но Docker — это как надоедливая подружка, которая хочет все контролировать, поэтому мне сложно заставить его работать хорошо.

Вот конфигурация 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

С LXD это было так же просто, как добавить сетевую карту в одну из VLAN.

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

Но с Docker, судя по всему, не так-то просто иметь дело. После нескольких часов поиска в источниках на docker networks я пришел к этому.

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

Казалось, что это отлично справляется с задачей. Подключение контейнеров работает нормально, у них есть доступ к сети, мой маршрутизатор видит их подключенными, пингование других устройств в сети также работает, но. Вы не можете установить входящее соединение обратно к контейнерам. Пингование контейнера просто приводит к недоступности сети. И это влияет не только на Docker, но и на LXD. Поэтому, хотя Docker, кажется, просто принимает мост, он что-то с ним делает. Отключение службы Docker и перезагрузка устраняет проблему для контейнеров LXD.

решение1

Это решение не выглядит правильным, но оно работает и, кажется, ведет себя так, как я хочу. Думаю, проблема в том, что драйвер bridgeне поддерживает -o parent. Вместо этого он просто создаст свое собственное устройство.

нетплан

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>

ЛКД

devices:
  enp1s0:
    nictype: bridged
    parent: vlan<VLAN>

Докер

root@host:~# docker network create <NETWORK_NAME> \
            --subnet 192.168.x.x/24 \
            --gateway 192.168.x.254 \
            --driver macvlan \
            -o parent=vlan<VLAN>

Связанный контент