向 Docker 添加非托管桥

向 Docker 添加非托管桥

我正在使用 Docker 和 LXD 设置服务器。我有一个包含多个 VLAN 的真实网络,我希望可以桥接这些 VLAN,这些 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 添加 NIC 一样简单。

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

但 Docker 显然不是那么容易处理的。经过几个小时搜索 Docker 网络上的资源后,我想到了这个。

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

这似乎可以很好地完成工作。连接容器工作正常,它们可以访问网络,我的路由器可以看到它们已连接,对网络上的其他设备进行 ping 操作也有效,但是。您无法建立返回容器的传入连接。对容器进行 ping 操作只会导致网络无法访问。这不仅影响 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>

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>

相关内容