docker网络模式macvlan验证

这两天一直在研究docker的网络模型,主要是研究docker之间互相连通啦。

除了docker自带的brage模式以外,跨主机方案主要是macvlan,本篇文章就是对macvlan方式做一个实验记录;

特别提醒,有两个博客https://blog.csdn.net/ymeng9527/article/details/98529320https://blog.csdn.net/wfs1994/article/details/80659232说的不是很清楚,第二个博客在创建macvlan的命令是错的,错写成了vlan,实在是不负责任。。。。如果按照这个命令,两个相同的macvlan之间是容器也是ping不通的。

参考:https://blog.csdn.net/hzj_001/article/details/100182686

            https://blog.csdn.net/hzj_001/article/details/100184298

docker基本知识:https://www.runoob.com/docker/docker-command-manual.html

这两个博客作者就很良心了,点赞!!!

 

找两台机器10.110.*.174和10.110.*.175

分别在两台机器上面执行:

#设置网络10
ip link add link enp88s0f1 dev enp88s0f1.10 type macvlan mode bridge
ip link set dev enp88s0f1.10 up
docker network create -d macvlan --subnet=172.16.10.0/24 --gateway=172.16.10.1 -o parent=enp88s0f1.10 mac_net10

#设置网络20
ip link add link enp88s0f1 dev enp88s0f1.20 type macvlan mode bridge
ip link set dev enp88s0f1.20 up
docker network create -d macvlan --subnet=172.16.20.0/24 --gateway=172.16.20.1 -o parent=enp88s0f1.20 mac_net20
#在host174上面
ip addr add 172.16.20.4/24 brd  10.110.153.254 dev enp88s0f1.20
ip addr add 172.16.10.4/24 brd  10.110.153.254 dev enp88s0f1.10
docker run -itd  --name vm174-10 --network=mac_net10 --ip=172.16.10.174 10.110.152.173:80/base_env/ubuntu:v1.0.0.0  /bin/bash
docker run -itd  --name vm174-20 --network=mac_net20 --ip=172.16.20.174 10.110.152.173:80/base_env/ubuntu:v1.0.0.0  /bin/bash
#在host175上面
ip addr add 172.16.20.5/24 brd 10.110.153.254 dev enp88s0f1.20
ip addr add 172.16.10.5/24 brd 10.110.153.254 dev enp88s0f1.10
docker run -itd --name vm175-10 --network=mac_net10 --ip=172.16.10.175 10.110.152.173:80/base_env/ubuntu:v1.0.0.0  /bin/bash
docker run -itd --name vm175-20 --network=mac_net20 --ip=172.16.20.175 10.110.152.173:80/base_env/ubuntu:v1.0.0.0  /bin/bash

拓扑图如下:

下面是两个机器的清理脚本: 

#174上面的清理脚本
docker kill vm174-10
docker kill vm174-20
docker rm vm174-10
docker rm vm174-20
docker network rm mac_net10 mac_net20
ip link set dev enp88s0f1.10 down
ip link set dev enp88s0f1.20 down
ip link delete  enp88s0f1.10
ip link delete  enp88s0f1.20
ip addr del 172.16.20.4/24 brd 172.16.20.255 dev enp88s0f1.20
ip addr del 172.16.10.4/24 brd 172.16.10.255 dev enp88s0f1.10
#175上面的清理脚本
ip addr del 172.16.20.5/24 brd 172.16.20.255 dev enp88s0f1.20
ip addr del 172.16.10.5/24 brd 172.16.10.255 dev enp88s0f1.10
docker kill vm175-10
docker kill vm175-20
docker rm vm175-10
docker rm vm175-20
docker network rm mac_net10 mac_net20
ip link set dev enp88s0f1.10 down
ip link set dev enp88s0f1.20 down
ip link delete  enp88s0f1.10
ip link delete  enp88s0f1.20

 

如何使10网段和20网段的docker连接呢?

拓扑图如下:

找到另一台机器173(图中host3),在上面添加两个接口macvlan,注意必须是macvlan网络,否则是不行的哦。

ip link add link enp88s0f1 dev enp88s0f1.10 type macvlan mode bridge
ip link add link enp88s0f1 dev enp88s0f1.20 type macvlan mode bridge
ip addr add 172.16.20.1/24 brd 10.110.153.254 dev enp88s0f1.20
ip addr add 172.16.10.1/24 brd 10.110.153.254 dev enp88s0f1.10
ip link set dev enp88s0f1.10 up
ip link set dev enp88s0f1.20 up

至于为什么能够互连,可以先看下docker中的网络路由:ip route

#我们在创建容器的时候指定了网关 172.16.10.1,所以数据包自然会被路由到 173 的接口
root@ubuntu:~# docker exec d1 ip route
default via 172.16.10.1 dev eth0 
172.16.10.0/24 dev eth0 scope link  src 172.16.10.10

然后再看看173上面的路由

#可以看到,去往 172.16.10.0/24 网段的数据包会从 enp88s0f1.10 出去,
#同理 172.16.20.0/24 网段也是,
#再加上 173 的 ip_forward 打开,这就打通了两个 macvlan 网络之间的通路。
[root@localhost ~]# ip route
default via 192.168.108.1 dev enp0s3 proto dhcp metric 100 
172.16.10.0/24 dev enp88s0f1.10 proto kernel scope link src 172.16.10.1 
172.16.20.0/24 dev enp88s0f1.20 proto kernel scope link src 172.16.20.1 
192.168.56.0/24 dev enp0s8 proto kernel scope link src 192.168.56.122 metric 101 
192.168.108.0/24 dev enp0s3 proto kernel scope link src 192.168.108.2 metric 100


如果还是不好用,那么添加如下的iptables
iptables -t nat -A POSTROUTING -o enp88s0f1.10 -j MASQUERADE
iptables -t nat -A POSTROUTING -oenp88s0f1.20 -j MASQUERADE
iptables -A FORWARD -i enp88s0f1.10 -o enp88s0f1.20 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i enp88s0f1.20 -o enp88s0f1.10 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i enp88s0f1.10 -o enp88s0f1.20 -j ACCEPT
iptables -A FORWARD -i enp88s0f1.20 -o enp88s0f1.10 -j ACCEPT

 

 

docker run -itd --name linux7.6   10.110.152.173:80/base_env/centos:7.6  /bin/bash 
docker build -f linux.centos.dockerfile -t 10.110.152.173:80/base_env/centos:7.6 .

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值