将 docker 网桥网络绑定到特定接口,或以其他方式支持 VLAN 标记网络

问题描述

我想创建一个 docker 网络,其中所有数据包都标有 VLAN ID,并且该网络上的容器可以通过由 DHCP 分配 IP 地址的接口公开端口。

我希望我可以通过桥接网络来做到这一点。我的第一次尝试是

  1. 创建带有 VLAN 标记的接口: sudo nmcli con add type vlan con-name enp36s0.100 dev enp36s0 id 100
  2. 看到 DHCP 为该接口分配了一个地址,用于正确的子网(它是)
[kevin@atlas ~]$ sudo ip addr | grep enp
2: enp35s0: <broADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.1.64/24 brd 192.168.1.255 scope global dynamic noprefixroute enp35s0
3: enp36s0: <broADCAST,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.1.201/24 brd 192.168.1.255 scope global dynamic noprefixroute enp36s0
33014: enp36s0.100@enp36s0: <broADCAST,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    inet 192.168.100.2/24 brd 192.168.100.255 scope global dynamic noprefixroute enp36s0.100
  1. 创建网络(以下是 docker-compose 文件的摘录):
  docker-access:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.host_binding_ipv4: "192.168.100.2"

这适用于在正确的接口上公开端口,但容器仍在通过其他网络访问互联网。我不知道流量是如何路由的,但我用路由器上的路由规则验证了这一点。在主机上运行 curl --interface enp36s0.100 www.google.com 时,它会根据该 VLAN 接口的路由器配置正常工作或不工作,但在容器中,只要主机网络工作,它就会工作。

在这上面花了很多时间之后,看来我可能需要使用 macvlan 网络。但是,我希望我不需要;我实际上不需要容器直接访问任何接口。尽管如此,我还是尝试了以下网络:

  docker-access2:
    driver: macvlan
    driver_opts:
      parent: enp36s0.100

这个 macvlan 网络似乎无法正常工作。事实上,即使以enp36s0(无VLAN)为parent,也还是不行。我是否需要配置子网和网关以匹配 enp36s0/enp36s0.100 的 DHCP 分配设置?这似乎完全是多余的,而且容易出错。另外,我需要在那里通过 DHCP 分配一个地址,以便它可以接收来自网络上其他机器的请求。

在此先感谢您的帮助。我知道有几个类似的问题,但我一直找不到答案。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)