Docker的底層原理及分析
Docker底層原理
docker實(shí)際上類似于一種“進(jìn)程隔離技術(shù)”,利用Linux系統(tǒng)的一些特性功能,將不同容器隔離開來,使其不受外界的影響。
docker使用的Linux特性功能主要有:
1、命名空間(Namespace):把不同容器的進(jìn)程、網(wǎng)絡(luò)、文件系統(tǒng)隔離開來
2、控制組(Cgroups):限制容器使用CPU、內(nèi)存等資源
3、聯(lián)合文件系統(tǒng)(UnionFS):支持鏡像的分層構(gòu)建
一、命名空間
命名空間可以將全局資源分為若干塊,命名空間內(nèi)部的進(jìn)程無法看到其他命名空間的進(jìn)程,利用這一特點(diǎn),就可以做到容器的隔離。
命名空間有很多類型,docker主要使用的如下:
- 1、
PID命名空間:該命名空間的第一個(gè)進(jìn)程的PID為1,其他的進(jìn)程都掛在這個(gè)第一個(gè)進(jìn)程下面,這樣容器內(nèi)部就無法看到宿主機(jī)進(jìn)程 - 2、
NET命名空間:控制網(wǎng)絡(luò)資源,每個(gè)容器都可以有獨(dú)立的IP、路由表、端口號,然后由宿主機(jī)通過虛擬網(wǎng)卡把容器網(wǎng)絡(luò)連到外面。值得注意的是,docker本身并沒有硬件或者模擬硬件,docker與宿主機(jī)共用一個(gè)內(nèi)核(特別地,docker容器中的網(wǎng)絡(luò)協(xié)議棧是獨(dú)立的,但是最終走宿主機(jī)的內(nèi)核TCP/IP協(xié)議棧,網(wǎng)絡(luò)并非完全共用) - 3、
IPC命名空間:控制進(jìn)程間通信,如信號量等,以防與宿主機(jī)的IPC沖突 - 4、
UTS命名空間:控制主機(jī)名和域名,使每個(gè)容器都有自己的hostname - 5、
MNT命名空間:控制系統(tǒng)掛載點(diǎn),容器內(nèi)部能看到的根目錄/實(shí)際上是宿主機(jī)的某個(gè)子目錄 - 6、
USER命名空間:控制用戶和權(quán)限,容器內(nèi)的root用戶可以映射為宿主機(jī)的普通用戶
二、控制組
為了防止被隔離的容器吃光宿主機(jī)的資源,docker還利用了Linux提供的Cgroups來進(jìn)行資源控制,如CPU,內(nèi)存,磁盤I/O,網(wǎng)絡(luò)等資源。
Cgroups實(shí)際上是一顆資源管理的層級樹,每個(gè)Cgroup節(jié)點(diǎn)都能設(shè)置資源限制,進(jìn)程加入某個(gè)Cgroup,就必須遵守對應(yīng)的限制。
三、聯(lián)合文件系統(tǒng)
UnionFS(Union File System,聯(lián)合文件系統(tǒng))是一種分層的文件系統(tǒng)。
它的特點(diǎn)是:
- 1、可以把多個(gè)目錄(層)“聯(lián)合”掛載在一起,對外呈現(xiàn)成一個(gè)目錄。
- 2、上層可以覆蓋下層的文件(像透明膠片疊加)。
- 3、支持寫時(shí)復(fù)制(
Copy-On-Write,COW)。
為了保證docker拉取后鏡像干凈不被修改,鏡像被拉取下來都是只讀的層,運(yùn)行容器時(shí),會在鏡像的最上層加上一層可寫層,由于上層可以覆蓋下層的特性,修改上層文件就能達(dá)到修改容器運(yùn)行邏輯的目的,同時(shí),保證了這個(gè)鏡像內(nèi)部不被修改;容器刪除后,可寫層會消失,鏡像層保持不變 。
當(dāng)需要修改可寫層時(shí),將需要修改的對應(yīng)數(shù)據(jù)找到并復(fù)制到可寫層,再進(jìn)行修改,這就是寫時(shí)復(fù)制。
四、數(shù)據(jù)卷掛載
通過學(xué)習(xí)聯(lián)合文件系統(tǒng)我們知道,容器內(nèi)部的文件系統(tǒng)是獨(dú)立的,也是一次性的,每次容器重啟后,原有的數(shù)據(jù)就會消失,對于需要數(shù)據(jù)持久化的程序,就需要使用數(shù)據(jù)卷技術(shù)。
數(shù)據(jù)卷實(shí)際上是容器與宿主機(jī)之間共享的一塊目錄/文件,它不受容器的生命周期影響,因此可以被用來持久化數(shù)據(jù)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
docker+daocloud實(shí)現(xiàn)前端項(xiàng)目自動構(gòu)建部署
這篇文章主要介紹了docker+daocloud實(shí)現(xiàn)前端項(xiàng)目自動構(gòu)建部署,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
docker啟動mysql5.7服務(wù)詳細(xì)說明
這篇文章主要給大家介紹了關(guān)于docker啟動mysql5.7服務(wù)的相關(guān)資料,文中通過代碼示例介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考價(jià)值,需要的朋友可以參考下2023-09-09
不重啟Docker容器就能修改時(shí)間的全方案總結(jié)
在使用Docker的過程中,很多開發(fā)者會遇到需要修改容器時(shí)間的場景,本文會梳理Docker容器時(shí)間的底層邏輯,以及不重啟容器修改時(shí)間的所有可行方案,大家可以根據(jù)需要進(jìn)行選擇2025-12-12
Ubuntu安裝Docker及配置鏡像加速與常見命令超詳細(xì)教程
Docker是一種流行的容器化平臺,它能夠簡化應(yīng)用程序的部署和管理,這篇文章主要介紹了Ubuntu安裝Docker及配置鏡像加速與常見命令的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-12-12

