通过特定物理接口实现 Docker 网络

5
所以我正在尝试创建一个网络(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容器中的互联网。

1个回答

0

我的环境:

在为虚拟机创建的主机上,使用ip地址192.168.122.1创建了vm virbr0桥接,并启动了带有ens3接口和ip地址192.168.122.152的vm实例。

192.168.122.1 - 是192.168.122.0/24网络的网关。

进入虚拟机:

创建网络:

 # docker network create --subnet 192.168.122.0/24 --gateway 192.168.122.1 --driver macvlan -o parent=ens3 vmnet

创建 Docker 容器:
# docker run -ti --network vmnet alpine ash

检查:

/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
12: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:c0:a8:7a:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.2/24 brd 192.168.122.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping 192.168.122.152
PING 192.168.122.152 (192.168.122.152): 56 data bytes
^C
--- 192.168.122.152 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
/ # ping 192.168.122.1
PING 192.168.122.1 (192.168.122.1): 56 data bytes
64 bytes from 192.168.122.1: seq=0 ttl=64 time=0.471 ms
^C
--- 192.168.122.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.471/0.471/0.471 ms

好的,我又启动了一个带有IP地址192.168.122.73的虚拟机,并从Docker中进行了检查:

/ # ping 192.168.122.73 -c2
PING 192.168.122.73 (192.168.122.73): 56 data bytes
64 bytes from 192.168.122.73: seq=0 ttl=64 time=1.630 ms
64 bytes from 192.168.122.73: seq=1 ttl=64 time=0.984 ms

--- 192.168.122.73 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.984/1.307/1.630 ms

从 Docker 实例无法 ping VM 上的接口,但可以访问本地网络。

/ # ip n|grep 192.168.122.152
192.168.122.152 dev eth0  used 0/0/0 probes 6 FAILED

在虚拟机上,我添加了macvlan0网卡:

# ip link add macvlan0 link ens3 type macvlan mode bridge
# ip addr add 192.168.122.100/24 dev macvlan0
# ip l set macvlan0 up

从Docker中,我可以ping通192.168.122.100:

/ # ping 192.168.122.100 -c2
PING 192.168.122.100 (192.168.122.100): 56 data bytes
64 bytes from 192.168.122.100: seq=0 ttl=64 time=0.087 ms
64 bytes from 192.168.122.100: seq=1 ttl=64 time=0.132 ms

--- 192.168.122.100 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.087/0.109/0.132 ms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接