『中級篇』 Linux網絡命名空間(25)

原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!
原文連接地址:『中級篇』 Linux網絡命名空間(25)node

docker底層技術,很是重要的關於namespace,network的namespace看看究竟是怎麼回事。linux

源碼下載

  • 經過vagrant 啓動2個node
#共享插件須要的vbox須要
vagrant plugin install vagrant-vbguest
vagrant up
複製代碼


  • 建立容器,演示network-namespace

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
複製代碼

瞭解命令
  • 查看networknamespace列表
sudo ip netns list
複製代碼
  • 刪除networknamespace
sudo ip netns delete 名稱
複製代碼
  • 添加networknamespace
sudo ip netns add 名稱
複製代碼
建立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裏面執行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 說白了就是建立一根網線,有2個頭可是在一根線上 veth-test1 和veth-test2

建立 veth-test1 和 veth-test2ssh

sudo ip link add veth-test1 type veth peer name veth-test2
sudo ip link 
複製代碼
image.png
image.png

將 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
複製代碼



image.png

是否互通

sudo ip netns exec test1 ping 192.168.1.2
sudo ip netns exec test2 ping 192.168.1.1
複製代碼
image.png

PS:經過linux作的個實驗跟經過docker建立的容器的是相似的,只是用linux的方式模擬了docker容器的方式。其實docker容器的原理就是圍繞這linux底層的網絡命名空間的原理實現的。

相關文章
相關標籤/搜索