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