所以我正在尝试创建一个网络(
现在容器和主机可以相互通信 :) 但是容器无法访问本地网络。我们的想法是让容器能够访问互联网。
现在,我可以通过几种方式验证,流量只通过
docker network create
),以便其流量将通过特定的物理网络接口(NIC)传递;我有两个: <iface1>
(内部)和 <iface2>
(外部)。
我需要两个NIC的流量在物理上分离。
方法1:
我认为应该使用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);整个流量总是被外部NIC <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容器中的互联网。