1. 程式人生 > >『中級篇』 Linux網絡命名空間(25)

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

star while 命名空間 tps 成對 mes tle pre 操作

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

docker底層技術,非常重要的關於namespace,network的namespace看看到底是怎麽回事。

源碼下載
  • https://github.com/limingios/docker.git 裏面的No.2

技術分享圖片

  • 通過vagrant 啟動2個node
#共享插件需要的vbox需要
vagrant plugin install vagrant-vbguest
vagrant up

技術分享圖片

技術分享圖片

  • 創建容器,演示network-namespace

shell命令的方式,循環一小時執行一次

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地址

sudo docker exec -it test1 /bin/sh
ip a
#test1的網絡ip是172.17.0.2 

技術分享圖片

其實這塊就是一個網絡命名空間

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地址,而且現在的狀態是DOWN

技術分享圖片

#
sudo ip netns exec test1 ip link set dev lo up
sudo ip netns exec test1 ip a

想讓test1的lo,狀態變成UP,結果發現UNKNOWN,因為端口是需要成雙才可以UP起來的,也就是說需要一對才可以up起來。

技術分享圖片

#####做個實驗,按照下面這個圖

讓test1 和test2 鏈接起來,類似網絡,現在本身test1 和test2 已經有自己的網口了,但是還需要一根網線,領一個口插進去,成對出現完成test1和test2的互通。

技術分享圖片

Veth將2個口鏈接起來,創建一對接口,讓如namespace裏面,配置ip地址

技術分享圖片

創建veth 說白了就是創建一根網線,有2個頭但是在一根線上 veth-test1 和veth-test2

創建 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地址但是不顯示,這是為什麽?因為需要把這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底層的網絡命名空間的原理實現的。


往期精彩
  1. docker導學(一)
  2. 容器的技術概述(二)
  3. docker的魅力初體驗-5分鐘安裝wordpress不走彎路(三)
  4. docker官網介紹(四)
  5. 如何在mac上安裝docker(五)
  6. 如何在window上安裝docker(六)
  7. 如何在mac上通過vagrant安裝虛擬機(七)
  8. 如何在window上通過vagrant安裝虛擬機(八)
  9. docker-Machine的本地使用(九)
  10. docker-Machine的本地使用(十)
  11. 在linux/mac下通過Docker-Machine在阿裏雲上的使用(11)
  12. docker架構和底層技術(12)
  13. docker Image概述(13)
  14. 手動建立一個base Image(14)
  15. 什麽是Container(15)
  16. 構建自己的Docker鏡像(16)
  17. Dockerfile詳解(17)
  18. 鏡像的發布(18)
  19. Dockerfile實戰(19)
  20. 容器的操作(20)
  21. Dockerfile實戰CMD和ENTRTYPOINT的配合(21)
  22. 容器的資源限制(22)
  23. docker網絡(23)
  24. docker學習必會網絡基礎(24)

技術分享圖片

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