问题描述
我想创建一个 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,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
- 创建网络(以下是 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 (将#修改为@)