Я настраиваю сервер с 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>