分布式架构——第9篇:MACVLAN网络(Docker直连物理网络)

上一篇文章《TP-LINK路由器固定IP地址上网以及电脑静态IP分配》详细的描述了IP地址的分配。本文将在此基础上,又搭建了一个docker macvlan网络,通过为物理网卡创建macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址IP地址。虚拟出来的子接口将直接暴露在底层物理网络中。从外界看来,就像是把网线分成多股,分别接到了不同的主机上一样。


拥有设备情况,本文拥有一个路由器、两台台式机,其中:

  • 192.168.1.1/24 为路由器网关。
  • 192.168.1.2/24 我的平时工作的开发机(台式机)。
  • 192.168.1.3/24 我的一台性能较高的服务器(台式机,运行着ubuntu server 18.04操作系统)。

我平时通过ssh对服务器进行管理,现在由于跑分布式,服务器台数不够,我需要将192.168.1.3/24虚拟化为多台服务器,至少对外表现为多台服务器(即上图中的docker macvlan)。

启用网卡混杂模式

启用混杂模式后,一台机器的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它。物理网卡收到包后,会根据收到包的目的MAC地址判断这个包需要交给哪个虚拟网卡。具体设计可以参考《网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP》

$ sudo ifconfig eno1 promisc
$ ifconfig eno1

eno1: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
inet 192.168.1.3 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::6e0b:84ff:fe41:a787 prefixlen 64 scopeid 0x20<link>
ether 6c:0b:84:41:a7:87 txqueuelen 1000 (Ethernet)
RX packets 685823 bytes 921855615 (921.8 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 377468 bytes 30384227 (30.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 20 memory 0xf7100000-f7120000

注意到,<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>执行以上命令后,这里增加了一个PROMISC

如果需要关闭网卡混杂模式:

$ sudo ifconfig eno1 -promisc

创建macvlan网络

这里--subnet为192.168.1.0/24,--gateway为192.168.1.1,parent为eno1。网络名为pub_net
e.g.

$ sudo docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eno1 pub_net

使用macvlan网络

使用网络时,只需要指定--net以及--ip即可。这里以运行nginx为例,--name-v为可选参数,根据自己需求设置。

e.g.

$ sudo docker run --net=pub_net --ip=192.168.1.4 --name docker_macvlan_nginx \
-v ~/apps/docker/nginx/www:/www \
-v ~/apps/docker/nginx/conf:/conf \
-v ~/apps/docker/logs:/wwwlogs -d nginx

一些常用指令

包括启动、停止容器,查看docker网络,删除网络等。

$ sudo docker container stop docker_macvlan_nginx
$ sudo docker container start docker_macvlan_nginx
$ sudo docker network ls

NETWORK ID NAME DRIVER SCOPE
f5ea6d307a29 bridge bridge local
a4ecdafa0989 host host local
1cf598836aee none null local
222a668c7298 pub_net macvlan local

$ sudo docker container stop docker_macvlan_nginx
$ sudo docker network rm pub_net

References:
[1] https://zh.wikipedia.org/wiki/%E6%B7%B7%E6%9D%82%E6%A8%A1%E5%BC%8F
[2] https://blog.kghost.info/2013/03/27/linux-network-tun/
[3] https://cizixs.com/2017/02/14/network-virtualization-macvlan/
[4] http://www.ywnds.com/?p=4714
[5] http://www.10tiao.com/html/357/201704/2247485101/1.html
[6] https://docs.docker.com/network/network-tutorial-macvlan/
[7] https://docs.docker.com/network/
[8] https://docs.docker.com/network/macvlan/