Docker network namespace

百聯達發表於2017-10-24

一:Linux namespace



Linux核心實現namespace的一個主要目的,就是實現輕量級虛擬化(容器)服務。在同一個namespace下的程式可以感知彼此的變化,而對外界的程式一無所知,彷彿置身於一個獨立的系統環境中,以達到獨立和隔離的目的。

 

二:network namespace

Network namespace主要提供了關於網路資源的隔離,包括網路裝置,IPv4IPv6協議棧,IP路由表,防火牆,/proc/net目錄,/sys/class/net目錄,套接字(socket)等。一個物理的網路裝置最多存在於一個network namespace中,可以透過建立veth pair(虛擬網路裝置對:有兩端,類似管道,如果資料從一端傳入另一端也能接收到,反之依然)在不同的network namespace間建立通道,以達到通訊目的。

一般情況下,物理網路裝置都分配在最初的root namespace(系統預設的namespace)中,但是如果有多塊物流網路卡,也可以把其中一塊或多塊分配給新建立的network namespace.

當說到network namespace時,指的是把網路獨立出來,給外部使用者一種透明的感覺,彷彿在與一個獨立網路實體進行通訊。 容器的經典做法就是建立一個veth pair,一端放置在新的namespace中,通常命名為eth0;一端放在原先的namespace中連線物理網路裝置,再透過把多個裝置接入網橋或者進行路由轉發,來實現通訊的目的。

三:ip netns命令


1. 建立一個network namespace

ip netns add nstest

2. 列出系統中已存在的network namespace

Ip netns list

3. 刪除一個network namespace

Ip netns delete nstest

4. network namespace中執行一條命令:ip netns exec

如:ip netns exec nstest ip addr

5. 啟動network namespace中的迴環裝置

ip netns exec nstest ip link set dev lo up

6. 在主機上建立兩張虛擬網路卡veth-aveth-b

ip link add veth-a type veth peer name veth-b

7. veth-b裝置新增到nstest這個network namespace中,veth-a留在主機中。

ip link set veth-b netns nstest  此時nstest就有了兩塊網路卡lo和veth-b



8.  在主機上為veth-a配置IP並啟動

ip addr add 10.0.0.1/24 dev veth-a

ip link set dev veth-a up

9.  nstest中的veth-b配置IP並啟動

ip netns exec nstest ip addr add 10.0.0.2/24 dev veth-b

ip netns exec nstest ip link set dev veth-b up

10.  在主機中檢視路由: ip route


11.nstest中檢視路由資訊:ip netns exec nstest ip route

這兩條路由表明的意義是目的地址為10.0.0.0/24網路的IP分別從veth-aveth-b發出。

12.  測試連通性:現在nstest這個network namespace有了自己的網路卡,IP地址,路由表等資訊:

Ping 10.0.0.2


ip netns exec nstest ping 10.0.0.1


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2146319/,如需轉載,請註明出處,否則將追究法律責任。

相關文章