Docker有什麼好處?

Docker背後的想法是建立軟件程序可移植的輕量容器,讓其能夠在任何安裝了Docker的機器上運行,而不用關心底層操做系統,相似船舶使用的集裝箱,野心勃勃的他們成功了。

Docker能夠解決虛擬機可以解決的問題,同時也可以解決虛擬機因爲資源要求太高而沒法解決的問題。Docker能處理的事情包括:

  • 隔離應用依賴
  • 建立應用鏡像並進行復制
  • 建立容易分發的即啓即用的應用
  • 容許實例簡單、快速地擴展
  • 測試應用並隨後銷燬它們

標準化應用發佈,docker容器包含了運行環境和可執行程序,能夠跨平臺和主機使用;
節約時間,快速部署和啓動,VM啓動通常是分鐘級,docker容器啓動是秒級;
方便構建基於SOA架構或微服務架構的系統,經過服務編排,更好的鬆耦合;
節約成本,之前一個虛擬機至少須要幾個G的磁盤空間,docker容器能夠減小到MB級;
方便持續集成,經過與代碼進行關聯使持續集成很是方便;
能夠做爲集羣系統的輕量主機或節點,在IaaS平臺上,已經出現了CaaS,經過容器替代原來的主機。

目前大型互聯網公司有騰訊、京東、美團、新浪、大衆點評等都在使用。好比說騰訊的蓋亞,基於docker部署管理,聽說已經有萬臺規模,用於大數據處理。美團主要是用於持續集成,自動構建方面,另外新浪也作了實踐。容器化是一個大趨勢,之後這方面的公司會愈來愈多。git


Docker提供功能普遍,這裏有幾個的例子:web

  • Images(鏡像):Docker能夠經過Pull和Push命令構建對象到服務中心docker

  • Containers(容器):Docker能夠經過Start/Stop命令管理容器的生命週期緩存

  • Logging(日誌):Docker能夠經過stdout,stderro捕獲輸出全部的容器內部信息服務器

  • Volumes(存儲):Docker能夠建立和管理容器的相關文件存儲網絡

  • Networking(網絡):Docker能夠建立管理虛擬的接口和內部全部容器之間的網絡橋接架構

  • RPC:Docker服務器提供容許外部程序去控制全部容器的行爲的API分佈式

鏡像管理

鏡像是Docker管理最基礎的部分,同時也是Docker最大的亮點。鏡像管理涉及到鏡像的製做、更新、存儲、分發、權限等多個方面。微服務

鏡像製做方面,應該堅持三個原則,第一是堅持鏡像老是從Dockerfile生成。這樣作最大的好處是能夠經過Dockerfile「閱讀」鏡像,在後續的協做、升級維護等方面會帶來巨大的便利。第二是鏡像之間應該避免依賴過深,建議爲三層,這三層分別是基礎的操做系統鏡像、中間件鏡像和應用鏡像。第三是堅持全部鏡像都應該有對應的Git倉庫,以方便後續的更新。性能

鏡像的更新須要一個自動化的流程,這能夠經過SCM和CI系統自動觸發實現。具體的流程以下圖所示。開發者首先將代碼和Dockerfile提交到Git倉庫,而後Git經過webhook方式觸發Jenkins的主動獲取代碼和Dockerfile文件,Jenkins再經過Docker相關的插件生成鏡像並推送鏡像到私有的Registry。這樣,在服務器上就能夠經過拉取新的鏡像部署容器。

關於Registry,可能會涉及三方面的問題,一個是單點問題,對應的解決方案能夠考慮DRBD、分佈式存儲以及雲存儲。二是Regitry的性能問題,目前可用的解決方案是經過HTTP反向代理緩存來加速Layer的下載。三是Registry用戶權限,Nginx LUA能夠提供一個簡單快速的實現方案。

發佈管理

和傳統的發佈流程相比,Docker最大的好處是不須要考慮外部依賴,利用容器的自包含的特色,咱們能夠將發佈回滾流程標準化和產品化。而傳統的發佈和回滾,須要casebycase去針對不一樣應用作升級回滾的方案。要作到基於Docker的發佈,鏡像的生成必須堅持自動化,不然會發現升級比傳統的方法更麻煩。所以在現實中咱們也發現不少企業將代碼目錄放到主機目錄映射到容器內,這樣作破壞了Docker的自包含特性,解決的辦法是堅持應用鏡像更新自動化。

發佈管理

和傳統的發佈流程相比,Docker最大的好處是不須要考慮外部依賴,利用容器的自包含的特色,咱們能夠將發佈回滾流程標準化和產品化。而傳統的發佈和回滾,須要casebycase去針對不一樣應用作升級回滾的方案。要作到基於Docker的發佈,鏡像的生成必須堅持自動化,不然會發現升級比傳統的方法更麻煩。所以在現實中咱們也發現不少企業將代碼目錄放到主機目錄映射到容器內,這樣作破壞了Docker的自包含特性,解決的辦法是堅持應用鏡像更新自動化。

日誌管理

因爲容器是無狀態的,因此存儲在容器內的日誌會隨着容器的銷燬而消失。stdout/stderr類型的日誌,可經過logspout轉發到syslog中心來收集。打印到文件的支持,好比accesslog,須要將日誌存儲到外部的Volume,並在Docker主機上使用logstash收集轉發。

配置管理

容器裏沒有CM agent,沒法接收CM指令。CM運行到Host上也沒法管理容器中的文件,若是手工修改容器內的配置,那新建立的容器仍然是舊的。配置大致上分爲兩種類型,一種是服務之間的鏈接信息,這種配置建議考慮使用服務發現系統,也可使用一些更加傳統的方法,好比經過環境變量來協調做開發和生產環境的配置差別。一種是通常的配置文件參數,配置文件和Dockerfile應該一塊兒存儲到一個Git倉庫,修改後自動build更新鏡像。

網絡管理

目前Docker支持的網絡包括Host網絡、NAT網絡、物理網橋和網絡虛擬化。Host網絡中容器和主機共享網絡命名空間,不一樣容器須要作好端口規劃,防止端口衝突。Nat網絡是基於四層代理以及NAT技術,依賴portmap,進出都須要轉發,性能低,主機上須要作好端口規劃,容易搞混。物理網橋方案,和傳統虛擬機的網橋沒有區別,適合容器數量有限且相對靜止的場景。網絡虛擬化是基於隧道的overlay網絡,目前開源方案有SocketPlane、Weave、Flannel,適合數量大,動態建立銷燬容器的場景。

相關文章
相關標籤/搜索