【发布时间】:2018-12-24 15:21:48
【问题描述】:
所以我正在尝试创建一个网络 (docker network create),以便其流量将通过特定的物理网络接口 (NIC);我有两个:<iface1>(内部)和<iface2>(外部)。
我需要将两个 NIC 的流量进行物理分离。
方法一:
我认为macvlan 是用于创建此类网络的驱动程序。
对于我在互联网上找到的大部分内容,解决方案是指 Pipework(现已弃用)和临时 docker-plugins(也已弃用)。
最能帮助我的是this1
docker network create -d macvlan \
--subnet 192.168.0.0/16 \
--ip-range 192.168.2.0/24 \
-o parent=wlp8s0.1 \
-o macvlan_mode=bridge \
macvlan0
然后,为了让容器从主机可见,我需要在主机中执行此操作:
sudo ip link add macvlan0 link wlp8s0.1 type macvlan mode bridge
sudo ip addr add 192.168.2.10/16 dev macvlan0
sudo ifconfig macvlan0 up
现在容器和主机互相看到了:) 但是容器无法访问本地网络。 这个想法是容器可以访问互联网。
方法2:
因为我将手动使用<iface2>,所以如果默认情况下流量通过<iface1>,我没问题。
但无论我以哪种顺序启动 NIC(我也尝试暂时删除 <iface2> 的 LKM);整个流量总是被外部网卡<iface2> 取代。
我发现它发生是因为路由表会在某个“随机”时间自动更新。
为了强制流量通过<iface1>,我必须(在主机中):
sudo route del -net <net> gw 0.0.0.0 netmask 255.0.0.0 dev <iface2>
sudo route del default <iface2>
现在,我可以(通过多种方式)验证流量是否刚刚通过<iface1>。
但是路由表更新(自动)的那一刻,所有流量都移动到<iface2>。该死!
我确信有一种方法可以使路由表“静态”或“持久”。
编辑(2018 年 7 月 18 日): 主要思想是能够通过 docker 容器使用 仅一个 两个可用的物理网络接口访问互联网。
【问题讨论】:
标签: docker networking docker-networking nic macvlan