天天看點

《循序漸進學Docker》——第一部分 Part 1 基礎篇 第1章 全面認識Docker 1.1 Docker是什麼

本節書摘來自華章出版社《循序漸進學docker》一書中的第1章,第1.1節,作者李金榜 尹烨 劉天斯 陳純,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

第1章 全面認識docker

第2章 初步體驗docker

第3章 ubuntu下使用docker

第4章 docker的基礎知識

歡迎來到docker的世界。

docker,golang社群殺手級的應用,是github上最活躍的項目之一,也是開源社群最受歡迎的項目。

docker,号稱要成為所有雲應用的基石,并把網際網路更新到下一代。

開發、測試、運維人員看到docker,都激動地說:“太好了,這正是我所需要的!”

docker是什麼,能解決什麼問題,為什麼這麼火?本章将一一道來。

首先,我們了解下docker産生的曆史背景和目前發展情況,通過和一些熟悉的事物做類比,讓大家對docker有一個初步認識和了解。

docker是dotcloud公司開源的一款産品。dotcloud公司是2010年新成立的一家公司,主要基于paas(platform as a service,平台即服務)平台為開發者提供服務。在paas平台下,所有的服務環境已經預先配置好了,開發者隻需要選擇服務類型、上傳代碼就可對外服務,不需要花費大量的時間搭建服務和配置環境。dotcloud的paas平台已經做得足夠好了,它支援幾乎所有主流的web程式設計語言和資料庫,可以讓開發者随心所欲地選擇自己需要的程式設計語言、資料庫和程式設計架構,而且它的設定非常簡單,每次編碼後隻需要運作一條指令就能把整個網站部署上去;并且利用多層次平台的概念,理論上,它的應用可以運作在各種類型的雲服務上。兩三年下來,雖然dotcloud也在業界獲得不錯的口碑,但由于整個paas市場還處于培育階段,dotcloud公司表現得不溫不火,沒有出現爆發性的增長。

2013年,dotcloud的ceo solomon hykes決定把dotcloud内部使用的container容器技術單獨拿出來開源。2013年3月釋出docker的v0.1版本,并且基本保持每月一個版本的疊代速度,到了8月,docker已經足夠火爆,并廣受好評,各種各樣的技術論壇和技術峰會都開始熱烈讨論與推薦docker,這時docker才隻釋出到v0.6版本。

随着docker的流行,越來越多的優秀開發者加入docker社群參加開發。這裡值得一提的是,docker是基于linux3.8以上核心,在aufs分層檔案系統下建構的,主要運作在ubuntu的系統下。rehl/centos當時最新版6系列還是基于liunux2.6.32核心,無法運作docker。為了讓rehl/centos盡快支援docker,redhat公司的工程師親自出馬,加班加點為docker貢獻代碼,新增對devicemapper的支援來實作檔案系統分層,終于順利地讓docker在rehl/centos運作起來。

随着docker在業界的知名度越來越高,到了2013年10月,dotcloud公司索性更名為docker股份有限公司,工作的重心也從paas平台業務轉向全面圍繞docker來開發。到了2014年1月,docker公司宣布完成15?000萬美元的融資,雅虎聯合創始人楊緻遠也參與跟投。

雖然docker遲遲沒有釋出1.0版,但好多公司已紛紛把docker應用到生産環境。其中,美國奢飾品電商gilt的cto說:“使用docker以後,突然之間,傳統方式中的各種問題都消失了,我們接下來要考慮如何進一步提高軟體生産效率,讓軟體開發更加安全和創新。這種轉變太不可思議了!”

千呼萬喚,到了2014年6月9日,docker終于釋出了v1.0版,并舉辦了dockercon 2014大會,大會上來自google、ibm、redhat、rackspace等公司的核心人物均發表了主題演講,紛紛表示支援并加入docker的陣營。docker的cto solomon hykes充滿雄心壯志地說:“我們能把網際網路更新到下一代!”google的基礎架構部副總裁eric brewer也附和道:“容器技術曾是google的基礎,我們和docker聯手,把容器技術打造為所有雲應用的基石。”

google自2004年就開始使用容器技術,目前他們每周要啟動超過20億個容器,每秒鐘新啟動的容器就超過3000個,在容器技術方面有大量的積累。曾相繼開源了cgroup和imctfy這兩個重量級項目。google對docker的支援力度非常大,不僅把imctfy先進之處融入docker中,還把自己的容器管理系統(kubernetes)也開源出來。

2014年8月,不缺錢的docker再次融資,融資超4千萬美元,估值達到4億美元。

所有的雲計算大公司,如azure、google和亞馬遜等都在支援docker技術,這實際上也讓docker成為雲計算領域的一大重要組成部分。

2014年10月15日,azure副總裁jason zander宣布了微軟與docker的合作夥伴關系;2014年11月5日,google釋出支援docker的産品dockergoogle container engine;2014年11月13日,amazon釋出支援docker的産品aws container service。至此,幾個重要的雲計算大公司都已經支援docker技術,這不僅讓docker成為雲計算領域的一個重要級成員,也讓docker成為雲應用部署的事實上的标準。

2014年12月,docker釋出了docker叢集管理工具machine和swarm,标志着docker開始突破一個标準的容器架構,打造屬于docker自己的叢集平台和生态圈。

2015年4月,docker公司宣布完成了9500萬美元的d輪融資。

2015年10月,docker收購tutum,tutum本身已經實作對亞馬遜網絡服務

(aws)、digital ocean、微軟的azure等主流雲服務商的良好支援。

2016年1月,docker官方計劃全面支援自身的alpine linux,使用它建構的基礎鏡像最小隻有5m。

截至2016年3月,docker在github上收獲29?962個關注(star)、8437個拷貝(fork),在github所有項目中排第7位,在雲平台管理領域排名第一,遠遠超openstack項目的1316個關注、768個拷貝。

docker從誕生到現在,短短兩年時間,已經成為開源社群最火爆的項目,風頭已經遠遠蓋過了近年來很流行的puppet和openstack。那麼docker的火爆到底是一種炒作、一種跟風,還是它确實名副其實、衆望所歸呢?

要回答這個問題,首先看看目前我們所處的環境和面臨的問題。

随着計算機近幾十年的蓬勃發展,産生了大量優秀系統和軟體。比如:

作業系統,如rehl/centos、debian/unbuntu、freebsd、opensuse等。

程式設計語言,如java、c/c++、python、ruby、golang等。

web伺服器,如apache、nginx、lighttpd等。

資料庫,如mysqld、redis、mongodb等。

現在的軟體開發人員真是幸運,可以在這麼多種類中自由選擇。自由選擇的結果是,維護一個非常龐大的開發、測試和生産環境,開發、測試和運維人員都被種類繁多的環境折騰得筋疲力盡,不得不收縮戰線,每種類型的軟體隻選擇一兩種來支援。許多優秀的開發架構和軟體盡管有不少優秀特性,但因為維護麻煩,便沒有了用武之地。

即便每種類型的軟體隻選擇一兩種來支援,随着作業系統和軟體版本的更新疊代,維護工作還是變得越來越龐大。

面對這種情況,業界大牛群策群力,給出了很多解決方案,比較有代表的是puppet和openstack。

puppet是集中的配置管理系統,它把檔案、使用者、cron任務、軟體包、系統服務等抽象為資源,并通過自有的語言描述資源間的依賴關系,集中管理各類資源的安裝配置。puppet主要适用于需要大批量部署相同服務的應用場景。

openstack是開源的雲計算管理平台項目,可以幫助企業内部實作類似于amazon ec2的雲基礎架構服務。雖然靈活,但元件繁多、建構複雜,比較适合中大型企業使用。

puppet和openstack雖然比較流行,但适應的場景有限,不具備通用性。正當大家在衆多方案中左右為難時,docker出現了,它作為一個開源的應用容器引擎,讓開發者可以打包他們的應用及依賴環境到一個可移植的容器中,然後釋出到任何運作有docker引擎的機器上。它集版本控制、克隆繼承、環境隔離等特性于一身,提出一整套軟體建構、部署和維護的解決方案,可以非常友善地幫助開發人員,讓大家可以随心所欲地使用軟體而又不會深陷到環境配置中。

這隻是docker的一個應用場景而已,docker還能幹更多的事情。

作為計算機的從業人員,下面場景你或許碰到過。

小a是一名資深碼農,作為新招聘實習生的導師,小a要給實習生的開發機裝一套和自己開發機一樣的運作環境,不僅要安裝nginx、java、mysqld和一些依賴庫等,還要修改相關的配置檔案。結果花了一天時間,小a也沒把實習生的開發環境搞定,在徒弟面前顔面盡失,尴尬不已。

小b是一名qa測試工程師,他按開發給的文檔、部署的服務,測試出一大堆問題,通過和開發的溝通,發現是開發和測試環境不一緻引起的。

小c作為一名業務運維工程師,同時維護開發、測試、生産三套環境,經常在不同環境下裝相同的包,做大量重複工作。

小d同時在為三個項目開發功能子產品,他要不停地修改他的開發環境為适應在三個項目間開發、聯調測試。

小e發現伺服器被入侵過,他想知道什麼檔案被篡改過。

小f從離職同僚那裡接手一個系統,文檔不全,突然一台機器硬體故障,他不知道該如何重新部署這個應用。

小g新上線一個遊戲,遊戲火爆超預期,需要緊急擴容,花了一兩個小時才完成擴容,期間使用者體驗很卡,流失不少潛在使用者。

小h和小i共同維護一套系統,分工輪流值夜班,但一出現突發故障,排查問題時,即便半夜,還需要把對方叫醒,确認下對方在前一天有沒有變更過什麼配置。

小m的一個機房要裁撤了,該機房的數千個應用都要遷移到其他機房,小m覺得這項工作非常龐大,半年時間都未必能完成。

但是如果使用docker,這些根本不算事兒,分分鐘就能搞定。

docker的解決方案簡單、靈活、高效,還很直覺,甚至不需要過多地改變現有的使用習慣,就可以和已有的工具,如puppet、openstack等配合使用。

各種優勢讓docker脫穎而出,有鶴立雞群的感覺,docker的火爆也就不難了解了。

按照官方的說法,docker是一個開源的應用容器引擎。很多人覺得這個說法太抽象,不容易了解。

那我們就從最熟悉的事物說起吧,但凡從事過計算機相關行業的人,對java、android和github都很熟悉。

先說java,在java之前的程式設計語言,像c/c++,是嚴重依賴平台的,在不同平台下,需要重新編譯才能運作。java的一個非常重要的特性就是與平台無關性,而使用java虛拟機是實作這一特性的關鍵。java虛拟機屏蔽了與具體平台相關的資訊,使得java語言編譯程式隻需生成可以在java虛拟機上運作的目标代碼(位元組碼),就可以在多種平台上不加修改地運作。java虛拟機在執行位元組碼時,把位元組碼解釋成具體平台上的機器指令執行。

軟體部署也依賴平台,ubuntu的軟體包在centos下可能就運作不起來。和java虛拟機類似,docker使用容器引擎解決平台依賴問題,它在每台主控端上都啟動一個docker的守護程序,守護程序屏蔽了與具體平台相關的資訊,對上層應用提供統一的接口。這樣,docker化的應用,就可以在多個平台下運作,docker會針對不同的平台,解析給不同平台下的執行驅動、存儲驅動和網絡驅動去執行。

java曾提出“write once,run anywhere”,而docker則提出了“build once,run anywhere,conf?igure once,run anything”。雖然,java和docker是為了解決不同領域的問題,但在平台移植方面卻面臨相同的問題,使用的解決方式也相似。

提起android,大家想到什麼?它是一個開源的手機作業系統,也是一個生态圈,它的app應用以apk形式打包、釋出,可以運作在任何廠商的android手機上。它還有一個官方的安卓市場,提供各種各樣的app,我們需要某個app時,就從安卓市場上搜尋下載下傳,手機開發者也可以編寫一些app,釋出到安卓市場,提供給别人使用,android也允許在第三方的安卓市場上下載下傳或上傳應用。

如果把軟體部署的應用看作android的app,docker簡直和android一模一樣,docker是一個開源的容器引擎,也有自己的生态圈,它的應用以鏡像(image)的形式釋出,可以運作在任何裝有docker引擎的作業系統上。它有一個官方的鏡像倉庫,提供各種各樣的應用,當需要某個應用時,就從官方的倉庫搜尋并下載下傳,個人開發者也可以送出鏡像到官方倉庫,分享給别人使用。docker也允許使用第三方的鏡像倉庫。

最後,再談談github。它主要用來做版本控制,不僅可以比較兩個版本的差異,還可以基于某些曆史版本建立新的分支。

使用docker後,軟體部署的應用也可以具備類似github的版本控制功能,對應用做一些修改,送出新版本,運作環境可以在多個版本間快速切換,自由選擇使用哪個版本對外提供服務。

通過和java、android、github的對比,大家對docker應該有了比較直覺的認識,docker用來管理軟體部署的應用,docker把應用打包成一個鏡像,鏡像帶有版本控制功能,應用的每次修改疊代就對應鏡像的一個版本,制作好的鏡像可以釋出到鏡像倉庫,分享給别人;也可以直接從鏡像倉庫下載下傳别人制作好的應用,不做任何修改,即可運作起來。