docker底層技術(shù),非常重要的關(guān)于namespace,network的namespace看看到底是怎么回事。
源碼下載#共享插件需要的vbox需要
vagrant plugin install vagrant-vbguest
vagrant up
shell命令的方式,循環(huán)一小時(shí)執(zhí)行一次
vagrant ssh docker-node1
sudo service docker restart
sudo 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"
啟動(dòng)了2個(gè)容器,test1,test2,進(jìn)入這2個(gè)容器查看各自的ip地址
sudo docker exec -it test1 /bin/sh
ip a
#test1的網(wǎng)絡(luò)ip是172.17.0.2
其實(shí)這塊就是一個(gè)網(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 forever
5: 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/sh
ip 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 forever
7: 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)一個(gè)情況,可以ping通
ping 172.17.0.2
exit
ip a
了解命令sudo ip netns list
sudo ip netns delete 名稱
sudo ip netns add 名稱
創(chuàng)建linux的networknamespace。sudo ip netns list
sudo ip netns add test3
sudo ip netns list
sudo ip netns delete test3
sudo ip netns list
sudo ip netns add test1
sudo ip netns add test2
sudo ip netns list
sudo ip netns exec test1 ip a
在test1里面執(zhí)行ip a 這個(gè)操作,lo這個(gè)回管口沒(méi)有ip地址,而且現(xiàn)在的狀態(tài)是DOWN
#
sudo ip netns exec test1 ip link set dev lo up
sudo ip netns exec test1 ip a
想讓test1的lo,狀態(tài)變成UP,結(jié)果發(fā)現(xiàn)UNKNOWN,因?yàn)槎丝谑切枰呻p才可以UP起來(lái)的,也就是說(shuō)需要一對(duì)才可以u(píng)p起來(lái)。
#####做個(gè)實(shí)驗(yàn),按照下面這個(gè)圖 讓test1 和test2 鏈接起來(lái),類似網(wǎng)絡(luò),現(xiàn)在本身test1 和test2 已經(jīng)有自己的網(wǎng)口了,但是還需要一根網(wǎng)線,領(lǐng)一個(gè)口插進(jìn)去,成對(duì)出現(xiàn)完成test1和test2的互通。
Veth將2個(gè)口鏈接起來(lái),創(chuàng)建一對(duì)接口,讓如namespace里面,配置ip地址
創(chuàng)建veth 說(shuō)白了就是創(chuàng)建一根網(wǎng)線,有2個(gè)頭但是在一根線上 veth-test1 和veth-test2創(chuàng)建 veth-test1 和 veth-test2
sudo ip link add veth-test1 type veth peer name veth-test2
sudo ip link
將 veth-test1 添加到test1中,veth-test2 添加到test2中
sudo ip link set veth-test1 netns test1
sudo ip netns exec test1 ip link
sudo ip link set veth-test2 netns test2
sudo ip netns exec test2 ip link
sudo ip link
添加ip地址
sudo ip netns exec test1 ip addr add 192.168.1.1/24 dev veth-test1
sudo ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2
sudo ip netns exec test1 ip link
sudo ip netns exec test2 ip link
#雖然添加了ip地址但是不顯示,這是為什么?因?yàn)樾枰堰@2個(gè)端口都啟動(dòng)起來(lái)
sudo ip netns exec test1 ip link set dev veth-test1 up
sudo ip netns exec test2 ip link set dev veth-test2up
sudo ip netns exec test1 ip link
sudo ip netns exec test2 ip link
sudo ip netns exec test1 ip a
sudo ip netns exec test2 ip a
是否互通
sudo ip netns exec test1 ping 192.168.1.2
sudo ip netns exec test2 ping 192.168.1.1
PS:通過(guò)linux做的個(gè)實(shí)驗(yàn)跟通過(guò)docker創(chuàng)建的容器的是類似的,只是用linux的方式模擬了docker容器的方式。其實(shí)docker容器的原理就是圍繞這linux底層的網(wǎng)絡(luò)命名空間的原理實(shí)現(xiàn)的。
|