將非託管橋接器新增至 Docker

將非託管橋接器新增至 Docker

我正在使用 Docker 和 LXD 設定伺服器。我有一個真實的網絡,有幾個 VLAN,我想橋接它,可以在 Docker 和 LXD 之間共用。這對 LXD 來說相對容易,但 Docker 就像那個煩人的女朋友想要控制一切,所以我很難讓它發揮得很好。

以下是網路規劃配置:

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,這就像簡單地將 NIC 添加到其中一個 VLAN 一樣簡單。

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>

LXD

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>

相關內容