首页 > 解决方案 > 将 docker bridge 网络绑定到特定接口,或以其他方式支持 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,MULTICAST,UP,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,MULTICAST,UP,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)作为父级,它仍然无法正常工作。我是否需要配置子网和网关以匹配 enp36s0/enp36s0.100 的 DHCP 分配设置?这似乎完全多余并且容易出错。另外,我需要在那里分配一个由 DHCP 分配的地址,以便它可以接收来自网络上其他机器的请求。

提前感谢您的帮助。我知道有一些类似的问题,但我一直无法找到答案。

标签: dockerdocker-composevlanmacvlan

解决方案


推荐阅读