我們究竟要用Docker做什麼

轉自:http://www.tuicool.com/articles/YZZVfu


1.摘要

前一陣微博風風火火的用大規模docker集羣扛過了春節峯值。最近跟不少人聊起接下來要做什麼,總是有一種能做的很多,但是能做的又很少的感覺。想了一下原因,感覺還是對docker、docker的生態系統、應用和集羣沒有劃清楚的界限,docker並不是很多問題的最終解決方案,只是解決方案中的一環而已。

2.容器化與輕量

一談起docker總是會在各種地方看到輕量這個詞,甚至會有一種通過docker啓動一個服務會節省很多資源的錯覺。

但是docker總歸不是一個資源優化技術,所謂“輕”也只是相對於傳統虛擬機而已。

相對於傳統的虛擬技術,docker提供的容器化方案優勢在於:

  1. 虛擬化額外的資源佔用更少了
  2. 部署、啓動和銷燬的時間更短了
  3. 部署、啓動和銷燬的工作量更少了

但相對於不使用容器化方案來說:

  1. 佔用的資源更多了(可以忽略)
  2. 啓動、銷燬的時間增加了(可以忽略)
  3. 部署的時間和工作量變少了

也就是說,相對於不使用容器化的方案,docker在效率方面主要的貢獻是可以在不增加性能消耗的情況下,降低部署服務的工作量,提高部署效率。

3.虛擬化與隔離

這裏先拋掉神乎其神的docker,考慮一下傳統的虛擬化技術。傳統的虛擬化技術在犧牲了性能之後換來了什麼?最大收益大概是更好的隔離性。

隔離了什麼?用到最多的有四類:

  • cpu:不同虛擬機的計算資源不混用
  • 內存:不同虛擬機的內存不共享
  • 網絡:每個虛擬機有自己的網絡棧
  • 文件系統:每個虛擬機獨享自己的文件系統

傳統的虛擬化消耗了一些系統資源,換來了對cpu、內存、網絡和文件系統的隔離。換句話說,一個服務不會影響另一個服務的資源。

於是自然的會想到,一個服務的依賴可以做成一套隨着服務一起發佈的文件系統,用時加載、停時棄置;也可以把需要不同資源的服務可以部署在一起以節約成本,等等,隔離給了虛擬化真正的價值。

4.微服務與彈性調度

接下來的問題是,怎麼更大限度的提高資源的利用率。

又是顯而易見的,要提高資源利用率,就得降低資源的浪費,而浪費來源於兩方面:服務自身和依賴環境對資源的浪費、服務沒有利用到的空閒資源。

一般來說,一個服務內聚越高,對資源的浪費就越少(全人類腦後插管連到母體大概是最省資源的吧……),但現實情況下資源被拆分成一臺臺計算機,服務也要跟着拆分。當服務的拆分不能保證和資源拆分相同的粒度時,空閒資源就產生了。

服務拆分的粒度越粗,與資源不匹配的矛盾會越激烈;拆分粒度越細,帶來的資源浪費也就越多。另一方面,服務內聚提高會帶來更高的更高的耦合度和風險,反之會帶來更高的部署和維護成本,等等。

所以服務拆到多細這件事本身沒有定論,docker能做到的只是降低其中一兩個砝碼的權重而已。

5.集羣管理與服務發現

在一個資源上啓動了服務之後,接下來的問題是:啓動了這個服務有什麼用?因爲在啓動服務之後,服務只是“可用”的,並沒有提高資源的利用率。

於是需要有一種機制,讓可用的服務變成被使用的服務,有很多方法可以實現,比如通過配置文件指定訪問的ip和端口,大部分場景下,手工配置的方式已經足夠了。

但是伴隨着系統越來越複雜,配置也越來越負責,漸漸的手工配置已經有些喫力了。

而伴隨着虛擬化和容器化,配置的修改也越來越頻繁和複雜,甚至已經超過了啓動服務本身的難度。單純啓動一個服務沒有意義,需要通過一個足夠可靠和高效的機制把“可用”的服務變成“被用”的服務,服務發現擔當了這個任務。

6.docker與生態系統

那麼,總結一下docker本身帶來了什麼:

  • 更高效的服務部署、啓動方式。
  • 對cpu、內存、網絡和文件系統的簡單隔離。

由於docker本身帶來了這兩點好處,通過docker和相關的生態系統,可以更簡單的實現:

  • 系統監控和管理對象由“機器”改爲抽象的“資源”
  • 基於對資源的抽象,提供更靈活的服務部署、調度機制

而docker能做也僅僅是調整天平中衆多砝碼中的幾個而已。更高效的集羣管理、更高的資源利用率是目的,docker的生態系統、服務發現和微服務等都是手段,與其糾結於我們要用docker做什麼,不如拆分成兩個問題:我們要做什麼,docker能幫我們做什麼。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章