容器Cgroup和Namespace特性簡介

2021-07-31 02:14:04 字數 1583 閱讀 2228

一般來說,容器技術主要包括cgroup和namespace這兩個核心特性。

cgroup

cgroup是control group,又稱為控制組,它主要是做資源控制。原理是將一組程序放在放在乙個控制組裡,通過給這個控制組分配指定的可用資源,達到控制這一組程序可用資源的目的。

namespace

namespace又稱為命名空間,它主要做訪問隔離。其原理是針對一類資源進行抽象,並將其封裝在一起提供給乙個容器使用,對於這類資源,因為每個容器都有自己的抽象,而他們彼此之間是不可見的,所以就可以做到訪問隔離。

對於linux容器的最小組成,除了上面兩個抽象的技術概念還不夠,完整的容器可以用以下公示描述:

容器=cgroup+namespace+rootfs+容器引擎(使用者態工具)。

其中各項功能分別為:

cgroup:資源控制;

namespace:訪問隔離;

rootfs:檔案系統隔離;

容器引擎:生命週期控制;

簡單**示例

接下來用乙個簡單的**抽象來展示下容器建立原理。

**段一:

pid = clone(fun,stack,flags,clone_arg);

(flags:clone_newpid | clone_newns |

clone_newuser | clone_newnut |

clone_newipc | clone_newuts |

...)

**段二:

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

**段三:

func()

對於**段一,通過clone系統呼叫,傳入各個namespace對應的clone flag,建立了乙個新的子程序,該程序擁有自己的namespace。根據以上**可知,該程序擁有自己的pid,mount,user,net,ipc和uts namespace。

對於**段二,將**段一中產生的程序pid寫入各個cgroup子系統中,這樣該程序就受到相應cgroup子系統的控制。

對於**段三,該func函式由上面生成的新程序執行,在func()函式中,通過pivlot_root系統呼叫,使程序進入乙個新的rootfs,之後通過exec系統呼叫,在新的namespace,cgroup,rootfs中執行「bin/bash」程式。

通過以上操作,成功在乙個「微型容器」中執行了乙個bash程式。

Docker容器基礎入門認知 Cgroup

也許你會好奇,我們不是已經通過 linux namespace 給容器建立了乙個容器了嗎,為什麼還需要對容器做限制呢?因為在 linux 程序中,容器程序並不是物理隔離的,在執行時是和宿主機上的其他程序共享同乙個 cpu 和記憶體,如果不加以限制,必定會造成資源競爭。在容器中,第 1 號程序在 障眼...

可能影響容器化應用程式的cgroup記憶體管理問題

近日,linkedin工程團隊發表了一篇題為 不要讓linux控制組不受控制地執行 的文章。控制組 cgroup 是linux的一項特性,像docker和coreos這樣的專案使用該特性限制程序的資源使用。該文概括地介紹了cgroup在記憶體管理方面存在的幾個可能導致效能退化的問題以及可能的解決方案...

可能影響容器化應用程式的cgroup記憶體管理問題

近日,linkedin工程團隊發表了一篇題為 不要讓linux控制組不受控制地執行 的文章。控制組 cgroup 是linux的一項特性,像docker和coreos這樣的專案使用該特性限制程序的資源使用。該文概括地介紹了cgroup在記憶體管理方面存在的幾個可能導致效能退化的問題以及可能的解決方案...