真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Docker技術(shù)三大要點:cgroup,namespace和unionFS的理解

www.docker.com 的網(wǎng)頁有這樣一張有意思的動畫:

在辰溪等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、做網(wǎng)站 網(wǎng)站設(shè)計制作按需求定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站制作,辰溪網(wǎng)站建設(shè)費用合理。

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

從這張gif圖片,我們不難看出Docker網(wǎng)站想傳達這樣一條信息, 使用Docker加速了build,ship和run的過程。

Docker最早問世是2013年,以一個開源項目的方式被大家熟知。

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

Docker的奠基者是dotcloud,一家開發(fā)PaaS平臺的技術(shù)公司。

不過可惜的是,這家公司把Docker開源之后,于2016年倒閉了,因為其主業(yè)務(wù)PaaS無法和微軟,亞馬遜等PaaS業(yè)界巨頭競爭,不禁讓人唏噓。

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

Docker其實是容器化技術(shù)的具體技術(shù)實現(xiàn)之一,采用go語言開發(fā)。很多朋友剛接觸Docker時,認為它就是一種更輕量級的虛擬機,這種認識其實是錯誤的,Docker和虛擬機有本質(zhì)的區(qū)別。容器本質(zhì)上講就是運行在操作系統(tǒng)上的一個進程,只不過加入了對資源的隔離和限制。而Docker是基于容器的這個設(shè)計思想,基于Linux Container技術(shù)實現(xiàn)的核心管理引擎。

為什么資源的隔離和限制在云時代更加重要?在默認情況下,一個操作系統(tǒng)里所有運行的進程共享CPU和內(nèi)存資源,如果程序設(shè)計不當,最極端的情況,某進程出現(xiàn)死循環(huán)可能會耗盡CPU資源,或者由于內(nèi)存泄漏消耗掉大部分系統(tǒng)資源,這在企業(yè)級產(chǎn)品場景下是不可接受的,所以進程的資源隔離技術(shù)是非常必要的。

我當初剛接觸Docker時,以為這是一項新的技術(shù)發(fā)明,后來才知道,Linux操作系統(tǒng)本身從操作系統(tǒng)層面就支持虛擬化技術(shù),叫做Linux container,也就是大家到處能看到的LXC的全稱。

LXC的三大特色:cgroup,namespace和unionFS。

cgroup:

CGroups 全稱control group,用來限定一個進程的資源使用,由Linux 內(nèi)核支持,可以限制和隔離Linux進程組 (process groups) 所使用的物理資源 ,比如cpu,內(nèi)存,磁盤和網(wǎng)絡(luò)IO,是Linux container技術(shù)的物理基礎(chǔ)。

namespace:

另一個維度的資源隔離技術(shù),大家可以把這個概念和我們熟悉的C++和Java里的namespace相對照。

如果CGroup設(shè)計出來的目的是為了隔離上面描述的物理資源,那么namespace則用來隔離PID(進程ID),IPC,Network等系統(tǒng)資源。

我們現(xiàn)在可以將它們分配給特定的Namespace,每個Namespace里面的資源對其他Namespace都是透明的。

不同container內(nèi)的進程屬于不同的Namespace,彼此透明,互不干擾。

我們用一個例子來理解namespace的必要。

假設(shè)多個用戶購買了一臺Linux服務(wù)器的Nginx服務(wù),每個用戶在該服務(wù)器上被分配了一個Linux系統(tǒng)的賬號。我們希望每個用戶只能訪問分配給其的文件夾,這當然可以通過Linux文件系統(tǒng)本身的權(quán)限控制來實現(xiàn),即一個用戶只能訪問屬于他本身的那些文件夾。

但是有些操作仍然需要系統(tǒng)級別的權(quán)限,比如root,但我們肯定不可能給每個用戶都分配root權(quán)限。因此我們就可以使用namespace技術(shù):

我們能夠為UID = n的用戶,虛擬化一個namespace出來,在這個namespace里面,該用戶具備root權(quán)限,但是在宿主機上,該UID =n的用戶還是一個普通用戶,也感知不到自己其實不是一個真的root用戶這件事。

同樣的方式可以通過namespace虛擬化進程樹。

在每一個namespace內(nèi)部,每一個用戶都擁有一個屬于自己的init進程,pid = 1,對于該用戶來說,仿佛他獨占一臺物理的Linux服務(wù)器。

對于每一個命名空間,從用戶看起來,應(yīng)該像一臺單獨的Linux計算機一樣,有自己的init進程(PID為1),其他進程的PID依次遞增,A和B空間都有PID為1的init進程,子容器的進程映射到父容器的進程上,父容器可以知道每一個子容器的運行狀態(tài),而子容器與子容器之間是隔離的。從圖中我們可以看到,進程3在父命名空間里面PID 為3,但是在子命名空間內(nèi),他就是1.也就是說用戶從子命名空間 A 內(nèi)看進程3就像 init 進程一樣,以為這個進程是自己的初始化進程,但是從整個 host 來看,他其實只是3號進程虛擬化出來的一個空間而已。

看下面的圖加深理解。

父容器有兩個子容器,父容器的命名空間里有兩個進程,id分別為3和4, 映射到兩個子命名空間后,分別成為其init進程,這樣命名空間A和B的用戶都認為自己獨占整臺服務(wù)器。

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

Linux操作系統(tǒng)到目前為止支持的六種namespace:

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

unionFS:

顧名思義,unionFS可以把文件系統(tǒng)上多個目錄(也叫分支)內(nèi)容聯(lián)合掛載到同一個目錄下,而目錄的物理位置是分開的。

要理解unionFS,我們首先要認識bootfs和rootfs。

1. boot file system (bootfs):包含操作系統(tǒng)boot loader 和 kernel。用戶不會修改這個文件系統(tǒng)。

一旦啟動完成后,整個Linux內(nèi)核加載進內(nèi)存,之后bootfs會被卸載掉,從而釋放出內(nèi)存。

同樣內(nèi)核版本的不同的 Linux 發(fā)行版,其bootfs都是一致的。

2. root file system (rootfs):包含典型的目錄結(jié)構(gòu),包括 /dev, /proc, /bin, /etc, /lib, /usr, and /tmp

就是我下面這張圖里的這些文件夾:

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

等再加上要運行用戶應(yīng)用所需要的所有配置文件,二進制文件和庫文件。這個文件系統(tǒng)在不同的Linux 發(fā)行版中是不同的。而且用戶可以對這個文件進行修改。

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

Linux 系統(tǒng)在啟動時,roofs 首先會被掛載為只讀模式,然后在啟動完成后被修改為讀寫模式,隨后它們就可以被修改了。

不同的Linux版本,實現(xiàn)unionFS的技術(shù)可能不一樣,使用命令docker info查看,比如我的機器上實現(xiàn)技術(shù)是overlay2:

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

看個實際的例子。

新建兩個文件夾abap和java,在里面用touch命名分別創(chuàng)建兩個空文件:

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

新建一個mnt文件夾,用mount命令把abap和java文件夾merge到mnt文件夾下,-t執(zhí)行文件系統(tǒng)類型為aufs:

sudo mount -t aufs -o dirs=./abap:./java none ./mnt

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

mount完成后,到mnt文件夾下查看,發(fā)現(xiàn)了來自abap和java文件夾里總共4個文件:

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

現(xiàn)在我到j(luò)ava文件夾里修改spring,比如加上一行spring is awesome, 然后到mnt文件夾下查看,發(fā)現(xiàn)mnt下面的文件內(nèi)容也自動被更新了。

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

那么反過來會如何呢?比如我修改mnt文件夾下的aop文件:

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

而java文件夾下的原始文件沒有受到影響:

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

實際上這就是Docker容器鏡像分層實現(xiàn)的技術(shù)基礎(chǔ)。如果我們?yōu)g覽Docker hub,能發(fā)現(xiàn)大多數(shù)鏡像都不是從頭開始制作,而是從一些base鏡像基礎(chǔ)上創(chuàng)建,比如debian基礎(chǔ)鏡像。

而新鏡像就是從基礎(chǔ)鏡像上一層層疊加新的邏輯構(gòu)成的。這種分層設(shè)計,一個優(yōu)點就是資源共享。

想象這樣一個場景,一臺宿主機上運行了100個基于debian base鏡像的容器,難道每個容器里都有一份重復(fù)的debian拷貝呢?這顯然不合理;借助Linux的unionFS,宿主機只需要在磁盤上保存一份base鏡像,內(nèi)存中也只需要加載一份,就能被所有基于這個鏡像的容器共享。

當某個容器修改了基礎(chǔ)鏡像的內(nèi)容,比如 /bin文件夾下的文件,這時其他容器的/bin文件夾是否會發(fā)生變化呢?

根據(jù)容器鏡像的寫時拷貝技術(shù),某個容器對基礎(chǔ)鏡像的修改會被限制在單個容器內(nèi)。

這就是我們接下來要學(xué)習的容器 Copy-on-Write 特性。

容器鏡像由多個鏡像層組成,所有鏡像層會聯(lián)合在一起組成一個統(tǒng)一的文件系統(tǒng)。如果不同層中有一個相同路徑的文件,比如 /text,上層的 /text 會覆蓋下層的 /text,也就是說用戶只能訪問到上層中的文件 /text。

假設(shè)我有如下這個dockerfile:

FROM debian

RUN apt-get install emacs

RUN apt-get install apache2

CMD ["/bin/bash"]

執(zhí)行docker build .看看發(fā)生了什么。

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

生成的容器鏡像如下:

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

當用docker run啟動這個容器時,實際上在鏡像的頂部添加了一個新的可寫層。這個可寫層也叫容器層。

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解

容器啟動后,其內(nèi)的應(yīng)用所有對容器的改動,文件的增刪改操作都只會發(fā)生在容器層中,對容器層下面的所有只讀鏡像層沒有影響。

要獲取更多Jerry的原創(chuàng)文章,請關(guān)注公眾號"汪子熙":

Docker技術(shù)三大要點:cgroup, namespace和unionFS的理解


當前名稱:Docker技術(shù)三大要點:cgroup,namespace和unionFS的理解
URL鏈接:http://weahome.cn/article/pocpdd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部