Docker進階與實踐之二:Namespace

百聯達發表於2019-05-11

一:簡介

容器的核心技術是Cgroup+Namespace. Linux容器的最小組成可以由以下公式來表示: 容器=cgroup+namespace+rootfs+容器引擎。 Cgroup:資源控制,Namespace:訪問隔離,rootfs:檔案系統隔離,容器引擎:生命週期控制。


二:Namespace思維導圖

Docker進階與實踐之二:Namespace Namespace.jpg


三:總結

Namespace和Cgroup的使用是很靈活的,同時又有不少需要注意的地方,因此直接操作Namespace和Cgroup並不是很容易。正是因為這些原因,Docker透過Libcontainer來處理這些底層的事情。這樣一來,Docker只需要簡單地呼叫Libcontainer的API,就能將完整的容器搭建起來。


四:容器的建立原理

1.透過clone系統呼叫,並傳入各個namespace對應的clone flag,建立了一個新的子程式,該程式擁有自己的Namespace.

pid = clone(fun,task,flags,clone_arg);
(flags:CLONE_NEWPID|CLONE_NEWNS|
CLINE_NEWUSER|CLONE_NEWNET|
CLONE_NEWIPC|CLONE_NEWUTS:
...)

2.將第一步中產生的pid寫入各個cgroup子系統,這樣改程式就可以受到相應Cgroup子系統的控制

echo $pid>/sys/fs/cgroup/cpu/tasks
echo $pid>/sys/fs/cgroup/cpuset/tasks
echo $pid>/sys/fs/cgroup/blkio/tasks
echo $pid>/sys/fs/cgroup/memory/tasks
echo $pid>/sys/fs/cgroup/devices/tasks
echo $pid>/sys/fs/cgroup/freezer/tasks


 3.該fun函式由上面生成的新程式執行,在fun函式中透過pivot_root系統呼叫,使程式進入一個新的rootfs,之後透過exec系統呼叫,在新的namespace,cgroup,rootfs中執行"/bin/bash"程式

fun()
{
...pivot_root("path_of_rootfs/",path);
...exec("/bin/bash");
...
}


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

相關文章