Docker底層技術Namespace & Cgroup應用

Docker底層技術:

docker底層的2個核心技術分別是Namespaces和Control groups
Namespace:是容器虛擬化的核心技術,用來隔離各個容器,可解決容器之間的衝突。linux

主要經過如下六項隔離技術來實現:
有兩個僞文件系統:/proc和/sys/
Docker底層技術Namespace & Cgroup應用docker

  • UTS:容許每一個container擁有獨立的hostname(主機名)和domainname(域名),使其在網絡上能夠被視做一個獨立的節點而非Host上的一個進程。
  • IPC:contaner中進程交互仍是採用linux常見的進程間交互方法,包括常見的信號量,消息隊列和共享內存。container的進程間交互實際上仍是host上具備相同pid中的進程交互。
  • PID:不一樣用戶的進程就是經過pid namesapce隔離開的,且不一樣namespace中能夠有相同pid。全部的LXC(linux containers)進程在docker中的父進程爲docker進程,每一個LXC進程具備不一樣的namespace。
  • NET:不一樣用戶的進程就是經過pidnamespace隔離開的,且不一樣namespace中能夠有相同pid。全部的LXC進程在docker中的父進程爲docker進程,每一個lxc進程具備不一樣的namespace。
  • MNT:文件系統的掛載點。
  • USRE:每一個container能夠有不一樣的user和groupid,也就是說能夠在container內部用container內部的用戶執行程序而非Host上的用戶。
只要解耦了這6項,其餘系統資源即使有共用的狀況,計算機也認爲是在兩個不一樣的系統中。

cgroup(控制程序對資源的佔用)
實現cgroup是的主要目的是爲不一樣用戶層面的資源管理,提供一個統一化的接口。從單個進程的資源控制到操做系統層面的虛擬化。centos

cgroup的做用:
1) 資源的限制:cgroup能夠對進程組使用的資源總額進行限制。
2) 優先級分配:經過分配的cpu時間片數量及磁盤IO帶寬大小,實際上就是至關於控制了進程運行的優先級
3) 資源統計:Cgroup能夠統計系統資源使用量。好比cpu使用時間,內存使用量等。
可用於按量計費。
4) 進程控制:能夠對進程組執行掛起,恢復等操做。markdown

cgroup的應用:

1)內存和交換分區的限制:
容器內包括兩個部分:物理內存和swap網絡

在docker中能夠經過參數控制容器內存的使用:
 -m或--memory:設置內存的使用限額
--memory-swap:設置swap(交換分區)的使用限額

//基於centos鏡像,限制內存爲200M,交換分區的內存爲300M
[root@sqm-docker01 ~]# docker run -it -m 200M --memory-swap 300M centosdom

進入容器查看限制的內存:ide

[root@05a0be7b870a /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes 
209715200     #顯示的是字節

[root@05a0be7b870a /]# cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes 
314572800

2)容器對cpu限制:
經過-c或者--cpu-shares設置容器實驗cpu的權重。若是不設置默認是1024.測試

//基於centos鏡像,運行一個容器,名字爲containerB,cpu權重限制爲512:
[root@sqm-docker01 ~]# docker run -it --name containerB -c 512 centos
[root@b2cf9f28ce1d /]# cat /sys/fs/cgroup/cpu/cpu.shares 
512

3)限制容器的Block io(磁盤的讀寫):spa

bps:每秒讀寫的數據量。byte per second
iops:每秒io的次數。 io per second操作系統

--device-read-bps:設置讀取設備的bps
--device-write-bps:設置寫入設備的bps

--device-read-iops:設置讀取設備的iops
--device-write-iops:設置寫入設備的iops

//建立一個容器名爲testA,並限制該磁盤每秒寫入的數量爲爲30MB。
[root@sqm-docker01 ~]# docker run -it --name testA --device-write-bps /dev/sda:30MB centos

寫入數據進行測試:
Docker底層技術Namespace & Cgroup應用

參數解釋:
infile=從/dev/zero中提取
outfile=自定義一個名稱
bs=1M 文件大小爲1M
count=800 總共寫800次。
oflag=direct:用來指定directory IO方式寫文件,這樣纔會使--device-write-bps生效。

能夠發現每秒寫入的數量爲80M,大概用時26s。

正常寫入磁盤時:
Docker底層技術Namespace & Cgroup應用

———————— 本文至此結束,感謝閱讀 ————————

相關文章
相關標籤/搜索