简介
Macvlan网络通过为物理网卡额外添加MAC地址的形式来复用物理网卡,也就是说Macvlan网络直接使用服务器上的网卡,这是它的一个缺点。一般旧式的docker应用或者直接监控网卡流量的应用才会使用这种网络方案。
Macvlan有如下特点
- 容易对服务器网络产生不良影响。由于它直接使用物理网卡,网卡对于服务器来说是稀缺资源,因此Macvlan的扩展性差
- Macvlan挂在vlan下面。即网卡的自网卡,即使这样,vlan的数目最多也就是4000左右,对于数据中心来说依然是严重不足的。
- 网卡必须支持混杂模式。只有混杂模式下的网卡才支持多MAC地址
使用Macvlan网络
可以通过两种方式创建Macvlan,第一种是直接使用物理网卡(bridge mode),第二种是使用vlan(802.1q trunk bridge mode)。网络结构如下:
Bridge Mode
通过docker network create
命令的参数指定驱动(–driver)类型为maclan
即可创建Macvlan网络;在创建的时候,我们无需手动为网卡添加MAC地址,但是必须明确指定使用的subnet和gateway,且指明使用的父网卡。
以下命令在两台主机上执行,创建名为mvnet的macvlan网络
1 2 3 4 5 |
[root@dellcentos7 ~]# docker network create --driver macvlan \ --subnet 172.19.0.0/24 \ --gateway 172.19.0.1 \ -o parent=enp2s0 mvnet |
创建容器并指定网络为mvnet
为了避免自动分配IP地址造成的IP地址冲突,采用静态分配IP地址
1 2 3 4 5 6 7 8 9 10 |
# 主机1 [root@dellcentos7 ~]# docker run --name busybox1 \ --network mvnet \ --ip 172.19.0.2 -itd busybox # 主机2 [root@centos7-server ~]# docker run --name busybox2 \ --network mvnet \ --ip 172.19.0.3 -itd busybox |
进入busybox1测试网络
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@dellcentos7 ~]# docker exec -it busybox1 /bin/sh / # ping 172.19.0.3 -c 2 PING 172.19.0.3 (172.19.0.3): 56 data bytes 64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.243 ms 64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.222 ms --- 172.19.0.3 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.222/0.232/0.243 ms / # ping busybox2 ping: bad address 'busybox2' |
使用IP地址ping busybox2,可以正常连通,但使用名称则不通,说明macvlan不提供DNS解析。
802.1q trunk bridge mod
基于vlan的macvlan创建过程和上面的一样,不同的只是父网卡是一个子网卡
以下命令在两台主机上执行
1 2 3 4 |
docker network create --driver macvlan \ --subnet 172.20.0.0/24 --gateway 172.20.0.1 \ -o parent=enp2s0.20 mvnet2 |
注意parent=enp2s0.20
,我们不需要自己创建这个子网卡,当上面的命令执行完毕,会自动为我们创建好这个设备
1 2 3 4 5 6 7 8 9 |
[root@dellcentos7 ~]# ifconfig enp2s0.20 enp2s0.20: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::222:19ff:fe0e:3fd7 prefixlen 64 scopeid 0x20<link> ether 00:22:19:0e:3f:d7 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 648 (648.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
使用方法也是一样
1 2 3 |
[root@dellcentos7 ~]# docker run --name busybox3 \ --network mvnet2 --ip 172.20.0.2 -itd busybox |
不同网段之间的通讯
不同网段之间的容器默认不能互相通讯,即172.19.0.0/24
和172.20.0.0/24
默认是两个隔离的网络,如果要两个网络可以通讯,必须配置系统的iptalbes转发数据。
总结
macvlan的使用十分简单
- 它直接使用服务器的物理网卡作为媒介通讯
- 可绑定到vlan
- 网络创建的过程必须显式指定subnet和gateway
- 通讯双方的网段必须一致
- 创建容器的时候最好手动分配IP地址,避免IP地址冲突
转载请注明:Pure nonsense » Docker容器之macvlan网络