docker 介紹 (2): docker和虛擬化技術

在這一篇文章中, 將介紹一些docker所使用的技術,
相同的, 由於docker的相關技術已經被討論許多, 也有取多trace code,
在文章中, 只大略提及個技術的重點與限制,
並列出相關文件於參考資料作為延伸的閱讀.

docker是藉由Linux Containers (LXC)技術作為基礎,
LXC包括兩個部分: Linux Namespace (chroot)以及Linux CGgroup,
chroot提供了一種簡單的隔離模式: chroot內部的檔案系統無法訪問外部的內容
Linux Namespace在此基礎上, 提供了對UTS (UNIX Time-sharing System), IPC (interprocess communication), mount (檔案系統), PID (處理程序), network, User等的隔離機制.
簡單來說, LXC藉由遮蔽PID, 提供分離的操作環境,
因此, docker的每個容器都有獨立的檔案系統, 處理程序ID, 以及多工架構,



比較複雜的是網路的部分, 網路的隔離是通過net namespace實現的,
每個net namespace有獨立的 network devices, IP addresses, IP routing tables, /proc/net 目錄,
docker使用Linux Bridge將多個容器連起來, 如下圖所示:

圖片來自 [3]

下表[8]整理了Linux Namespace隔離的功能,
藉由下表, 我們可以清楚的了解docker所實作的環境隔離,
總結一下, docker藉由Linux Namespace提供了隔離的操作環境,
使得每一個容器彷若獨立的作業系統.

Namespace
系統調用參數
隔離內容
UTS
CLONE_NEWUTS
主機名稱與功能變數名稱
IPC
CLONE_NEWIPC
信號量、訊息佇列和共用記憶體
PID
CLONE_NEWPID
進程編號
Network
CLONE_NEWNET
網路設備、網路棧、埠等等
Mount
CLONE_NEWNS
掛載點(檔案系統)
User
CLONE_NEWUSER
用戶和用戶組

除了獨立的操作環境外, 雲端另一個功能是保證所能夠使用的資源,
這一部分, docker使用Linux CGgroup來實作, Linux CGgroup 主要提供了如下功能[10]:
Resource limitation: 限制資源使用, 比如記憶體使用上限以及檔案系統的緩存限制
Prioritization: 優先順序控制, 比如: CPU利用和硬碟IO吞吐
Accounting: 一些審計或一些統計, 主要目的是為了計費
Control: 掛起(hook)進程, 恢復執行進程

Linux CGgroup的實作頗為複雜, 其中牽涉到一些架構的設計,
簡單來說, Linux CGroup就像是複雜的nice (調整優先順序)和cpulimit (限制CPU使用時間),
限制程序所使用的記憶體, 優先順序, 硬碟IO等功能,
docker使用Linux CGroup用來限制容器所使用的CPU時脈,
這也解釋了為什麼在上一篇文章中, docker無法支援多核心的容器,

介紹完了docker和LXC之間的關聯性,
我們接著介紹和docker的檔案系統 (Another Union File System, ADFS),
在docker中, 用了ADFS檔案系統來設計一個可以層層堆疊的容器(Container)映象檔,
此映象檔包含了docker的應用程式, 相關函式庫以及設定檔,
並且提供一個Dockerfile設定檔來記錄建立Container過程的每一個步驟包括參數,
因此, 只要在docker環境中, 就可以從映象檔來建立出一個一模一樣的Container,
用來執行同一個應用程式,

圖片來自[13]

AUFS相比於既有的檔案系統, 提供了階層式的檔案架構,
並允許不同的存取權限, 使得docker能夠簡易的完成容器的繼承與製作,
docker不只支援AUFS的系統, 也支援的其他Union檔案系統種類像是DeviceMapper,
來完成容器的檔案系統.

總整理:
[1] http://www.zhihu.com/question/22969309
[2] https://philipzheng.gitbooks.io/docker_practice/content/underly/index.html

Docker 網路
[3] http://skymoneyc.com/2015/04/05/docker-network.html

Linux Containers
[4] https://en.wikipedia.org/wiki/LXC
[5] http://www.ibm.com/developerworks/cn/linux/l-lxc-containers/

Linux Namespace
[6] http://coolshell.cn/articles/17010.html
[7] http://coolshell.cn/articles/17029.html
[8] http://www.infoq.com/cn/articles/docker-kernel-knowledge-namespace-resource-isolation

Linux CGroup
[9] https://en.wikipedia.org/wiki/Cgroups
[10] http://coolshell.cn/articles/17049.html
[11] http://www.infoq.com/cn/articles/docker-kernel-knowledge-cgroups-resource-isolation

ADFS
[12] http://coolshell.cn/articles/17061.html

留言

熱門文章

LTE筆記: RSRP, RSSI and RSRQ

[WiFi] WiFi 網路的識別: BSS, ESS, SSID, ESSID, BSSID

LTE筆記: 5G NR Measurement Events