简介
docker的使用都是基于端口映射进行使用的,但是作为实际中,我们需要直接对docker分配物理网络中的ip会更方便
直接用交换机和路由器对其进行管理
解决方法
在docker中,提供了ipvlan和macvlan两种方式可以达成这个目的,同时还可以支持ipv6
缺点是无法容器无法dhcp来获得ip,只能自己定义ip范围。且多个机子得自己指定network中分配的ip段
同时同一个物理网卡中ipvlan和macvlan不能同时存在,会报device or resource busy
环境
ubuntu20.04-5.4.0-91
docker-ce:19.03.14
ipvlan
可以获得物理ip,但是由于没有mac地址,所以在交换机显示的还是物理网卡的mac地址
subnet,gateway,ip-range,parent根据自己实际情况进行更改
ipvlan_mode有两种,l2是二层交换机,l3是三层交换机,根据自己需求来使用,一般应该l2就可以满足了
参考链接
docker network create -d ipvlan --subnet=10.1.8.0/25 --gateway=10.1.8.1 -o ipvlan_mode=l2 --ip-range=10.1.8.49/30 -o parent=ens192 ipvlan
使用方法
docker run --net=ipvlan -itd nginx
macvlan
多了一个mac地址,其他的和ipvlan基本上没有区别
macvlan_mode有bridge,passthru,private,VEPA
正常推荐直接默认的bridge
参考链接
docker network create -d macvlan --subnet=10.1.8.0/25 --ip-range=10.1.8.19/30 --gateway=10.1.8.1 -o macvlan_mode=bridge -o parent=ens192 macvlan
使用方法
docker run --net=macvlan -itd nginx
小记
在使用macvlan的情况下需要开启内核转发
/etc/sysctl.conf
net.ipv4.ip_forward = 1
临时
sysctl -w net.ipv4.ip_forward=1
所以如果自己内网构建的话对mac地址无需求的情况下直接选ipvlan吧
出现网络不可达的情况下可能需要通过iptables进行放开
iptables -I DOCKER -d 10.1.8.1/8 -j ACCEPT
思考
如果两台机子,同时使用一个分配的段,会是什么结果
A 10.1.8.3
B 10.1.8.4
docker run --net=ipvlan -itd nginx
这时候两台nginx都是10.1.8.48
在A上面
root@53579423823f:/usr/share/nginx/html# echo 1 > index.html
root@53579423823f:/usr/share/nginx/html# exit
exit
curl 10.1.8.48
2
在B上面
root@c989601b4464:/# echo 2 > /usr/share/nginx/html/index.html
root@c989601b4464:/# exit
exit
curl 10.1.8.48
1
实验多次都是这个结果,好家伙,兔子不吃窝边草,专门挑别人家的。很值得学习
此时,如果是外面的机子访问,会有什么情况呢?
PING 10.1.8.48 (10.1.8.48) 56(84) bytes of data.
64 bytes from 10.1.8.48: icmp_seq=1 ttl=63 time=0.486 ms
64 bytes from 10.1.8.48: icmp_seq=2 ttl=63 time=0.757 ms
^C
curl 10.1.8.48
1
我们调换创建的顺序发现和创建的时间有关,不过这可以算一个同ip的负载均衡的解决方法。感觉这儿可以有点思考的空间