近年來,Docker在IT界可謂風光十足,各大技術論壇上賺足了眼球,公司內外也有至關多的介紹和嘗試,看上去如此高大上的技術,貌似會給雲、服務部署、運維等領域帶來顛覆性的創新。mysql
近期查閱了一些文檔,較深刻的瞭解Docker的技術細節,發現Docker確實在解決部分需求時恰到好處,但也絕對不是無所不能的萬金油。linux
1、什麼是Dockersql
官方定義:docker
Develop, Ship and Run Any Application, Anywhereubuntu
Docker is a platform for developers and sysadmins to develop, ship, and run applications. Docker lets you quickly assemble applications from components and eliminates the friction that can come when shipping code. Docker lets you get your code tested and deployed into production as fast as possible.windows
解讀:網絡
官方把Docker定義爲應用打包、部署的平臺,而不是虛擬化技術;架構
Docker自己並無革命性的創新,其核心是Container,Container是不少年前就提出來的理念,而且在Linux、Unix、 FreeBSD上都有技術實現,Linux成熟的方案是lxc;app
Docker是一個基於lxc(linux container),以及cgroup的上層工具,經過對lxc,cgroup及相關係統命令的封裝,使得用戶能夠很是方便的使用Linux Container;框架
Docker Hub提供了應用包的版本管理和分發能力;
2、Docker的價值及同類技術對比
Container的核心價值在於隔離性和封裝性,在這兩方面也有較多相似解決方案,簡單分析和對比一下:
1. 隔離性
Docker的隔離性是經過Container來實現的,而且是基於Lxc;與此相對應的另一個解決方案是虛擬化;二者對好比下:
優勢:
很是輕量
與建立或啓動一個虛擬機相比,Container能夠認爲沒啥開銷,約等於Linux下建立一個進程;
有個誇張的說法:單機能夠輕易的啓動多達上千個Container,但基本不太可能啓動上千個虛擬機;
但這比較的前提是須要在單機上隔離1000個應用;若是隻需隔離兩個應用,每一個應用運行500個進程的話,對比應該是兩個Container與兩個VM;
缺點:
隔離層次高
docker在Linux kernel之上進行隔離,確切的講是進程間的隔離,這就決定了:
1)Docker只支持64位Linux,必然不支持windows, unix, bsd...,而虛擬化可支持全部主流操做系統;
2)Docker隔離在kernel之上,而且自己依賴於kernel的特性,因此只能模擬出高版本的Linux發行版;必然找不到ubuntu 9.04這樣的image;
3) Container使用的Kernel與主機的Kernel是一致的,沒法定製Container的內核;
硬件資源度量和配額能力
經過cgroup,Docker具有必定的能力控制Container的資源使用,但在網絡、磁盤、CPU的使用上,度量和隔離能力尚未VM成熟;
此外,從用戶角度來看,VM能夠作到很是透明,能夠直接理解爲一臺主機;但Container在網絡鏈接、數據存儲方面都須要通過特殊處理;
因此,與虛擬化相比,從隔離性上看,Docker的優點在於性能損耗低,劣勢在於隔離層次比較高;
若是你的需求在是單機上進行儘量多的隔離,那Docker是首選;
若是你的需求是儘量完全的隔離,對硬件資源精準控制且可度量,同時對隔離份數要求很少的話,那虛擬化是首選;
2. 封裝性
從Docker的Logo以及官方的定義來看,它的主要能力並不在隔離性,而在於封裝性,也就是應用的打包、部署、運行;
在封裝方面的優點,主要體如今:
封裝大小
與VM相比,Docker的image確實很小,官方的Centos image大概只有220M(被精減成最基本的Centos了,連ifconfig命令都沒有,安裝完經常使用工具,你會發現也不小了);
可對應用高度定製和封裝
可經過Dockerfile定義應用包,Image內的部署可高度定製和封裝,對外接口收斂且清晰;使用者無需關注細節;
Image倉庫及版本管理
很是成熟的公共和私有倉庫搭建和使用,以及版本管理,並可通地倉庫很容易的進行共享、分發、部署;
應用和運行分離
咱們所看到的Image是靜止的,只讀的;將image運行起來後是Container了,在運行時的修改,隻影響當前Container,不影響Image;
從上面能夠看出,與VM Image的部署能力相比,Docker設計理念先進,優點明顯,並且幾乎沒有啥缺點。
但從封裝部署角度來看,Docker的競品應該不是VM,而是RPM+YUM,DEB+APT這樣的組合。
你會發現,與這兩組合相比,能力出奇的類似了,但仍是有些區別:
封裝能力:
Docker的Image,能夠輕易實如今Centos上面跑Ubuntu,並且很是輕量,這個是Rpm,Deb不具有的;
這個在一些測試、學習、或小規模的Paas場景下,是很是有價值的;
但任何較大規模的應用,我想不太可能出現這樣的部署;
封裝粒度及依賴管理:
Docker自kernel之上,全打包在一塊了,裏面包含了Linux用戶環境、系統類庫、應用程序;能夠理解爲,一個Docker Image的外部依賴只有Linux Kernel了;從另一方面看,極大提高了移植能力;
Rpm、Deb的打包粒度比Docker更細,只打包單個應用自身,外部依賴經過只記錄並不存儲在包內,經過apt,yum這樣的輔助工具也很是容易解決外部依賴;這樣作的好處在於更輕量,理論上包大小確定小於Docker;在大規模業務部署下,上千臺設備發佈20M的RPM,與發佈200M的Docker image,效率上的差距應該仍是比較大的;
實際應用當中,在解決外部依賴問題上,C/C++程序還能夠簡單的經過靜態連接來實現;Java/PHP/GoLang這類程序基本不存在系統類庫的依賴,跨平臺的能力也賽過Docker自己;
跨平臺:
在各大Linux發行版下,你均可以按相同的方式使用Docker來管理打包及部署;但Rpm,Deb都有本身的粉絲和發行版本,在發行版間不通用;
但Docker自身的學習和部署成本,要高於Rpm,Deb;
因此,從封裝性看,Docker遠勝於VM,與Rpm+Yum&Deb+Apt能力至關,從用戶角度來看是多了一個選擇;
拋開隔離性,假設你須要在單機上運行一個MySQL,你是但願安裝Docker、再用Docker來部署MySQL?仍是直接yum install mysql?
綜合來看,Docker的核心價值就在於隔離性和封裝性,並在二者間有個很好的平衡和兼顧,可預見的是在小規模的Paas領域是最好的解決方案。
3、Docker在公司內應用的思考
前面講到Docker的核心價值在於隔離性和封裝性,討論Docker在公司內業務的應用也應該從這兩個方面來看。
哪些場景能夠用到隔離性:
研發測試流程,單機多版本並行部署和運行;
公司內部的類Paas服務,好比TDW計算、藍鯨;
海量服務的正式環境,基本單個服務就能跑滿單機,能夠說徹底沒有隔離性需求;
哪些場景用到封裝性:
公司全部業務都須要打包部署,但各大業務都已經有很是成熟的包發佈系統;整合研發、編譯、測試、發佈以及架構、配置、路由等各方面的能力;推倒現有包發佈系統,基於Docker重構的話,開發和用戶學習成本至關高,但技術上並無明顯價值。
若是是全新開發的技術框架和運維體系的話,Docker會是一個較好的選擇,但我的更傾向於Centos+Yum+RPM的組合。
4、其它
IT技術突飛猛進,新技術和組件層出不窮,相似Docker之類的使用勢必要求基礎運營環境與業界保持同步更新。
爲了能保持與業界同步,技術團隊仍需花費巨大精力投入到無任何業務產出的工做當中。
免費領取兄弟連IT教育原創linux運維工程師視頻/細說linux教程,詳情諮詢官網客服:http://www.lampbrother.net/linux/
或者勾搭Q2430675018
歡迎加入linux交流羣 478068715