01 本質上的區(qū)別
VM(VMware)在宿主機器、宿主機器操作系統(tǒng)的基礎上創(chuàng)建虛擬層、虛擬化的操作系統(tǒng)、虛擬化的倉庫,然后再安裝應用;
Container(Docker容器),在宿主機器、宿主機器操作系統(tǒng)上創(chuàng)建Docker引擎,在引擎的基礎上再安裝應用。
那么問題來了,沒有操作系統(tǒng),怎么運行程序?
-
可以在Docker中創(chuàng)建一個ubuntu的鏡像文件,這樣就能將ubuntu系統(tǒng)集成到Docker中,運行的應用就都是ubuntu的應用。
02 使用上的區(qū)別
Size
-
虛擬機中ubuntu所占內存:
-
Docker容器中ubuntu鏡像文件所占內存:
01 Startup
Docker在宿主機器的操作系統(tǒng)上創(chuàng)建Docker引擎,直接在宿主主機的操作系統(tǒng)上調用硬件資源,而不是虛擬化操作系統(tǒng)和硬件資源,所以操作速度快。
這個其實安裝一個ubuntu的虛擬機和拉取一個Docker的ubuntu鏡像文件,運行一下就知道了,區(qū)別很明顯,虛擬機開一下大概得2分多鐘,而Docker只需要2秒鐘。
02 Integration
首先,Docker可以讓你非常容易和方便地以“容器化”的方式去部署應用。它就像集裝箱一樣,打包了所有依賴,再在其他服務器上部署很容易,不至于換服務器后發(fā)現(xiàn)各種配置文件散落一地,這樣就解決了編譯時依賴和運行時依賴的問題。
其次,Docker的隔離性使得應用在運行時就像處于沙箱中,每個應用都認為自己是在系統(tǒng)中唯一運行的程序,就像剛才例子中,A依賴于python 2.7,同時A還依賴于B,但B卻依賴于Python 3,這樣我們可以在系統(tǒng)中部署一個基于Python 2.7的容器和一個基于Python 3的容器,這樣就可以很方便地在系統(tǒng)中部署多種不同環(huán)境來解決依賴復雜度的問題。這里有些朋友可能會說,虛擬機也可以解決這樣的問題。誠然,虛擬化確實可以做到這一點,但是這需要硬件支持虛擬化及開啟BIOS中虛擬化相關的功能,同時還需要在系統(tǒng)中安裝兩套操作系統(tǒng),虛擬機的出現(xiàn)是解決了操作系統(tǒng)和物理機的強耦合問題。但Docker就輕量化很多,只需內核支持,無需硬件和BIOS的強制要求,可以輕松迅速地在系統(tǒng)上部署多套不同容器環(huán)境,容器的出現(xiàn)解決了應用和操作系統(tǒng)的強耦合問題。
正因為Docker是以應用為中心,鏡像中打包了應用及應用所需的環(huán)境,一次構建,處處運行。這種特性完美解決了傳統(tǒng)模式下應用遷移后面臨的環(huán)境不一致問題。同時,Docker壓根不管內部應用怎么啟動,你自己愛咋來咋來,我們用docker start或run作為統(tǒng)一標準。這樣應用啟動就標準化了,不需要再根據(jù)不同應用而記憶一大串不同啟動命令。
基于Docker的特征,現(xiàn)在常見的利用Docker進行持續(xù)集成的流程如下:
開發(fā)者提交代碼
觸發(fā)鏡像構建
構建鏡像上傳至私有倉庫
鏡像下載至執(zhí)行機器
鏡像運行
其基本拓撲結構如圖1所示
熟悉Docker的朋友都知道,Docker啟動非??欤梢哉f是秒啟。在上述的五步中,1和5的耗時較短,整個持續(xù)集成主要耗時集中在中間的3個步驟,也就是docker build、docker push、docekr pull這樣還是無法達到順滑的極致要求,下來我們來分析下build、push、pull的耗時和解決方法:
03 docker build??
-
網(wǎng)絡優(yōu)化
dockerhub的官方鏡像在國外,由于眾所周知的原因,在國內進行構建時網(wǎng)絡會是很大的瓶頸,甚至某些公司的環(huán)境是無Internet連接的。
在這種情況下,建議使用國內的鏡像源,或者自己搭建私有倉庫,保存項目需要的基礎鏡像,把構建過程中的網(wǎng)絡傳輸都控制在國內或者內網(wǎng),這樣就不用再考慮網(wǎng)絡方面的問題。
-
使用 .dockerignore文件
dockerignore文件的設計是為了在docker build的過程中排除不需要用到的文件以及目錄,目的是為了docker build這個過程可以盡可能地快速高效以及構建出來的image沒有多余的“垃圾”。
-
最小化鏡像層數(shù)(layers)
把鏡像層數(shù)減到最少,能加快容器的啟動速度,但是這里也要權衡另一個問題:dockerfile的可讀性。你可以把一個dockerfile寫得很復雜以達到構建出最小層數(shù)的鏡像,但同時你的dockerfile可讀性也降低了。所以我們要在鏡像層數(shù)和dockerfile可讀性之間做出妥協(xié)。
04 docker push
docker registry升級到v2后加入了很多安全相關檢查,在v2中的鏡像的存儲格式變成了gzip ,鏡像在壓縮過程中占用的時間也比較多。我們簡單分解一下docker push的流程。
buffer to disk,將該層文件系統(tǒng)壓縮成本地的一個臨時文件;
上傳文件至registry;
本地計算壓縮包digest,刪除臨時文件,digest傳給registry;
registry計算上傳壓縮包digest并進行校驗;
registry將壓縮包傳輸至后端存儲文件系統(tǒng);
重復1-5直至所有層傳輸完畢;
計算鏡像的manifest并上傳至registry重復 3-5。
這樣的設計導致push會很慢,如果采用官方的dockerhub,需要考慮docker build一節(jié)中提及的網(wǎng)絡方面影響,dockerhub公有鏡像庫還需考慮安全方面的因素。
同時docker和registry設置了過多的安全防范措施(如雙向證書認證等),主要是為了防止在公有云的環(huán)境下鏡像的偽造和越權獲取。但是在一個可信的環(huán)境內,如果build和push過程都是自己掌控,很多措施都是多余的。
05 docker pull
docker pull 鏡像的速度對服務啟動速度至關重要,好在registry v2后可以并行pull了,速度有了很大改善。但是依然有一些小的問題影響了啟動的速度:
下載鏡像和解壓鏡像是串行的;
串行解壓,由于v2都是gzip要解壓,盡管并行下載了還是串行解壓,內網(wǎng)的話解壓時間比網(wǎng)絡傳輸都要長;
和registry通信, registry在pull的過程中并不提供下載內容只是提供下載url和鑒權,這一部分加長了網(wǎng)絡傳輸,而且一些metadata還是要去后端存儲獲取,延時還是有一些的。
通過剛才的分析,大家可以看到,其實docker build、push、pull其實主要耗時是在網(wǎng)絡傳輸(主要)及安全防范措施(輕微)上,整個傳輸過程甚至大大超過了其他所有步驟的時間;這樣可以借助我們的AppHouse方便的搭建本地企業(yè)級鏡像倉庫,將網(wǎng)絡傳輸轉移至內網(wǎng),同時完全掌控了 build、push和pull的過程,這樣提高效率的同時也解決了安全問題,可謂一舉兩得。
經(jīng)過Docker、AppHouse的幫助,我們距極致追求的如絲般順滑的持續(xù)集成目標只有一步之遙,Docker解決了依賴和環(huán)境問題,AppHouse解決了鏡像安全快速傳輸?shù)膯栴},接下來就是容器的部署和管理問題。
Docker實現(xiàn)了底層技術的創(chuàng)新,它的出現(xiàn)將開發(fā)者從與系統(tǒng)的糾纏中釋放了出來,但是阻礙企業(yè)使用Docker的問題是容器的大規(guī)模部署、管理問題和缺少企業(yè)級容器工具及系統(tǒng)。
鏡像創(chuàng)建完成后,需要把它發(fā)布到測試和生產(chǎn)環(huán)境。因為Docker占用資源小,在單個服務器上部署成百上千個容器也不足為奇。這個階段中如何更合理地使用Docker也是一個難點,開發(fā)團隊需要考慮如何打造一個可伸縮擴展的分發(fā)環(huán)境。
AppSoar提供人性化的Web管理界面,豐富的Compose文件格式和功能完備的API接口,通過Compose實現(xiàn)以十分簡單的文件描述復雜的應用結構,讓部署變得更簡單。并且,AppSoar還提供豐富的企業(yè)應用商店,讓一鍵創(chuàng)建服務成為可能。這樣可以快速搭建應用場景,開發(fā)者只需要關注開發(fā)本身即可。
打通最后一個環(huán)節(jié)后,整個持續(xù)集成平臺架構演進到如圖2所示。
03 Docker特點
-
上手快
用戶只需要幾分鐘,就可以把自己的程序“Docker 化”。Docker 依賴于“寫時復制” (copy-on-write)模型,使修改應用程序也非常迅速,可以說達到“隨心所致,代碼即改” 的境界。
隨后,就可以創(chuàng)建容器來運行應用程序了。大多數(shù) Docker 容器只需要不到 1 秒中即可 啟動。由于去除了管理程序的開銷,Docker 容器擁有很高的性能,同時同一臺宿主機中也可以運行更多的容器,使用戶盡可能的充分利用系統(tǒng)資源。
-
職責的邏輯分類
使用 Docker,開發(fā)人員只需要關心容器中運行的應用程序,而運維人員只需要關心如何管理容器。Docker設計的目的就是要加強開發(fā)人員寫代碼的開發(fā)環(huán)境與應用程序要部署的生產(chǎn)環(huán)境一致性。從而降低那種“開發(fā)時一切正常,肯定是運維的問題(測試環(huán)境都是正 常的,上線后出了問題就歸結為肯定是運維的問題)”
-
快速高效的開發(fā)生命周期
Docker 的目標之一就是縮短代碼從開發(fā)、測試到部署、上線運行的周期,讓你的應用程序具備可移植性,易于構建,并易于協(xié)作。(通俗一點說,Docker 就像一個盒子,里面可以裝很多物件,如果需要這些物件的可以直接將該大盒子拿走,而不需要從該盒子中一件 件的取。)
-
鼓勵使用面向服務的架構
Docker 還鼓勵面向服務的體系結構和微服務架構。Docker 推薦單個容器只運行一個應用程序或進程,這樣就形成了一個分布式的應用程序模型,在這種模型下,應用程序或者服務都可以表示為一系列內部互聯(lián)的容器,從而使分布式部署應用程序,擴展或調試應用程序 都變得非常簡單,同時也提高了程序的內省性。(當然,可以在一個容器中運行多個應用程序)
最后:?下方這份完整的軟件測試視頻學習教程已經(jīng)整理上傳完成,朋友們如果需要可以自行免費領取【保證100%免費】
?這些資料,對于【軟件測試】的朋友來說應該是最全面最完整的備戰(zhàn)倉庫,這個倉庫也陪伴上萬個測試工程師們走過最艱難的路程,希望也能幫助到你!文章來源:http://www.zghlxwxcb.cn/news/detail-806290.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-806290.html
到了這里,關于Docker與VM虛擬機的區(qū)別以及Docker的特點的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!