操作系統看Docker

從操作系統看Docker,Docker 是操作系統能力的抽象重組,或者, 可以看成進程組粒度的可複用內核裁剪,其中以linux內核中的Cgroup來管理進程組,以命名空間來實現資源隔離,以AUFS或者OverlayFS實現文件系統的掛載,從而,形成了一個通過網絡分發的容器環境。

Linux 操作系統的內核裁剪不僅是爲了提升系統的安全性,而且是爲了進一步提升應用系統的性能。Linux 的內核裁剪技術並沒有得到廣泛的應用,對於安全性、應用的性能以及開發效率而言,業界普遍採用的是虛擬化技術——虛擬機和容器。無論哪一種虛擬化技術,本質上都可以看作是操作系統能力的抽象、分拆和組合。

虛擬化技術一瞥

無論是哪一種虛擬化技術,都是在操作系統之上的不同抽象,從而形成了分層的架構。層次越多,調用鏈也相應地變長,運行時的開銷也就越大。

如上圖所示,虛擬機中的Hypervisor 這一層是一個常用的硬件虛擬化軟件,把操作系統抽象爲多個底層的硬件接口,利用這些硬件接口,虛擬機可以實現自己操作系統。Docker則不同, 它構建在原有的操作系統之上,是某種程度的複用。

從部署時間來看,物理機由於涉及到採購和軟硬件安裝等因素,部署的時間最長,虛擬機則要短很多,Dcoker則是秒級的。

2013年,Docker 對外開源,2014年6月9日正式發佈,很快便風靡全球,容器虛擬化技術的發展脈絡大致是這樣的——

Docker 的 OS 依賴

Docker 構建於操作系統之上,是強依賴於操作系統的虛擬化技術,依賴於Cgroup來管理進程組,依賴於命名空間來實現資源隔離,通過特定的文件系統來使用操作系統自身的文件系統。

Cgroup

Cgroup全稱爲Linux Control Group,是 Linux 內核的一個功能,用來限制、控制與分離一個進程組的資源(如CPU、內存、磁盤輸入輸出等)。

Cgroup是由Google的工程師在2006年發起的,最早的名稱爲進程容器(process containers)。在2007年,由於在Linux內核中,容器這個名詞有許多不同的意義,進而被重命名爲cgroup,並且被合併到2.6.24的內核版本中,後來又添加了很多功能。

Cgroup的主要功能:

限制進程組可以使用的資源數量,例如,可以爲進程組設定一個內存使用的上限,一旦進程組使用的內存達到限額再申請內存,就會觸發OOM。

進程組的優先級控制,例如,可以使用爲某個進程組分配特定的cpu share。

記錄進程組使用的資源數量,例如,可以記錄某個進程組使用的cpu時間

進程組隔離,例如,可以使不同的進程組使用不同的命名空間,以達到隔離的目的,不同的進程組有各自的進程、網絡、文件系統掛載空間。

進程組控制,例如,將進程組掛起和恢復。

[/erji]命名空間[/erji]Namespace(命名空間) 是 Linux 提供的一種內核級別資源隔離的方法。又稱爲命名空間,它主要做訪問隔離,即同一個命名空間的多個資源(memory, CPU, network, pid)可以相互看到,但是之外的看不到。

目前Linux Namespace 大致有7種,如下表所示:

這樣, 通過對內核的系統調用,即可實現相應的資源隔離。

多層單一化文件系統

早期的Docker使用AUFS文件系統,是Docker image的基石,可以將分佈在不同地方的目錄掛載到同一個虛擬文件系統中,只有第一層(第一個文件夾層級)是可寫的,其餘層是隻讀的,增加/刪除文件時都會轉換爲寫操作寫入可寫層。AUFS 的 Cow 特性能夠允許在多個容器之間共享分層,從而減少物理空間佔用。

AUFS本質上仍是堆棧式的聯合文件系統。在 Linux啓動時,首先加載 bootfs目錄,這個目錄裡面包括 Bootloader和kernel,Bootloader用來加載啓動 kernel。當kernel成功加載到內存中後, bootfs就會釋放掉, kernel隨之開始加載rootfs。rootfs包含的是Linux系統中標準的 /dev、/proc、/bin、/etc等文件, 是後續kernel啓動的基礎,因此此時 kernel將 Rootfs加鎖,設爲 readonly。在只讀權限下, kernel進行一系列的檢查操作。當kernel確認 rootfs包含的文件正確無誤後,將 readonly改爲readwrite(可讀可寫),以後用戶就可以按照正確的權限對這些目錄進行操作了。

當 Docker虛擬化出來一個容器之後,就相當於有了內存、CPU、硬盤,但沒有操作系統。參考 Linux的啓動過程,通過 AUFS,將readonly權限的 rootfs添加到 bootfs之上,當rootfs檢查完畢之後,再將用戶所要使用的文件內容掛載到 rootfs之上,同樣是readonly權限。每次掛載一個 FS文件層,每層之間只會掛載增量。這些文件層就是堆棧式文件系統中所保存的數據,AUFS就是用來管理、使用這些文件層的文件系統。

目前,一些Docker開始嘗試使用OverlayFS,對比於AUFS,OverlayFS速度更快,實現更簡單。OverlayFS也是一種多層單一化的文件系統,它依賴並建立在其它的文件系統之上(例如ext4fs和xfs等等),並不直接參與磁盤空間結構的劃分,僅僅將原來底層文件系統中不同的目錄進行“合併”,然後向用戶呈現,這也就是聯合掛載技術。Linux 內核爲Docker提供的OverlayFS驅動有兩種:overlay和overlay2。而overlay2是相對於overlay的一種改進,在inode利用率方面比overlay更有效。

Docker 的架構模型

目前來說,除了 Linux 系統可以直接運行 Docker之外,其他系統都是基於虛擬機運行的。

其中,Client是與 Docker 通信的一個組件,也就是客戶端。Docker daemon相當於守護進程,也就是 docker 的 Server。Image是鏡像,運行起來的鏡像就是一個容器。Registry是具體存放鏡像的倉庫,鏡像倉庫分爲公有倉庫(如DockerHub、DockerPool)和私有倉庫。有了鏡像倉庫,用戶可以用它來提供上傳/下載 鏡像的能力,大多數倉庫都提供了檢索和版本整理能力。

Docker 能夠保持容器內部所有的配置和依賴關係始終不變,可以在任何擁有 Docker runtime 的環境快速部署而沒有遷移成本,實現了環境的標準化和版本化管理,具有較高的隔離性和安全性。

一句話小結

從操作系統看Docker,Docker 是操作系統能力的抽象重組,或者, 可以看成進程組粒度的可複用內核裁剪,其中以linux 內核中的Cgroup來管理進程組,以命名空間來實現資源隔離,以AUFS或者OverlayFS實現文件系統的掛載,從而,形成了一個通過網絡分發的容器環境。

原文來自:https://os.51cto.com/article/715272.html

本文地址:https://www.linuxprobe.com/operating-system-to-see-docker.html編輯:馮瑞濤,審覈員:逄增寶

Linux命令大全:https://www.linuxcool.com/

Linux系統大全:https://www.linuxdown.com/

紅帽認證RHCE考試心得:https://www.rhce.net/