天天看點

Docker的優缺點

Docker解決的問題

由于不同的機器有不同的作業系統,以及不同的庫群組件,将一個應用程式部署到多台機器上需要進行大量的環境配置操作。(例如經常出現的類似"在我的機器上就沒問題"這樣的情況)

Docker主要解決環境配置問題,它是一種虛拟化技術,對程序進行隔離,被隔離的程序獨立于宿主作業系統和其它隔離的程序。使用Docker可以不修改應用程式代碼,不需要開發人員

學習特定環境下的技術,就能夠将現有的應用部署到其它機器上,進而實作一次打包,多次部署的目的。

Docker的優缺點

與虛拟機的比較

虛拟機也是一種虛拟化技術,它與Docker最大的差別在于它是通過模拟硬體,并在硬體上安裝作業系統來實作。

Docker的優缺點

啟動速度

啟動虛拟機需要先啟動虛拟機的作業系統,再啟動應用,這個過程非常慢。

啟動Docker相當于啟動主控端作業系統上的一個程序,為秒級别。

占用資源

虛拟機是一個完整的作業系統,需要占用大量的磁盤空間、記憶體和CPU資源;

Docker隻是一個程序,隻需要将應用及相關的元件打包,在運作時占用很少的資源,一台機器上可以開啟成千上萬個Docker。

鏡像與容器

鏡像是一種靜态的結構,可以了解為是容器的源代碼,也可以看作是面向對象中的類,而容器是鏡像(類)的一個執行個體。

鏡像包含着容器運作時所需要的代碼及其它元件,它是一種分層結構,每次層都是隻讀的(Read-only layers)。建構鏡像時,會一層層建構,前一層是後一層的基礎,鏡像的這種分層

結構很适合鏡像的複用及定制。建構容器時,通過在鏡像的基礎上添加一個可寫層,用來儲存着容器運作過程中的修改。

Docker的優缺點

優點:

1.部署友善

在我們最開始學習程式設計的時候,搭建環境這一步往往要耗費我們很長時間,其中一個小問題也有可能需要很長時間去解決。而有了容器之後,這些都變得非常容易,我們的開發環境就隻

是一個或者幾個容器鏡像的位址,最多在再需要一個控制部署流程的執行腳本,或者進一步将你的環境鏡像以及鏡像腳本放入一個Git項目釋出到雲端,需要的時候将它拉取到本地即可。

# git clone https://github.com/my-project

# sh ./my-build-boot.sh      

2.部署安全

當我們收到一個bug回報的時候,很多時候心裡的第一反應都是"在我本地就是好的啊,是不是你環境有問題?"這種情況的發生就在于本地環境的不一緻(也既我們常說的異構),我們在開發環境中調試往往不

能保證其它環境的問題,但卻要為此買單,有了容器之後,各個環節采用統一标準(環境),這種情況将很少發生。我們可以通過容器技術将開發環境和測試環境以及生産環境保持版本和

依賴上的統一,保證我們的代碼在一個高度統一的标準上執行,而測試環境的同意,也同樣能解決CI(持續內建)流程對環境的要求。

在分布式技術和擴容需求日益增長的今天,如果運維能夠通過容器技術來進行環境的統一部署,不僅在部署的時間上節省不少,也能把很多人工配置環境過程中産生的失誤降到最低。

3.隔離性好

不管是開發還是生産,往往我們一台機器上可能要跑多個服務,而服務各自依賴的配置又不盡相同,假如說兩個應用需要使用同一依賴,或者兩個應用需要的依賴之間有一些沖突,這個

時候就很容易出現問題,是以同一台伺服器上不同應用提供的不同服務,最好還是将其隔離起來,而容器在這一方面就有其天然的優勢,每一個容器就是一個隔離的環境,容器内部所提

供的服務對環境依賴的要求,容器可以自内部全部提供,這種高内聚的表現可以快速分離有問題的服務,在一些複雜應用系統中能夠實作快速拍錯和即時處理。

4.快速復原

容器之前的復原機制,一般要基于上個版本的應用重新部署,且替換掉目前有問題的版本,在最初的時代,可能是一套完成的從開發到部署的流程,而執行這一套流程往往需要花費很長

時間,在基于Git的環境中,可能是回退某個曆史送出,然後重新部署,這些跟容器相比,都不夠快,而且可能會産生新的問題。而容器技術天生帶有復原特性,因為每個曆史容器或者鏡

像都會儲存,而替換某個容器或者鏡像是非常快速和簡單的。

5.成本低

這可能是一個最明顯和有用的優點了,在容器出現之前,我們往往會因為構築一個服務,就要提供一台伺服器或者一台虛拟機,伺服器的購置成本和運維成本都比較高,而虛拟機所占用

的資源又相對較高,相比之下,容器就小巧輕便的多,隻需要給一個容器内部建構應用所需的依賴就可以了,這也是容器技術發展如此迅速的最主要原因。

6.管理成本低

随着容器技術的不斷普及和發展,随之而來的容器管理和編排技術也同樣得到發展,諸如Docker Swarm,K8S,Mesos等容器編排工具也在不停的疊代更新,這讓容器技術在生産環境中擁

有了更大的可能性和更多的發揮空間,随着大環境的發展,docker等容器的使用和學習成本也越來越低,成為更多開發者和企業的選擇。

缺點:

1.隔離性

基于hypervisor的虛拟技術,在隔離性上比容器技術要好,它們的系統硬體資源完全上虛拟化的,當一台虛拟機出現系統級别的問題,往往不會蔓延到同一主控端上的其它虛拟機上,但是

容器就不一樣了,容器之間共享同一個作業系統核心及其它元件,是以在受到諸如黑客攻擊這種情況的時候,很容易通過底層作業系統影響的其它容器,甚至逐個擊破,産生連鎖反應,當

然,這個問題可以通過部署容器來解決,但随之又會産生新的問題,比如成本增加以及性能問題。

2.性能

不管是虛拟機還是容器,都是運用不同的技術對應用本身進行了一定程度的封裝與隔離,在降低應用和應用之間以及應用和環境之間的耦合性上做了很多努力,但是随之而來的,就會産生

更過的網絡連接配接轉發和資料互動,這在低并發系統上雖然不會很明顯,但是當同一虛拟機或者伺服器下面的容器需要更高并發量支撐的時候,也就是并發問題成為系統瓶頸的時候,容器會

将這個問題放大,是以,并不是所有的場景都适合容器技術。

3.存儲方案

容器的誕生并不是為OS抽象服務的,這是它和虛拟機最大的差別,這樣的基因意味着容器天生是為應用環境做更多的努力,容器的伸縮也是基于容器的這一特性,而與之相對的,需要持久

化存儲方案恰恰相反,在資料存儲這一點上Docker容器提供的解決方案是利用volume接口(存儲卷)形成資料的映射和轉移,以實作資料持久化的目的。但是這樣同樣也會造成一部分資源的

浪費和更多的互動,不管是映射到主控端上還是網絡磁盤,都是退而求其次的解決方案。

參考連結:https://cloud.tencent.com/developer/article/1457282