Estou configurando um servidor com Docker e LXD. Eu tenho uma rede real com várias vlans para as quais quero ter pontes, que podem ser compartilhadas entre Docker e LXD. Isso foi relativamente fácil com o LXD, mas o Docker é como aquela namorada chata que quer controlar tudo, então estou tendo dificuldade em fazê-lo funcionar bem.
Aqui está a configuração do 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
Com o LXD isso foi tão fácil quanto simplesmente adicionar uma NIC a uma das vlans.
devices:
enp1s0:
nictype: bridged
parent: vlan36
type: nic
Mas aparentemente não é tão fácil lidar com o Docker. Depois de horas pesquisando fontes em redes docker, descobri isso.
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
Isso parecia funcionar perfeitamente. A conexão de contêineres funcionou bem, eles tinham acesso à rede, meu roteador podia vê-los conectados, o ping de outros dispositivos na rede também estava funcionando, mas. Você não pode estabelecer uma conexão de entrada com os contêineres. Fazer ping em um contêiner apenas resulta em uma rede inacessível. E isso não está afetando apenas o Docker, mas também o LXD. Portanto, mesmo que o Docker pareça simplesmente adotar a ponte, ele faz alguma coisa com ela. Desativar o serviço Docker e reinicializar corrige o problema dos contêineres LXD.
Responder1
Esta solução não parece certa, mas funciona e parece se comportar da maneira que eu quero. Acho que o problema é que o bridge
driver não suporta -o parent
. Em vez disso, apenas criará seu próprio dispositivo.
plano de rede
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>
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>