程式設計師修神之路--容器技術為什麼會這麼流行
菜菜哥,你上次講的kubernetes我研究了一下,你再給我講講docker唄
docker可很流行呀
kubernetes是容器編排技術,容器不就是指的docker嗎?
docker可不等於容器哦,docker只算是容器的一種吧,算了容器的典型代表
在傳統的軟體部署方式中,程式設計師需要把要釋出的應用程式打成包發給運維人員,然後由運維人員在生產環境進行部署。當隨著應用的版本迭代越來越多,應用的依賴庫版本錯綜複雜,往往會出現開發環境和生產環境不一致的情況發生,而且由於多數情況下采用微服務的架構,每個團隊都有可能使用不同版本的依賴庫,並有可能在升級的時候替換掉他們,因而同一個應用程式採用相同版本的依賴庫是多麼的重要。
當應用程式比較少或者都是一些單體應用的時候,可以利用虛擬機器來隔離每個服務,通過虛擬機器的虛擬化技術來為每個應用程式提供不同的執行環境。但是當拆分為微服務之後,每個服務會變的小而多,這個時候如果為每個應用程式分配一個虛擬機器,資源耗費是相當多的,但是每個虛擬機器上執行多個微服務又會發生依賴庫版本的問題,如果有一種起到類似虛擬機器隔離作用,但是成本比虛擬機器低很多的技術該有多好?
得益於linux的容器技術,現代開發者已經由傳統的虛擬機器方式轉向linux容器技術。容器類似虛擬機器,但比虛擬機器開銷要小的多,並且同樣把每個應用都隔離開來。容器技術允許你在同一臺伺服器上執行多個服務,而且還可以根據每個服務提供不同的執行環境。
虛擬機器中的程序執行在虛擬機器的作業系統中,而執行在容器中的程序實際是執行在宿主機的作業系統中,只是表面看來好像執行在容器的沙盒一樣,但實際上確實是和其他程序相互隔離的。
linux之所以能實現容器這種功能,得益於它的名稱空間和控制組。linux名稱空間時每個程序相互隔離,只能看到它自己的系統資源,例如:檔案,程序,網路等,而linux的控制組技術能夠限制每個程序可以使用的資源的最大量。一個技術進行隔離,一個技術進行限制,這就導致了容器技術要比虛擬機器要靈活的多。
一個虛擬機器的正常執行,需要執行自己的一系列系統程序,只是這些系統程序就耗費了大量資源。容器和虛擬機器相比較就顯得輕量的多,它允許在相同配置的硬體基礎上執行更多數量的應用。雖然容器本身也有消耗,但是和虛擬機器系統的消耗比起來要小的多。
虛擬機器是利用軟體技術將物理硬體虛擬化為多個虛擬硬體資源,從而被每個虛擬機器的作業系統使用。虛擬機器裡的程序會進行虛擬機器的系統呼叫,虛擬機器的指令會通過軟體技術變為宿主機上真正的cpu指令,而容器中的程序執行的指令不需要任何的虛擬化過程,直接會被cpu執行,所以單純在執行指令的過程中,虛擬機器要比容器的執行過程要長,資源耗費要多。
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。
Docker容器平臺的出現把linxu容器化技術推向了一個高潮,它不僅簡化了程式部署的方式,更簡化了打包應用和依賴,使容器真正做到了在不同的作業系統之間移植,甚至一個完整的作業系統也可以被打包成一個可移植的映象。
執行docker包的前提是,目標機器一定要執行docker。
當你的應用被打包成docker映象之後,無論在什麼作業系統中執行,它都能看見相同的檔案,相同的依賴庫,因為這些依賴庫已經被一起打包到了docker映象中,即使目標機器上安裝了正確的版本的依賴庫,它也會只用映象中的依賴庫,這就是程式設計師期盼的無論何時何地的環境一致性呀