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