Docker有什么好處?


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

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

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

標准化應用發布,docker容器包含了運行環境和可執行程序,可以跨平台和主機使用;
節約時間,快速部署和啟動,VM啟動一般是分鍾級,docker容器啟動是秒級;
方便構建基於SOA架構或微服務架構的系統,通過服務編排,更好的松耦合;
節約成本,以前一個虛擬機至少需要幾個G的磁盤空間,docker容器可以減少到MB級;
方便持續集成,通過與代碼進行關聯使持續集成非常方便;
可以作為集群系統的輕量主機或節點,在IaaS平台上,已經出現了CaaS,通過容器替代原來的主機。

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


Docker提供功能廣泛,這里有幾個的例子:

  • Images(鏡像):Docker可以通過Pull和Push命令構建對象到服務中心

  • 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,適合數量大,動態創建銷毀容器的場景。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM