我正在使用 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>