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 .

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章