我想创建一个 docker 网络,其中所有数据包都标记有 VLAN ID,并且该网络上的容器可以通过由 DHCP 分配 IP 地址的接口公开端口。
我希望我可以通过桥接网络做到这一点。我的第一次尝试是
- 创建带有 VLAN 标记的接口:
sudo nmcli con add type vlan con-name enp36s0.100 dev enp36s0 id 100
- 看到这个接口被 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
- 创建网络(以下是 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 分配的地址,以便它可以接收来自网络上其他机器的请求。
提前感谢您的帮助。我知道有一些类似的问题,但我一直无法找到答案。