云原生集成開發(fā)環(huán)境——TitanIDE
通過網(wǎng)頁在任何地方更安全、更高效地編碼2022-06-23
854
作者:行云創(chuàng)新 周朋
每個(gè)剛涉足容器的人都會(huì)對容器的實(shí)現(xiàn)有所困惑,容器是如何實(shí)現(xiàn)的,是如何復(fù)用宿主機(jī)的資源,并且實(shí)現(xiàn)資源隔離的;下面會(huì)用shell創(chuàng)建一個(gè)容器,為大家展示一個(gè)容器的創(chuàng)建過程。
1.創(chuàng)建鏡像
我們一般用 docker pull 從遠(yuǎn)端的鏡像倉庫獲得鏡像,鏡像里面包含的是一個(gè)根文件系統(tǒng),那如何通過一個(gè)鏡像,手動(dòng)創(chuàng)建一個(gè)容器呢?
首先,我們需要先獲取一個(gè)鏡像。
或者可以從 alpine 官方網(wǎng)站獲取`mini rootfs filesystem`的 tarball,同樣是一個(gè)文件系統(tǒng),并沒有明顯差異。
2.啟動(dòng)容器
剛剛我們已經(jīng)將文件系統(tǒng)解壓到本地,現(xiàn)在我們可以使用本地的文件系統(tǒng)"啟動(dòng)"一個(gè)容器了,那如何啟動(dòng)一個(gè)簡單的容器呢?
使用 chroot,chroot 主要是將程序運(yùn)行環(huán)境切換到指定目錄,當(dāng)我們切換過去之后,在應(yīng)用程序內(nèi),根目錄"/"的位置變成了我們指定的目錄了,所以這就是為什么我們需要在"1"中創(chuàng)建一個(gè)根文件系統(tǒng)。
好了,現(xiàn)在一個(gè)簡單的容器已經(jīng)創(chuàng)建完成了,我們可以體驗(yàn)一下我們的"容器"。
以上,你應(yīng)該能理解一個(gè)容器的文件系統(tǒng)在宿主機(jī)上是如何存在的,當(dāng)然,我們在使用 docker 的時(shí)候,當(dāng)前容器的根文件系統(tǒng)會(huì)經(jīng)過`overlay2` storage driver 一系列復(fù)雜的操作掛載到本機(jī);但是那只是為了提高磁盤的利用率和獲取容器鏡像效率等等原因做的特殊優(yōu)化,并不會(huì)影響容器文件系統(tǒng)的本質(zhì)。
但是我們發(fā)現(xiàn)可以查看這個(gè)容器的網(wǎng)絡(luò)(和宿主機(jī)共享),目錄;但是不能查看進(jìn)程,內(nèi)存,磁盤信息,原因是是因?yàn)?proc是空的,/proc文件系統(tǒng)提供對系統(tǒng)中每個(gè)活動(dòng)進(jìn)程和線程狀態(tài)的訪問,我們必須要手動(dòng)把它掛載到我們的容器里面。
然后我們能發(fā)現(xiàn),能看到宿主機(jī)所有的進(jìn)程、內(nèi)存,磁盤信息,這不太像我們了解的容器,因?yàn)樗馁Y源還沒有隔離,資源隔離需要利用namespace和cgroup,這依然是Linux操作系統(tǒng)提供的能力。
3.利用namespace隔離進(jìn)程資源
namespace 是 Linux kernel 提供的基本能力,它能對內(nèi)核資源進(jìn)行區(qū)分,讓不同的進(jìn)程的資源彼此隔離,該功能通過為一組資源和進(jìn)程使用相同的命名空間來工作,但這些命名空間引用不同的資源。資源可能存在于多個(gè)空間中。此類資源的示例包括進(jìn)程 ID、主機(jī)名、用戶 ID、文件名以及與網(wǎng)絡(luò)訪問和進(jìn)程間通信相關(guān)的一些名稱。
我們將用 unshare 為我們的進(jìn)程創(chuàng)建一個(gè)新的 namespace,并和宿主機(jī)的資源隔離。
好了,我們再次掛載文件系統(tǒng)/proc,查看這個(gè)容器。
他已經(jīng)像是我們認(rèn)知上的容器了,但是只是表面上看起來像;它只根據(jù)PID隔離了網(wǎng)絡(luò)資源,沒有隔離宿主機(jī)CPU、memory等資源,也并不能實(shí)現(xiàn)容器的網(wǎng)絡(luò)通信,當(dāng)然我們只是簡單驗(yàn)證容器的創(chuàng)建過程,我們會(huì)在后面講述Cgroup隔離資源的原理,但是我們并不會(huì)真的操作它,就像我們沒有用`overlay2` storage driver掛載容器的跟文件系統(tǒng)一樣,這些東西用shell命令做起來很繁瑣,缺失它們,但是并不影響我們理解容器創(chuàng)建的過程。
以上一個(gè)簡單的容器就創(chuàng)建完成了,雖然如上所述,它并沒有隔離物理資源,但是只是想告訴你一個(gè)事實(shí),容器的存在和虛擬化是有本質(zhì)差異的,它本質(zhì)是復(fù)用了Linux本身的各種能力創(chuàng)建的。
限于篇幅,剩下的內(nèi)容我們將在后續(xù)的文章中更新。
更多技術(shù)干貨,從這里獲取。