docker和macvlan

作者: 大雄good | 来源:发表于2018-11-06 00:45 被阅读0次

Macvlan

最近做一个项目,需要把container的ip暴露给外面,Google了一下发现使用macvlan或者overlay技术来实现。同时macvlan的配置更简单,并且没有使用docker的bridge,转发效率更高。因此这里就简单对macvlan学习了一下,并做了实验。这个链接还行,有抓包分析https://www.cnblogs.com/iiiiher/p/8067226.html
,我这里就不贴抓包结果了。

关于macvlan的理解

首先,从网上我们可以看到,macvlan技术就是在物理网卡下,添加另一张虚拟网卡,其实就是在物理网卡下添加了一个条件分支。我们可以认为报文从物理网卡进入之后,会做一个switch判断,如果该报文mac属于macvlan,则直接发往macvlan后面的网络,否则就发往原host的网络。这里简单的做个试验就知道了。

macvlan原理.png

首先我们创建一个macvlan docker网络:

docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--ip-range=192.168.1.0/24 \
-o macvlan_mode=bridge \
-o parent=enp0s3 macvlan

然后我们起一个container,ip为192.168.1.11:

docker run -d --net=macvlan --ip=192.168.1.11 --name ngix ngix

ok,按照网上的说法,这个container确实没法ping通host,但是它是能够ping通外接的switch,这个我在公司有做过,介于公司的隐私问题,这里就不贴出来了。这里我想给出一个方案,使得container能够ping通host,网上多数关于macvlan的教程并没有提到这点。

我们利用linux创建一个macvlan类型的link,同时赋予一个与container同网段的ip:

sudo ip link add mymacvlan link enp0s3 type macvlan mode bridge
sudo ip addr add 192.168.1.10/24 dev mymacvlan
sudo ifconfig mymacvlan up

再尝试ping, ok完全没问题,ping通:

➜  ping 192.168.1.11
PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.
64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=0.142 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=64 time=0.069 ms
64 bytes from 192.168.1.11: icmp_seq=3 ttl=64 time=0.050 ms
64 bytes from 192.168.1.11: icmp_seq=4 ttl=64 time=0.066 ms
64 bytes from 192.168.1.11: icmp_seq=5 ttl=64 time=0.062 ms
64 bytes from 192.168.1.11: icmp_seq=6 ttl=64 time=0.064 ms

这里贴出tcpdump的抓包结果,可以看到是由我们添加的link192.168.1.10发起的icmp请求。我理解其实就是通过macvlan的bridge模式建立了一条与container之间的通路。

抓包结果

带vlan的macvlan

我理解的带vlan的macvlan其实并不是macvlan实现的,实际上是linux的子接口本身就是利用vlan来区别不同的子接口,而macvlan依附在子接口上,为子接口上加了一个mac,因此从子接口macvlan出来的报文都会带有vlan tag。

ok,再做一次实验, 这次配置与上面类似,只是用的是子接口:

docker network create -d macvlan \
--subnet=192.168.2.0/24 \
--ip-range=192.168.2.0/24 \
-o macvlan_mode=bridge \
-o parent=enp0s3.20 macvlan20

docker run -d --net=macvlan20 --ip=192.168.2.11 --name ngix ngix

sudo ip link add mymacvlan20 link enp0s3.20 type macvlan mode bridge
sudo ip addr add 192.168.2.10/24 dev mymacvlan20
sudo ifconfig mymacvlan20 up

同时我们看一看interface:

➜  ~ ip -d link
34: enp0s3.20@enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether 08:00:27:0a:7c:d0 brd ff:ff:ff:ff:ff:ff promiscuity 1 
    vlan protocol 802.1Q id 20 <REORDER_HDR> addrgenmode eui64 

可以看到我们添加了一个子接口,同时这个子接口有带vlan id 20
,使用的802.1q协议。

再来ping一次,完全没问题:

➜  ~ ping 192.168.2.11
PING 192.168.2.11 (192.168.2.11) 56(84) bytes of data.
64 bytes from 192.168.2.11: icmp_seq=1 ttl=64 time=0.175 ms
64 bytes from 192.168.2.11: icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from 192.168.2.11: icmp_seq=3 ttl=64 time=0.126 ms
64 bytes from 192.168.2.11: icmp_seq=4 ttl=64 time=0.061 ms

如果抓包看看,出去的报文应该是带了vlan20的tag,在公司有做实验,本人电脑太挫就没法贴出结果了。

相关文章

  • 开发跨主机docker macvlan 和overlay 网络管

    docker 1.12中支持了overlay和macvlan网络,虽然macvlan仍处于实验阶段。 macvla...

  • docker和macvlan

    Macvlan 最近做一个项目,需要把container的ip暴露给外面,Google了一下发现使用macvlan...

  • Docker macvlan

    默认情况下docker使用bridge网络,这是一个私有网络,只能在host和container之间互通,如果发布...

  • docker 搭建macvlan 网络

    docker 搭建macvlan 网络 简单说,macvlan就是在宿主的网卡设置多个vlan信息,根据走的网卡不...

  • docker 搭建macvlan 网络

    docker 搭建macvlan 网络 简单说,macvlan就是在宿主的网卡设置多个vlan信息,根据走的网卡不...

  • docker 网络-macvlan

    1、什么是macvlan ,解决什么问题。有什么限制条件? macvlan.png1、网络结构 所有VM /nam...

  • docker vlan配置

    使用pipework为docker容器添加IP 使用Docker的macvlan为容器提供桥接网络及跨主机通讯 三...

  • docker容器技术学习笔记(9、跨主机网络)

    跨主机网络 跨主机网络方案包括:1、docker 原生的 overlay 和 macvlan。2、第三方方案:常用...

  • Docker macvlan host to container

    使用通常的方式创建macvlan,容器关联macvlan网络,网内其他主机都可以互通访问,但唯独host和cont...

  • docker network

    docker 网络的种类 host bridge overlay Macvlan host 如果你对一个容器使用的...

网友评论

    本文标题:docker和macvlan

    本文链接:https://www.haomeiwen.com/subject/xgqyxqtx.html