新聞中心
Docker作為一個(gè)軟件集裝箱化平臺(tái),可以讓開發(fā)者構(gòu)建應(yīng)用程序時(shí),將它與其依賴環(huán)境一起打包到一個(gè)容器中,然后很容易地發(fā)布和應(yīng)用到任意平臺(tái)中,本篇文章重點(diǎn)為大家講解一下Docker的優(yōu)缺點(diǎn)。

創(chuàng)新互聯(lián)建站是一家專業(yè)從事做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)的品牌網(wǎng)絡(luò)公司。如今是成都地區(qū)具影響力的網(wǎng)站設(shè)計(jì)公司,作為專業(yè)的成都網(wǎng)站建設(shè)公司,創(chuàng)新互聯(lián)建站依托強(qiáng)大的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營(yíng)經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站建設(shè)及網(wǎng)站設(shè)計(jì)開發(fā)服務(wù)!
Docker解決的問題:
由于不同的機(jī)器有不同的操作系統(tǒng),以及不同的庫(kù)和組件,在將一個(gè)應(yīng)用部署到多臺(tái)機(jī)器上需要進(jìn)行大量的環(huán)境配置操作。
Docker 主要解決環(huán)境配置問題,它是一種虛擬化技術(shù),對(duì)進(jìn)程進(jìn)行隔離,被隔離的進(jìn)程獨(dú)立于宿主操作系統(tǒng)和其它隔離的進(jìn)程。使用 Docker 可以不修改應(yīng)用程序代碼,不需要開發(fā)人員學(xué)習(xí)特定環(huán)境下的技術(shù),就能夠?qū)F(xiàn)有的應(yīng)用程序部署在其它機(jī)器上。
與虛擬機(jī)的比較:
虛擬機(jī)也是一種虛擬化技術(shù),它與 Docker 最大的區(qū)別在于它是通過模擬硬件,并在硬件上安裝操作系統(tǒng)來實(shí)現(xiàn)。
啟動(dòng)速度
啟動(dòng)虛擬機(jī)需要先啟動(dòng)虛擬機(jī)的操作系統(tǒng),再啟動(dòng)應(yīng)用,這個(gè)過程非常慢;
而啟動(dòng) Docker 相當(dāng)于啟動(dòng)宿主操作系統(tǒng)上的一個(gè)進(jìn)程。
占用資源
虛擬機(jī)是一個(gè)完整的操作系統(tǒng),需要占用大量的磁盤、內(nèi)存和 CPU 資源,一臺(tái)機(jī)器只能開啟幾十個(gè)的虛擬機(jī)。
而 Docker 只是一個(gè)進(jìn)程,只需要將應(yīng)用以及相關(guān)的組件打包,在運(yùn)行時(shí)占用很少的資源,一臺(tái)機(jī)器可以開啟成千上萬個(gè) Docker。
鏡像與容器:
鏡像是一種靜態(tài)的結(jié)構(gòu),可以看成面向?qū)ο罄锩娴念?,而容器是鏡像的一個(gè)實(shí)例。
鏡像包含著容器運(yùn)行時(shí)所需要的代碼以及其它組件,它是一種分層結(jié)構(gòu),每一層都是只讀的(read-only layers)。構(gòu)建鏡像時(shí),會(huì)一層一層構(gòu)建,前一層是后一層的基礎(chǔ)。鏡像的這種分層存儲(chǔ)結(jié)構(gòu)很適合鏡像的復(fù)用以及定制。
構(gòu)建容器時(shí),通過在鏡像的基礎(chǔ)上添加一個(gè)可寫層(writable layer),用來保存著容器運(yùn)行過程中的修改。
優(yōu)缺點(diǎn):
1. 部署方便
你一定還有印象,在我們最開始學(xué)習(xí)編程的時(shí)候,搭建環(huán)境這一步往往會(huì)耗費(fèi)我們好幾個(gè)小時(shí)的時(shí)間,而且其中一個(gè)小問題可能需要找很久才能夠解決。你還會(huì)得到關(guān)于環(huán)境搭建方面的團(tuán)隊(duì)其他成員的求助。而有了容器之后,這些都變得非常容易,你的開發(fā)環(huán)境就只是一個(gè)或者幾個(gè)容器鏡像的地址,最多再需要一個(gè)控制部署流程的執(zhí)行腳本。或者進(jìn)一步將你的環(huán)境鏡像以及鏡像腳本放入一個(gè)git項(xiàng)目,發(fā)布到云端,需要的時(shí)候?qū)⑺奖镜鼐涂梢粤恕?/p>
# git clone https://github.com/my-project
# sh ./my-build-boot.sh
目前我們團(tuán)隊(duì)目前基本都是用這種方案搭建本地開發(fā)環(huán)境,而且整理成內(nèi)部技術(shù)文檔,慢慢沉淀成團(tuán)隊(duì)的財(cái)富了。
2. 部署安全
當(dāng)我們收到一個(gè)bug反饋的時(shí)候,很多時(shí)候心里面的第一反應(yīng)一定是“我本地是好的啊”!這種情況的發(fā)生就在于環(huán)境的不一致,我們?cè)陂_發(fā)過程中的調(diào)試往往不能保證其他環(huán)境的問題,但是我們卻要為此買單,這真是一件令人苦惱的事情。有了容器之后,這將很少發(fā)生。我們可以通過容器技術(shù)將開發(fā)環(huán)境和測(cè)試環(huán)境以及生產(chǎn)環(huán)境保持版本和依賴上的統(tǒng)一,保證代碼在一個(gè)高度統(tǒng)一的環(huán)境上執(zhí)行。而測(cè)試環(huán)境的統(tǒng)一,也同樣能解決CI流程對(duì)環(huán)境的要求。
分布式技術(shù)和擴(kuò)容需求日益增長(zhǎng)的今天,如果運(yùn)維能夠使用容器技術(shù)來進(jìn)行環(huán)境的部署,不僅僅在部署時(shí)間上節(jié)省不少,也能把很多因?yàn)槿斯づ渲铆h(huán)境產(chǎn)生的失誤降到最低。
3. 隔離性好
不管是開發(fā)還是生產(chǎn),往往我們一臺(tái)機(jī)器上可能需要跑多個(gè)服務(wù),而服務(wù)各自需要的依賴配置不盡相同,假如說兩個(gè)應(yīng)用需要使用同一個(gè)依賴,或者兩個(gè)應(yīng)用需要的依賴之間會(huì)有一些沖突,這個(gè)時(shí)候就很容易出現(xiàn)問題了。所以同一臺(tái)服務(wù)器上不同應(yīng)用提供的不同服務(wù),最好還是將其隔離起來。而容器在這方面有天生的優(yōu)勢(shì),每一個(gè)容器就是一個(gè)隔離的環(huán)境,你對(duì)容器內(nèi)部提供服務(wù)的要求,容器可以自依賴的全部提供。這種高內(nèi)聚的表現(xiàn)可以實(shí)現(xiàn)快速的分離有問題的服務(wù),在一些復(fù)雜系統(tǒng)中能實(shí)現(xiàn)快速排錯(cuò)和及時(shí)處理。(當(dāng)然需要說明的是,這個(gè)隔離性只是相對(duì)于服務(wù)器比較的,虛機(jī)技術(shù)要擁有更好的隔離性)
4. 快速回滾
容器之前的回滾機(jī)制,一般需要基于上個(gè)版本的應(yīng)用重新部署,且替換掉目前的問題版本。在最初的時(shí)代,可能是一套完整的開發(fā)到部署的流程,而執(zhí)行這一套流程往往需要很長(zhǎng)的時(shí)間。在基于git的環(huán)境中,可能是回退某個(gè)歷史提交,然后重新部署。這些跟容器技術(shù)相比都不夠快,而且可能會(huì)引起新的問題(因?yàn)槭腔谛掳姹镜男薷模6萜骷夹g(shù)天生帶有回滾屬性,因?yàn)槊總€(gè)歷史容器或者鏡像都會(huì)有保存,而替換一個(gè)容器或者某個(gè)歷史鏡像是非??焖俸秃?jiǎn)單的。
5. 成本低
這可能是一個(gè)最明顯和有用的優(yōu)點(diǎn)了,在容器出現(xiàn)之前,我們往往構(gòu)筑一個(gè)應(yīng)用就需要一臺(tái)新的服務(wù)器或者一臺(tái)虛機(jī)。服務(wù)器的購(gòu)置成本和運(yùn)維成本都很高,而虛機(jī)需要占用很多不必要的資源。相比之下,容器技術(shù)就小巧輕便的多,只需要給一個(gè)容器內(nèi)部構(gòu)建應(yīng)用需要的依賴就可以了,這也是容器技術(shù)發(fā)展迅速的最主要原因。
6. 管理成本更低
隨著容器技術(shù)的不斷普及和發(fā)展,隨之而來的容器管理和編排技術(shù)也同樣得到發(fā)展。諸如Docker Swarm,Kubernetes, Mesos等編排工具也在不斷的迭代更新,這讓容器技術(shù)在生產(chǎn)環(huán)境中擁有了更多的可能性和更大的發(fā)揮空間。而隨著大環(huán)境的發(fā)展,docker等容器的使用和學(xué)習(xí)的成本也是愈發(fā)降低,成為更多開發(fā)者和企業(yè)的選擇。
說了這么多的優(yōu)點(diǎn),容器也有一些問題是沒有解決的。上一代方案基本就是基于虛機(jī)技術(shù)的云方案,能有效增加服務(wù)器的使用效率,達(dá)到節(jié)省成本的目的,而容器技術(shù)在此基礎(chǔ)上更進(jìn)一步地優(yōu)化了資源的使用率。但是仍然有一些問題,是我們?cè)谶x擇服務(wù)資源架構(gòu)場(chǎng)景中需要考慮的:
1.隔離性
基于hypervisor的虛機(jī)技術(shù),在隔離性上比容器技術(shù)要更好,它們的系統(tǒng)硬件資源完全是虛擬化的,當(dāng)一臺(tái)虛機(jī)出現(xiàn)系統(tǒng)級(jí)別的問題,往往不會(huì)蔓延到同一宿主機(jī)上的其他虛機(jī)。但是容器就不一樣了,容器之間共享同一個(gè)操作系統(tǒng)內(nèi)核以及其他組件,所以在收到攻擊之類的情況發(fā)生時(shí),更容易通過底層操作系統(tǒng)影響到其他容器。當(dāng)然,這個(gè)問題可以通過在虛機(jī)中部署容器來解決,可是這樣又會(huì)引出新的問題,比如成本的增加以及下面要提到的問題:性能。
2. 性能
不管是虛機(jī)還是容器,都是運(yùn)用不同的技術(shù),對(duì)應(yīng)用本身進(jìn)行了一定程度的封裝和隔離,在降低應(yīng)用和應(yīng)用之間以及應(yīng)用和環(huán)境之間的耦合性上做了很多努力,但是隨機(jī)而來的,就會(huì)產(chǎn)生更多的網(wǎng)絡(luò)連接轉(zhuǎn)發(fā)以及數(shù)據(jù)交互,這在低并發(fā)系統(tǒng)上表現(xiàn)不會(huì)太明顯,而且往往不會(huì)成為一個(gè)應(yīng)用的瓶頸(可能會(huì)分散于不同的虛機(jī)或者服務(wù)器上),但是當(dāng)同一虛機(jī)或者服務(wù)器下面的容器需要更高并發(fā)量支撐的時(shí)候,也就是并發(fā)問題成為應(yīng)用瓶頸的時(shí)候,容器會(huì)將這個(gè)問題放大,所以,并不是所有的應(yīng)用場(chǎng)景都是適用于容器技術(shù)的。
3. 存儲(chǔ)方案
容器的誕生并不是為OS抽象服務(wù)的,這是它和虛機(jī)最大的區(qū)別,這樣的基因意味著容器天生是為應(yīng)用環(huán)境做更多的努力,容器的伸縮也是基于容器的這一disposable特性,而與之相對(duì)的,需要持久化存儲(chǔ)方案恰恰相反。這一點(diǎn)docker容器提供的解決方案是利用volume接口形成數(shù)據(jù)的映射和轉(zhuǎn)移,以實(shí)現(xiàn)數(shù)據(jù)持久化的目的。但是這樣同樣也會(huì)造成一部分資源的浪費(fèi)和更多交互的發(fā)生,不管是映射到宿主機(jī)上還是到網(wǎng)絡(luò)磁盤,都是退而求其次的解決方案。
隨著硬件技術(shù)和網(wǎng)絡(luò)技術(shù)的迭代發(fā)展,容器技術(shù)的缺點(diǎn)會(huì)變得越來越不那么明顯,而且隨著容器技術(shù)的發(fā)展和普及,對(duì)應(yīng)的解決方案也會(huì)越來越多。所以總體來看,docker等容器技術(shù)會(huì)朝著更加普及的趨勢(shì)走近我們技術(shù)領(lǐng)域。也希望每一位熱愛技術(shù)的小伙伴們能更加了解這些新技術(shù),讓它們能夠更好的為我們服務(wù)。
文章標(biāo)題:談一談Docker的優(yōu)缺點(diǎn)
網(wǎng)址分享:http://m.fisionsoft.com.cn/article/copdgjp.html


咨詢
建站咨詢
