docker底層技術(shù),非常重要的關(guān)于namespace,network的namespace看看到底是怎么回事。
https://github.com/limingios/docker.git 里面的No.2
通過vagrant 啟動2個node
#共享插件需要的vbox需要vagrant plugin install vagrant-vbguestvagrant up
創(chuàng)建容器,演示network-namespace
shell命令的方式,循環(huán)一小時執(zhí)行一次
vagrant ssh docker-node1sudo service docker restartsudo docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600;done"
sudo docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600;done"
啟動了2個容器,test1,test2,進入這2個容器查看各自的ip地址
sudo docker exec -it test1 /bin/ship a#test1的網(wǎng)絡(luò)ip是172.17.0.2
其實這塊就是一個網(wǎng)絡(luò)命名空間
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever
sudo docker exec -it test2 /bin/ship a#test1的網(wǎng)絡(luò)ip是172.17.0.3
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever
#在test2上ping下test1的namespace發(fā)現(xiàn)一個情況,可以ping通ping 172.17.0.2
發(fā)現(xiàn)空間之前是獨立的,容器內(nèi)的網(wǎng)絡(luò)命名空間和容器外不同,容器和容器之前的網(wǎng)絡(luò)命名空間也是相對獨立的。
exitip a
查看networknamespace列表
sudo ip netns list
刪除networknamespace
sudo ip netns delete 名稱
添加networknamespace
sudo ip netns add 名稱
sudo ip netns listsudo ip netns add test3sudo ip netns listsudo ip netns delete test3sudo ip netns listsudo ip netns add test1sudo ip netns add test2sudo ip netns list
sudo ip netns exec test1 ip a
在test1里面執(zhí)行ip a 這個操作,lo這個回管口沒有ip地址,而且現(xiàn)在的狀態(tài)是DOWN
#sudo ip netns exec test1 ip link set dev lo upsudo ip netns exec test1 ip a
想讓test1的lo,狀態(tài)變成UP,結(jié)果發(fā)現(xiàn)UNKNOWN,因為端口是需要成雙才可以UP起來的,也就是說需要一對才可以up起來。
#####做個實驗,按照下面這個圖
讓test1 和test2 鏈接起來,類似網(wǎng)絡(luò),現(xiàn)在本身test1 和test2 已經(jīng)有自己的網(wǎng)口了,但是還需要一根網(wǎng)線,領(lǐng)一個口插進去,成對出現(xiàn)完成test1和test2的互通。
Veth將2個口鏈接起來,創(chuàng)建一對接口,讓如namespace里面,配置ip地址
創(chuàng)建 veth-test1 和 veth-test2
sudo ip link add veth-test1 type veth peer name veth-test2sudo ip link
將 veth-test1 添加到test1中,veth-test2 添加到test2中
sudo ip link set veth-test1 netns test1sudo ip netns exec test1 ip linksudo ip link set veth-test2 netns test2sudo ip netns exec test2 ip linksudo ip link
添加ip地址
sudo ip netns exec test1 ip addr add 192.168.1.1/24 dev veth-test1sudo ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2sudo ip netns exec test1 ip linksudo ip netns exec test2 ip link#雖然添加了ip地址但是不顯示,這是為什么?因為需要把這2個端口都啟動起來sudo ip netns exec test1 ip link set dev veth-test1 upsudo ip netns exec test2 ip link set dev veth-test2upsudo ip netns exec test1 ip linksudo ip netns exec test2 ip linksudo ip netns exec test1 ip asudo ip netns exec test2 ip a
是否互通
sudo ip netns exec test1 ping 192.168.1.2sudo ip netns exec test2 ping 192.168.1.1
PS:通過linux做的個實驗跟通過docker創(chuàng)建的容器的是類似的,只是用linux的方式模擬了docker容器的方式。其實docker容器的原理就是圍繞這linux底層的網(wǎng)絡(luò)命名空間的原理實現(xiàn)的。
聯(lián)系客服