这两天一直在研究docker的网络模型,主要是研究docker之间互相连通啦。
除了docker自带的brage模式以外,跨主机方案主要是macvlan,本篇文章就是对macvlan方式做一个实验记录;
特别提醒,有两个博客https://blog.csdn.net/ymeng9527/article/details/98529320和https://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 .