原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!
原文連接地址:『中級篇』 Linux網絡命名空間(25)node
docker底層技術,很是重要的關於namespace,network的namespace看看究竟是怎麼回事。linux
#共享插件須要的vbox須要
vagrant plugin install vagrant-vbguest
vagrant up
複製代碼
shell命令的方式,循環一小時執行一次ios
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"
複製代碼
啓動了2個容器,test1,test2,進入這2個容器查看各自的ip地址git
sudo docker exec -it test1 /bin/sh
ip a
#test1的網絡ip是172.17.0.2
複製代碼
其實這塊就是一個網絡命名空間github
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的網絡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發現一個狀況,能夠ping通
ping 172.17.0.2
複製代碼
exit
ip a
複製代碼
sudo ip netns list
複製代碼
sudo ip netns delete 名稱
複製代碼
sudo ip netns add 名稱
複製代碼
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裏面執行ip a 這個操做,lo這個回管口沒有ip地址,並且如今的狀態是DOWNdocker
#
sudo ip netns exec test1 ip link set dev lo up
sudo ip netns exec test1 ip a
複製代碼
想讓test1的lo,狀態變成UP,結果發現UNKNOWN,由於端口是須要成雙才能夠UP起來的,也就是說須要一對才能夠up起來。shell
讓test1 和test2 連接起來,相似網絡,如今自己test1 和test2 已經有本身的網口了,可是還須要一根網線,領一個口插進去,成對出現完成test1和test2的互通。bash
Veth將2個口連接起來,建立一對接口,讓如namespace裏面,配置ip地址網絡
建立 veth-test1 和 veth-test2ssh
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地址可是不顯示,這是爲何?由於須要把這2個端口都啓動起來
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:經過linux作的個實驗跟經過docker建立的容器的是相似的,只是用linux的方式模擬了docker容器的方式。其實docker容器的原理就是圍繞這linux底層的網絡命名空間的原理實現的。