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ī)虛擬化和容器
KVM和LXC
命名空間和容器
PID命名空間
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
CGroups
什么是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)核。
?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)
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)
?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
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)限牍疏。
- 增強(qiáng)主機(jī)安全性
-
作用:
- 將特權(quán)分配給無特權(quán)的進(jìn)程蠢笋,例如 Web 服務(wù)或 DNS 服務(wù)。
- 建立測(cè)試環(huán)境鳞陨。
- 不使程序或系統(tǒng)崩潰下昨寞,運(yùn)行舊程序或 ABI 兼容的程序。
- 系統(tǒng)恢復(fù)。
- 重新安裝引導(dǎo)裝載程序援岩,例如 Grub 或 Lilo歼狼。
- 密碼找回,重置一個(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)
?最上層為“可讀寫”層瞧省,其下的均為“只讀”層
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的分層鏡像