3 回答

TA貢獻2003條經驗 獲得超2個贊
主機(host) 。
如今,Docker技術大行其道,大家在嘗試以及玩轉Docker的同時,肯定離不開一個概念,那就是“容器”或者“Docker Container”。那么我們首先從實現的角度來看看“容器”或者“Docker Container”到底為何物。
逐漸熟悉Docker之后,大家肯定會深深得感受到:應用程序在Docker Container內部的部署與運行非常便捷,只要有Dockerfile,應用一鍵式的部署運行絕對不是天方夜譚; Docker Container內運行的應用程序可以受到資源的控制與隔離,大大滿足云計算時代應用的要求。毋庸置疑,Docker的這些特性,傳統模式下應用是完全不具備的。然而,這些令人眼前一亮的特性背后,到底是誰在“作祟”,到底是誰可以支撐Docker的這些特性?不知道這個時候,大家是否會聯想到強大的Linux內核。
其實,這很大一部分功能都需要歸功于Linux內核。那我們就從Linux內核的角度來看看Docker到底為何物,先從Docker Container入手。關于Docker Container,體驗過的開發者第一感覺肯定有兩點:內部可以跑應用(進程),以及提供隔離的環境。當然,后者肯定也是工業界稱之為“容器”的原因之一。
既然Docker Container內部可以運行進程,那么我們先來看Docker Container與進程的關系,或者容器與進程的關系。首先,我提出這樣一個問題供大家思考“容器是否可以脫離進程而存在”。換句話說,能否創建一個容器,而這個容器內部沒有任何進程。
可以說答案是否定的。既然答案是否定的,那說明不可能先有容器,然后再有進程,那么問題又來了,“容器和進程是一起誕生,還是先有進程再有容器呢?”可以說答案是后者。以下將慢慢闡述其中的原因。
闡述問題“容器是否可以脫離進程而存在”的原因前,相信大家對于以下的一段話不會持有異議:通過Docker創建出的一個Docker Container是一個容器,而這個容器提供了進程組隔離的運行環境。那么問題在于,容器到底是通過何種途徑來實現進程組運行環境的“隔離”。這時,就輪到Linux內核技術隆重登場了。
說到運行環境的“隔離”,相信大家肯定對Linux的內核特性namespace和cgroup不會陌生。namespace主要負責命名空間的隔離,而cgroup主要負責資源使用的限制。其實,正是這兩個神奇的內核特性聯合使用,才保證了Docker Container的“隔離”。那么,namespace和cgroup又和進程有什么關系呢?問題的答案可以用以下的次序來說明:
(1) 父進程通過fork創建子進程時,使用namespace技術,實現子進程與其他進程(包含父進程)的命名空間隔離;
(2) 子進程創建完畢之后,使用cgroup技術來處理子進程,實現進程的資源使用限制;
(3) 系統在子進程所處namespace內部,創建需要的隔離環境,如隔離的網絡棧等;
(4) namespace和cgroup兩種技術都用上之后,進程所處的“隔離”環境才真正建立,這時“容器”才真正誕生!
從Linux內核的角度分析容器的誕生,精簡的流程即如以上4步,而這4個步驟也恰好巧妙的闡述了namespace和cgroup這兩種技術和進程的關系,以及進程與容器的關系。進程與容器的關系,自然是:容器不能脫離進程而存在,先有進程,后有容器。然而,大家往往會說到“使用Docker創建Docker Container(容器),然后在容器內部運行進程”。對此,從通俗易懂的角度來講,這完全可以理解,因為“容器”一詞的存在,本身就較為抽象。如果需要更為準確的表述,那么可以是:“使用Docker創建一個進程,為這個進程創建隔離的環境,這樣的環境可以稱為Docker Container(容器),然后再在容器內部運行用戶應用進程?!碑斎?,筆者的本意不是想否定很多人對于Docker Container或者容器的認識,而是希望和讀者一起探討Docker Container底層技術實現的原理。
- 3 回答
- 0 關注
- 1282 瀏覽
添加回答
舉報