使用macvlan技术给docker容器设置一个和主机同一网段的ip地址
为什么要使用macvlan技术给docker容器设置IP
在日常使用docker的时候,经常需要通过网络IP地址访问镜像,这个时候可以通过设置端口映射的方式,让客户机访问docker镜像的物理机IP的映射后的端口,实现通过IP访问docker容器的目的,但是这种操作仅仅是权宜之策,还有有办法可以实现给docker镜像固定IP的,macvlan技术就可以实现这一操作。
macvlan介绍
macvlan 技术能将 一块物理网卡虚拟成多块虚拟网卡,这样就可以实现给虚拟设备一个虚拟网卡,docker这种容器就可以通过虚拟网卡获取IP,利用IP进行独立上网,真正做到跟物理机完全一样的体验。
macvlan 是 Linux kernel 支持的新特性,支持的版本有 v3.9-3.19 和 4.0+,比较稳定的版本推荐 4.0+。它一般是以内核模块的形式存在,我们可以通过以下方法判断当前系统是否支持:
modprobe macvlanlsmod | grep macvlanmacvlan24576 0
如果显示最后一段话,则说明系统支持macvlan。
如果第一个命令报错,或者第二个命令没有返回,说明当前系统不支持 macvlan,需要升级内核。
由于个人不是计算机网络这块的研究者,对于这块不是很懂,以下介绍参考自《网卡也能虚拟化?网卡虚拟化技术 macvlan 详解》:
macvlan 这种技术听起来有点像 VLAN,但它们的实现机制是完全不一样的。macvlan 子接口和原来的主接口是完全独立的,可以单独配置 MAC 地址和 IP 地址,而 VLAN 子接口和主接口共用相同的 MAC 地址。VLAN 用来划分广播域,而 macvlan 共享同一个广播域。
通过不同的子接口,macvlan 也能做到流量的隔离。macvlan 会根据收到包的目的 MAC 地址判断这个包需要交给哪个虚拟网卡,虚拟网卡再把包交给上层的协议栈处理。
根据 macvlan 子接口之间的通信模式,macvlan 有四种网络模式:
private 模式vepa(virtual ethernet port aggregator) 模式bridge 模式passthru 模式
默认使用的是 vepa 模式,常用的是bridge 模式。
docker创建macvlan
首先需要查询网卡的名字:使用ifconfig命令查看网卡名:
用户名@主机名:~$ ifconfig[网卡名]:inet [主机IP] netmask [子网掩码] broadcast [网关地址]
会出现如上格式所示的内容,我们需要记住的是[网卡名]和[网关地址]
可以使用如下命令给docker创建一个虚拟网络,
docker network create -d macvlan --subnet=[网段] --gateway=[网关] -o parent=[网卡] macvlan例如,我查询到的网卡名是eth0,网关是192.168.1.1,这样我可以创建一个名字叫new_macvlan的macvlan网络如下:docker network create -d macvlan --subnet=192.168.1.1/24 --gateway=192.168.1.1 -o parent=eth0 new_macvlan
给docker容器一个IP
之后如果想给容器一个固定IP,可以使用如下命令创建一个容器,并给它一个固定IP:
docker run -it --name [容器名] --net macvlan --ip=[固定IP] [镜像名] /bin/bash例如,我想以centos镜像创建一个名字叫test的容器,并给它一个IP为192.168.1.10docker run -it --name test --net macvlan --ip=192.168.1.10 centos /bin/bash
参考文献
[1] 网卡也能虚拟化?网卡虚拟化技术 macvlan 详解 /bakari/p/10641915.html
[2] Use macvlan networks /network/macvlan