容器的本質是什麼?
上回一切使之容器 — Container with Application (1),一起了解了容器的演進過程。
那容器的本質到底是什麼?
先說結論,他是一種特殊的程序(進程)。
而容器技術就是透過約束與進程運行時,創造出虛擬的界線。
對於 Docker 或大多數 Linux 容器來說,Cgroups 技術是用來創造約束的效果,而Namespace 技術則是用來修改進程視圖的方法。
Namespace
Namespace 的技術能夠有什麼作用呢?
假設現在有 50 個進程,那他們的 PID 就會是 1.2.3...49.50,那現在利用 Namespace 技術創造第 51 個進程,這個進程會進入一個全新的空間,此時這個進程中的 PID 會從 1 開始,但在原本的宿主機上還依然是 51 號進程。
原來 Namespace 技術只是遮掩了宿主機中一部分的進程,讓容器以為他是第一個進程,就等同於 PID = 1。
由此,我們知道容器技術的最核心概念就是透過特殊的進程建立容器。這也就是為什麼容器是單進程模型。
Cgroups
竟然容器會以為自己是整個主機,那容器就很有可能直接吃掉宿主機的全部資源,由此容器技術就透過 Cgroups 來限制容器中的資源使用。
Linux Cgroups 的全名是 Linux Control Group,基本上是用來限制一個進程組的資源使用,包括 CPU,記憶體,磁碟,網路頻寬等等。
所以我們得知,容器技術並不神秘,甚至理解了為什麼他能夠這麼快速,因為,他只是個特殊的進程,並沒有使用虛擬化技術,當然也跟虛擬機有很大的差異。
既然是單進程模型,那一次就只適合運行一個應用,這也就是 Docker 項目在官方文件中強力推薦,一個應用一個容器,事實上他受於先天上的限制,當然也得利於環境隔離。
解決了製作容器與限制資源之後,容器還有一個重要的技術尚未說明,那就是文件系統。
那,容器技術是如何解決文件系統的呢?
下一篇分享見。
yasuoyuhao 2018/12/28
如果喜歡我的文章,可以按下喜歡或追隨讓我知道呦,更歡迎許多大神指點討論。感謝您的閱讀。
部落格:yasuoyuhao's Area