Docker 基本原理

LXC

容器的概念

?容器技術(shù)畸陡,也稱為容器鹰溜,是一種包裝方法一個(gè)應(yīng)用程序,使其可以運(yùn)行丁恭,并與其他應(yīng)用程序隔離過程曹动。
?容器是一個(gè)標(biāo)準(zhǔn)的軟件單元,用于打包代碼及其所有依賴關(guān)系使應(yīng)用程序從一個(gè)計(jì)算環(huán)境到另一個(gè)牲览。
?將軟件打包成標(biāo)準(zhǔn)單元墓陈,以便開發(fā)、裝運(yùn)和部署

Linux的容器

  • Linux容器是一組與系統(tǒng)其他部分隔離的進(jìn)程第献,從提供支持這些進(jìn)程所需的所有文件的不同映像運(yùn)行贡必。
  • FreeBSD jail, 2000
  • Linux VServer, 2001
    • CGroups
    • Namespaces
    • LXC

Linux命名空間

?名稱空間將全局系統(tǒng)資源包裝在一個(gè)抽象中,使名稱空間內(nèi)的進(jìn)程似乎擁有自己的全局資源的獨(dú)立實(shí)例庸毫。
?對(duì)全局資源的更改對(duì)作為命名空間成員的其他進(jìn)程可見仔拟,但對(duì)其他進(jìn)程不可見。
?名稱空間的一個(gè)用途是實(shí)現(xiàn)容器飒赃。

命名空間API包括以下系統(tǒng)調(diào)用:

  • 克吕ā(2):克隆(2)系統(tǒng)調(diào)用創(chuàng)建一個(gè)新進(jìn)程载佳。
  • setns(2):setns(2)系統(tǒng)調(diào)用允許調(diào)用進(jìn)程加入現(xiàn)有命名空間炒事。
  • 取消共享(2):取消共享(2)系統(tǒng)調(diào)用將調(diào)用進(jìn)程移動(dòng)到新的命名空間

主機(jī)虛擬化和容器

image.png

KVM和LXC

image.png

命名空間和容器

image.png

PID命名空間

image.png

Linux Namespaces and CGroups

?Namespaces
? Mount namespaces:掛載點(diǎn)
? UTS namespaces:主機(jī)名與域名
? IPC namespaces:信號(hào)量、消息隊(duì)列和共享內(nèi)存
? PID namespaces:進(jìn)程號(hào)
? Network namespaces:網(wǎng)絡(luò)設(shè)備蔫慧、網(wǎng)絡(luò)棧挠乳、端口等
? User namespaces:用戶和組

?cgroups
? blkio:塊設(shè)備IO
? cpu:CPU
? cpuacct:CPU資源使用報(bào)告
? cpuset:多處理器平臺(tái)上的CPU集合
? devices:設(shè)備訪問
? freezer:掛起或恢復(fù)任務(wù)
? memory:內(nèi)存用量及報(bào)告
? perf_event:對(duì)cgroup中的任務(wù)進(jìn)行統(tǒng)一性能測(cè)試
? net_cls:cgroup中的任務(wù)創(chuàng)建的數(shù)據(jù)報(bào)文的類別標(biāo)識(shí)符

filesystem namespace

image.png

CGroups

image.png

什么是LXC

?lxc是linux內(nèi)核包含特性的用戶空間接口。
?當(dāng)前的lxc使用以下內(nèi)核特性來包含進(jìn)程
?內(nèi)核名稱空間(ipc、uts睡扬、mount盟蚣、pid、network和user)
?Apparmor和Selinux配置文件
? Seccomp policies
? Chroots (using pivot_root)
? Kernel capabilities
? CGroups (control group

?LXC容器通常被視為介于chroot和一個(gè)成熟的虛擬機(jī)卖怜。
?LXC的目標(biāo)是創(chuàng)造一個(gè)盡可能接近標(biāo)準(zhǔn)的環(huán)境Linux安裝刁俭,但不需要單獨(dú)的內(nèi)核。

image.png

?Linux容器已經(jīng)成為一個(gè)關(guān)鍵的開源應(yīng)用程序包以及交付技術(shù)韧涨,將輕量級(jí)應(yīng)用程序隔離與基于圖像的部署方法的靈活性牍戚。
?CentOS 7使用核心技術(shù)實(shí)現(xiàn)Linux容器,如用于資源管理的控制組(cgroup)虑粥,用于進(jìn)程隔離如孝,selinux用于安全性赞季,支持安全的多租戶和降低安全漏洞的可能性
?LXC呐萨、容器息堂、OpenVZ履腋、systemd-nspawn、RUNC

  • Linux 容器架構(gòu)
image.png

Docker

runC

?OCF:開放容器格式
?runc是一個(gè)cli工具耿焊,用于根據(jù)oci規(guī)范生成和運(yùn)行容器
?容器作為runc的子進(jìn)程啟動(dòng)涝焙,可以嵌入到其他各種系統(tǒng)中墓贿,而無需運(yùn)行守護(hù)進(jìn)程
?runc建立在libcontainer之上储笑,同樣的容器技術(shù)為數(shù)百萬的docker引擎安裝提供動(dòng)力

docker架構(gòu)

image.png

?Docker守護(hù)進(jìn)程(Docker daemon)
?Docker守護(hù)進(jìn)程(Dockerd)監(jiān)聽Docker API請(qǐng)求并管理Docker對(duì)象甜熔,如圖像、容器突倍、網(wǎng)絡(luò)和卷腔稀。
?Docker客戶端(Docker client)
?Docker客戶端(Docker)是許多Docker用戶與之交互的主要方式。
?docker命令使用的是docker api羽历。
?Docker注冊(cè)表
?Docker注冊(cè)表存儲(chǔ)Docker圖像焊虏。
?Docker Hub和Docker Cloud是任何人都可以注冊(cè)使用,Docker默認(rèn)在Docker Hub上查找鏡像秕磷。
?你甚至可以運(yùn)行自己的私有倉庫

Docker對(duì)象
?使用Docker時(shí)诵闭,您正在創(chuàng)建和使用鏡像,容器澎嚣,網(wǎng)絡(luò)疏尿、卷、插件和其他對(duì)象币叹。

  • 鏡像
    • 鏡像是一個(gè)只讀模板润歉,包含創(chuàng)建Docker容器的說明模狭。
    • 通常颈抚,一個(gè)圖像基于另一個(gè)圖像,并有一些額外的定制。
    • 你可以創(chuàng)建自己的鏡像贩汉,也可以只使用其他人創(chuàng)建并在倉庫中發(fā)布的圖像驱富。
  • 容器
    • 容器是基于鏡像運(yùn)行的實(shí)例。
    • 您可以使用Docker API或CLI創(chuàng)建匹舞、運(yùn)行褐鸥、停止、移動(dòng)或刪除容器赐稽。
    • 你可以將容器連接到一個(gè)或多個(gè)網(wǎng)絡(luò)叫榕,將存儲(chǔ)連接到它,甚至創(chuàng)建新的
    • 你可以將容器連接到一個(gè)或多個(gè)網(wǎng)絡(luò)姊舵,分配存儲(chǔ)給它晰绎,甚至基于容器當(dāng)前的狀態(tài)重新制作一個(gè)鏡像。

Docker Host and Registry

image.png

chroot

chroot是操作系統(tǒng)級(jí)的“虛擬機(jī)”括丁,其功能是切換程序運(yùn)行時(shí)的根目錄荞下,將程序限制在指定的根目錄中,從而隔離應(yīng)用程序史飞。在chroot中運(yùn)行的程序?qū)嶋H上使用的是真實(shí)系統(tǒng)的內(nèi)核和資源尖昏,所以性能不會(huì)有損耗。

  • 其好處主要有
    • 增強(qiáng)主機(jī)安全性
      在chroot中的程序不會(huì)訪問到真實(shí)的系統(tǒng)文件构资,如真實(shí)系統(tǒng)的passwd等文件抽诉,和Windows下的沙箱類似,尤其適合對(duì)高風(fēng)險(xiǎn)的應(yīng)用吐绵,如web等
    • 獨(dú)立的程序運(yùn)行環(huán)境
      運(yùn)行在chroot中的程序使用的是chroot中的資源掸鹅,不會(huì)使用主機(jī)提供的庫文件等。要想在程序能在chroot中運(yùn)行拦赠,就要解決依賴關(guān)系巍沙,所以用chroot還可以把程序“綠色化”,配置好的chroot環(huán)境荷鼠,打包好丟到其它服務(wù)器直接就可以運(yùn)行句携。這一特性也方便了運(yùn)維和開發(fā)。
    • 限制資源訪問
      可以限制chroot環(huán)境中用戶能使用的命令允乐,例如:如果不想用戶使用passwd命令矮嫉,不要把passwd命令放到chroot環(huán)境中就行了。出與安全考慮運(yùn)行在chroot中的程序建議給最小權(quán)限牍疏。
  • 作用
    1. 將特權(quán)分配給無特權(quán)的進(jìn)程蠢笋,例如 Web 服務(wù)或 DNS 服務(wù)。
    2. 建立測(cè)試環(huán)境鳞陨。
    3. 不使程序或系統(tǒng)崩潰下昨寞,運(yùn)行舊程序或 ABI 兼容的程序。
    4. 系統(tǒng)恢復(fù)。
    5. 重新安裝引導(dǎo)裝載程序援岩,例如 Grub 或 Lilo歼狼。
    6. 密碼找回,重置一個(gè)已丟失的密碼等享怀。

LinuX Container
lxc-create,template
lxc增強(qiáng)版docker

命名空間「Namespaces」

pid namespace

不同用戶的進(jìn)程就是通過 pid namespace 隔離開的羽峰,且不同 namespace 中可以有相同 PID。具有以下特征:

  • 每個(gè) namespace 中的 pid 是有自己的 pid=1 的進(jìn)程(類似 /sbin/init 進(jìn)程)

  • 每個(gè) namespace 中的進(jìn)程只能影響自己的同一個(gè) namespace 或子 namespace 中的進(jìn)程

  • 因?yàn)?/proc 包含正在運(yùn)行的進(jìn)程添瓷,因此在 container 中的 pseudo-filesystem 的 /proc 目錄只能看到自己 namespace 中的進(jìn)程

  • 因?yàn)?namespace 允許嵌套梅屉,父 namespace 可以影響子 namespace 的進(jìn)程,所以子 namespace 的進(jìn)程可以在父 namespace 中看到鳞贷,但是具有不同的 pid

參考文檔:Introduction to Linux namespaces – Part 3: PID

mnt namespace

類似 chroot履植,將一個(gè)進(jìn)程放到一個(gè)特定的目錄執(zhí)行。mnt namespace 允許不同 namespace 的進(jìn)程看到的文件結(jié)構(gòu)不同悄晃,這樣每個(gè) namespace 中的進(jìn)程所看到的文件目錄就被隔離開了玫霎。同 chroot 不同,每個(gè) namespace 中的 container 在 /proc/mounts 的信息只包含所在 namespace 的 mount point妈橄。

net namespace

網(wǎng)絡(luò)隔離是通過 net namespace 實(shí)現(xiàn)的庶近, 每個(gè) net namespace 有獨(dú)立的 network devices, IP addresses, IP routing tables, /proc/net 目錄。這樣每個(gè) container 的網(wǎng)絡(luò)就能隔離開來眷蚓。 docker 默認(rèn)采用 veth 的方式將 container 中的虛擬網(wǎng)卡同 host 上的一個(gè) docker bridge 連接在一起鼻种。

參考文檔:Introduction to Linux namespaces – Part 5: NET

uts namespace

UTS ("UNIX Time-sharing System") namespace 允許每個(gè) container 擁有獨(dú)立的 hostname 和 domain name, 使其在網(wǎng)絡(luò)上可以被視作一個(gè)獨(dú)立的節(jié)點(diǎn)而非 Host 上的一個(gè)進(jìn)程。

參考文檔:Introduction to Linux namespaces – Part 1: UTS

ipc namespace

container 中進(jìn)程交互還是采用 Linux 常見的進(jìn)程間交互方法 (interprocess communication - IPC), 包括常見的信號(hào)量沙热、消息隊(duì)列和共享內(nèi)存叉钥。然而同 VM 不同,container 的進(jìn)程間交互實(shí)際上還是 host 上具有相同 pid namespace 中的進(jìn)程間交互篙贸,因此需要在IPC資源申請(qǐng)時(shí)加入 namespace 信息 - 每個(gè) IPC 資源有一個(gè)唯一的 32bit ID投队。

參考文檔:Introduction to Linux namespaces – Part 2: IPC

user namespace

每個(gè) container 可以有不同的 user 和 group id, 也就是說可以以 container 內(nèi)部的用戶在 container 內(nèi)部執(zhí)行程序而非 Host 上的用戶。

有了以上 6 種 namespace 從進(jìn)程爵川、網(wǎng)絡(luò)敷鸦、IPC、文件系統(tǒng)寝贡、UTS 和用戶角度的隔離扒披,一個(gè) container 就可以對(duì)外展現(xiàn)出一個(gè)獨(dú)立計(jì)算機(jī)的能力,并且不同 container 從 OS 層面實(shí)現(xiàn)了隔離圃泡。 然而不同 namespace 之間資源還是相互競(jìng)爭(zhēng)的碟案,仍然需要類似 ulimit 來管理每個(gè) container 所能使用的資源 - cgroup。

Docker 鏡像

?Docker鏡像含有啟動(dòng)容器所需要的文件系統(tǒng)及其內(nèi)容颇蜡,因此价说,其用
于創(chuàng)建并啟動(dòng)docker容器
?采用分層構(gòu)建機(jī)制辆亏,最底層為bootfs,其之為rootfs ? bootfs:用于系統(tǒng)引導(dǎo)的文件系統(tǒng)熔任,包括bootloader和kernel,容器啟動(dòng)完成后會(huì)被卸載以節(jié)約內(nèi)存資源唁情;
? rootfs:位于bootfs之上疑苔,表現(xiàn)為docker容器的根文件系統(tǒng);
? 傳統(tǒng)模式中,系統(tǒng)啟動(dòng)之時(shí)甸鸟,內(nèi)核掛載rootfs時(shí)會(huì)首先將其掛載為“只讀”模式惦费,完整性自檢完成后將其重新掛載為讀寫模式;
? docker中抢韭,rootfs由內(nèi)核掛載為“只讀”模式薪贫,而后通過“聯(lián)合掛載 ”技術(shù)額外掛載一個(gè)“可寫”層;

?位于下層的鏡像稱為父鏡像(parent image)刻恭,最底層的稱為基礎(chǔ)鏡像(base
image)
?最上層為“可讀寫”層瞧省,其下的均為“只讀”層

image.png

Aufs
? advanced multi-layered unification filesystem:高級(jí)多層統(tǒng)一文件系統(tǒng)
?用于為L(zhǎng)inux文件系統(tǒng)實(shí)現(xiàn)“聯(lián)合掛載”? aufs是之前的UnionFS的重新實(shí)現(xiàn),2006年由Junjiro Okajima開發(fā)鳍贾;
? Docker最初使用aufs作為容器文件系統(tǒng)層鞍匾,它目前仍作為存儲(chǔ)后端之一來支持;
? aufs的競(jìng)爭(zhēng)產(chǎn)品是overlayfs骑科,后者自從3.18版本開始被合并到Linux內(nèi)核橡淑;
? docker的分層鏡像,除了aufs咆爽,docker還支持btrfs, devicemapper和vfs等
? 在Ubuntu系統(tǒng)下梁棠,docker默認(rèn)Ubuntu的 aufs;而在CentOS7上斗埂,用的是devicemappe

Devicemapper

?Device Mapper 是 Linux2.6 內(nèi)核中支持邏輯卷管理的通用設(shè)備映射機(jī)制
符糊,它為實(shí)現(xiàn)用于存儲(chǔ)資源管理的塊設(shè)備驅(qū)動(dòng)提供了一個(gè)高度模塊化的
內(nèi)核架構(gòu)
?在內(nèi)核中它通過一個(gè)一個(gè)模塊化的 target driver 插件實(shí)現(xiàn)對(duì) IO 請(qǐng)求的過濾或者重新定向等工作,當(dāng)前已經(jīng)實(shí)現(xiàn)的 target driver 插件包括軟raid呛凶、軟加密濒蒋、邏輯卷?xiàng)l帶、多路徑把兔、鏡像沪伙、快照等
?前一頁圖中 linear、mirror县好、snapshot围橡、multipath 表示的就是這些 target driver
?在這諸多“插件”中,有一種叫Thin Provisioning Snapshot缕贡,Docker正是使用了Thin Provisioning的Snapshot的技術(shù)實(shí)現(xiàn)了類似auFS的分層鏡像

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末翁授,一起剝皮案震驚了整個(gè)濱河市拣播,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌收擦,老刑警劉巖贮配,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異塞赂,居然都是意外死亡泪勒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門宴猾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來圆存,“玉大人,你說我怎么就攤上這事仇哆÷僬蓿” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵讹剔,是天一觀的道長(zhǎng)油讯。 經(jīng)常有香客問我,道長(zhǎng)延欠,這世上最難降的妖魔是什么撞羽? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮衫冻,結(jié)果婚禮上诀紊,老公的妹妹穿的比我還像新娘。我一直安慰自己隅俘,他們只是感情好邻奠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著为居,像睡著了一般碌宴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蒙畴,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天贰镣,我揣著相機(jī)與錄音,去河邊找鬼膳凝。 笑死碑隆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹬音。 我是一名探鬼主播上煤,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼著淆!你這毒婦竟也來了劫狠?” 一聲冷哼從身側(cè)響起拴疤,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎独泞,沒想到半個(gè)月后呐矾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡懦砂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年蜒犯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孕惜。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡愧薛,死狀恐怖晨炕,靈堂內(nèi)的尸體忽然破棺而出衫画,到底是詐尸還是另有隱情,我是刑警寧澤瓮栗,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布削罩,位于F島的核電站,受9級(jí)特大地震影響费奸,放射性物質(zhì)發(fā)生泄漏弥激。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一愿阐、第九天 我趴在偏房一處隱蔽的房頂上張望微服。 院中可真熱鬧,春花似錦缨历、人聲如沸以蕴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丛肮。三九已至,卻和暖如春魄缚,著一層夾襖步出監(jiān)牢的瞬間宝与,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國打工冶匹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留习劫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓嚼隘,卻偏偏與公主長(zhǎng)得像榜聂,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗓蘑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一须肆、Docker 簡(jiǎn)介 Docker 兩個(gè)主要部件:Docker: 開源的容器虛擬化平臺(tái)Docker Hub: 用...
    R_X閱讀 4,385評(píng)論 0 27
  • Docker容器技術(shù)已經(jīng)發(fā)展了好些年匿乃,在很多項(xiàng)目都有應(yīng)用,線上運(yùn)行也很穩(wěn)定豌汇。整理了部分Docker的學(xué)習(xí)筆記以及新...
    __七把刀__閱讀 11,450評(píng)論 0 58
  • 寫這個(gè)系列文章主要是對(duì)之前做項(xiàng)目用到的docker相關(guān)技術(shù)做一些總結(jié)幢炸,包括docker基礎(chǔ)技術(shù)Linux命名空間,...
    __七把刀__閱讀 5,801評(píng)論 0 16
  • 聽著海潮的聲息拒贱, 回憶大地的呻吟宛徊。 傾聽夢(mèng)中的身影。 世界依舊遼闊逻澳, 空中不見一片云 生命了無痕跡闸天。 我哀嘆這人間...
    古風(fēng)長(zhǎng)歌閱讀 290評(píng)論 4 5
  • 區(qū)塊元素 {docsify-ignore} 段落和換行 一個(gè) Markdown 段落是由一個(gè)或多個(gè)連續(xù)的文本行組成...
    Flag丶閱讀 736評(píng)論 0 0