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

