docker底層技術,非常重要的關於namespace,network的namespace看看到底是怎麼回事。
#共享外掛程式需要的vbox需要
vagrant plugin install vagrant-vbguest
vagrant up
複製**
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: 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:
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: 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:
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 名稱
複製**
建立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個頭但是在一根線上 veth-test1 和veth-test2
建立 veth-test1 和 veth-test2
sudo ip link add veth-test1 type veth peer name veth-test2
sudo ip link
複製**
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
複製**
是否互通
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底層的網路命名空間的原理實現的。
Linux課堂筆記 程序2 命名空間
linux 作業系統上提供的一種作業系統級虛擬化 operating system level virtualization 技術 允許在同一 linux 核心的基礎上對不同程序族的環 境進行劃分和隔離。容器技術使用 linux 核心提供的namespace 機制隔離應用環境,同時使用 cgroup...
php命名空間2
注意訪問任意全域性類 函式或常量,都可以使用完全限定名稱,例如 strlen 或 exception或 ini all。解析策略 首先要明確類的呼叫或函式的呼叫是直接使用類名還是通過可變函式 即通過變數名 一 對於直接呼叫的解析策略 1 類名稱總是解析到當前命名空間中的名稱。因此在訪問系統內部或不包...
簡單理解Linux中網路命名空間namespace
1.namespace的作用 傳統的linux的許多資源是全域性的,比如程序id資源。而namespace的目的就是將這些資源做資源隔離。2.通過 看具體對哪些資源進行了隔離 struct nsproxy 含義如下 每個 namespace 裡面將原本是全域性資源的進行了隔離,彼此互相不可見 同時在...