Docker時(shí)代來(lái)了,你準(zhǔn)備好了嗎 ?
剛剛過去的2014年或許是史上最熱的一年,在這火熱的年份里,Docker 也好似一支被點(diǎn)燃的火箭,掀起一股股熱浪。Docker之所以如此受人矚目,并不是因?yàn)樗鼊?chuàng)造了多么神奇的技術(shù),而是因?yàn)樗匦露x了軟件的交付方式,進(jìn)而將改變傳統(tǒng)“開發(fā)-測(cè)試-部署”的軟件流程。尤其是在云計(jì)算和開源軟件大行其道的今天,Docker的出現(xiàn)正好順應(yīng)了時(shí)代的發(fā)展,占盡了天時(shí)地利人和。
本文的重點(diǎn)不是討論Docker的基本原理或?qū)崿F(xiàn)機(jī)制(網(wǎng)上有太多的資料文檔可以參考,比如這篇博客《Docker,云時(shí)代的程序交付方式》),而是基于前一段時(shí)間的探索實(shí)踐,分享一些我們對(duì)Docker的認(rèn)識(shí)與思考,期待有更多的同行參與進(jìn)來(lái),一起推動(dòng)Docker在國(guó)內(nèi)的應(yīng)用,享受到其發(fā)展的紅利。因此,我們這里著眼于以下三個(gè)問題:為什么Docker有價(jià)值?什么是Docker思維?如何把Docker玩起來(lái)?
為什么Docker有價(jià)值
為什么Docker這么有價(jià)值?在回答這個(gè)問題之前,我們先想一個(gè)相似的問題,為什么阿里巴巴這么有價(jià)值?
傳統(tǒng)的商業(yè)存在兩大弊端:一是買賣雙方相對(duì)分散,加大了需求收集、營(yíng)銷、運(yùn)輸?shù)某杀?;二是買賣雙方信息不對(duì)稱,對(duì)交易產(chǎn)生了抑制作用。
電子商務(wù)的出現(xiàn)則將商品從賣方到買方的流通過程變得集中化、標(biāo)準(zhǔn)化、透明化:
- 集中化:買家足不出戶就能從各個(gè)商戶集中購(gòu)買商品,賣家根據(jù)買家需求集中配貨、根據(jù)下單情況集中發(fā)貨。
- 標(biāo)準(zhǔn)化:買家支付下單-賣家發(fā)貨-快遞包裹-物流運(yùn)輸-買家收貨確認(rèn),整個(gè)流程都是標(biāo)準(zhǔn)化的。
- 透明化:買家可以在網(wǎng)上瀏覽商品評(píng)價(jià)、比較商品價(jià)格。買賣雙方的信用等級(jí)也是完全透明的。
綜上所述,可以說(shuō)阿里巴巴這樣的電商帶來(lái)的***價(jià)值在于降低了商品的社會(huì)交易成本。
現(xiàn)在我們把商業(yè)發(fā)展的邏輯搬到軟件交付這里。傳統(tǒng)的軟件交付面臨同傳統(tǒng)商業(yè)類似的問題:
- 軟件發(fā)布分散化,使用者搜索和安裝軟件的成本較高。當(dāng)然,我們有類似yum、brew這樣的工具來(lái)集中處理軟件安裝與軟件依賴問題。但是,不要忘記開源軟件已經(jīng)占據(jù)越來(lái)越重要的位置,它們的發(fā)展速度和協(xié)作方式使傳統(tǒng)的工具很難跟上節(jié)奏。
- 軟件開發(fā)者和軟件使用者雙方信息不對(duì)稱。盡管開發(fā)者對(duì)軟件的代碼編譯、參數(shù)配置、運(yùn)行環(huán)境等信息了如指掌,但使用者卻很可能一知半解。因此,我們會(huì)經(jīng)??吹绞褂谜弑г?,明明按照用戶手冊(cè)一步步操作,卻仍然跑不起來(lái)。這種情況也時(shí)常出現(xiàn)在軟件流程中,開發(fā)將程序和文檔交付給測(cè)試或運(yùn)維,測(cè)試或運(yùn)維卻總是無(wú)法重現(xiàn)期望的運(yùn)行狀態(tài),幾經(jīng)輾轉(zhuǎn)發(fā)現(xiàn)是機(jī)器環(huán)境 、系統(tǒng)環(huán)境、軟件依賴版本、參數(shù)配置等等原因?qū)е?。這樣低效的軟件流程將使持續(xù)集成與持續(xù)交付很難真正實(shí)施起來(lái),僅僅流于形式。
Docker的出現(xiàn)則將軟件從開發(fā)方到使用方的交付過程變得集中化、標(biāo)準(zhǔn)化、透明化:
- 集中化:軟件使用者可以從Docker倉(cāng)庫(kù)找到琳瑯滿目的軟件鏡像,一個(gè)鏡像包含商業(yè)軟件或開源軟件,也可以包含單個(gè)軟件或任意的軟件組合。
- 標(biāo)準(zhǔn)化:Docker鏡像的“構(gòu)建-發(fā)布-存儲(chǔ)-下載-運(yùn)行”是標(biāo)準(zhǔn)化的,統(tǒng)一通過Docker工具來(lái)執(zhí)行,而且所有操作都可以移植到任意的機(jī)器或平臺(tái)。
- 透明化:Docker鏡像是自包含的,包括程序、軟件依賴、參數(shù)配置等所有運(yùn)行環(huán)境,使用者無(wú)需了解細(xì)節(jié),只需運(yùn)行同樣的Docker命令就能達(dá)到與開發(fā)者同樣的運(yùn)行狀態(tài)。
綜上所述,可以說(shuō)Docker帶來(lái)的***價(jià)值在于降低了軟件的交付成本。
#p#
什么是Docker思維
這年頭流行思維主義,什么互聯(lián)網(wǎng)思維、大數(shù)據(jù)思維格外賺人眼球。這里我們跟風(fēng)一下,提出一個(gè)Docker思維,其實(shí)歸納起來(lái)就兩句話:
- 做為軟件使用者,避免直接安裝軟件包,總是以Docker鏡像形式獲取軟件、以Docker容器形式運(yùn)行軟件。
- 做為軟件開發(fā)者,避免直接發(fā)布軟件包,總是以Docker鏡像形式發(fā)布到Docker倉(cāng)庫(kù)。
怎樣理解這兩句話?下面通過一個(gè)簡(jiǎn)單的實(shí)踐來(lái)說(shuō)明。假定現(xiàn)在我們?cè)陂_發(fā)一個(gè)Java程序,從編譯到運(yùn)行需要使用以下幾個(gè)軟件工具:1) git,源碼版本控制; 2) maven,源碼編譯; 3) mysql,存儲(chǔ)數(shù)據(jù)庫(kù)。
遵循Docker思維,做為使用者,我們應(yīng)該避免直接安裝git、maven及mysql,而是通過Docker來(lái)獲取。
首先,從github上獲取源代碼:
- docker run -it --rm -v "$(pwd)":/app switchback/git-debian git clone https://github.com/spring-by-example/spring-by-example.git /app
運(yùn)行以上命令將在當(dāng)前文件夾clone指定github地址的源代碼。簡(jiǎn)單解析一下命令:
- switchback/git-debian,是git的Docker鏡像URL。
- -it,指定以交互方式啟動(dòng)容器。
- --rm,指定命令結(jié)束自動(dòng)刪除容器。
- -v "$(pwd)":/app, 指定將宿主機(jī)的當(dāng)前文件夾mount到容器里的/app文件夾。
然后,通過maven來(lái)編譯源碼:
- docker run -it --rm -v "$(pwd)":/app -w /app docker.cn/docker/maven mvn clean package
運(yùn)行以上命令將在當(dāng)前源碼文件夾編譯maven項(xiàng)目。簡(jiǎn)單解析一下命令:
- maven:3.2-jdk-7,是maven的Docker鏡像URL。
- -w /app,指定容器的工作路徑為"/app"。
***,搭建mysql數(shù)據(jù)庫(kù):
- docker run -e MYSQL_ROOT_PASSWORD=mypassword -d -p 3306:3306 docker.cn/docker/mysql
運(yùn)行以上命令將在本機(jī)啟動(dòng)一個(gè)mysql數(shù)據(jù)庫(kù)。簡(jiǎn)單解析一下命令:
- docker.cn/docker/mysql,是mysql的Docker鏡像URL。
- -e MYSQL_ROOT_PASSWORD=mypassword,-e選項(xiàng)用于向Docker容器里注入環(huán)境變量,這里通過MYSQL_ROOT_PASSWORD環(huán)境變量傳遞mysql的root密碼。
- -d,指定后臺(tái)方式啟動(dòng)容器
- -p 3306:3306,指定將容器的3306端口綁定到宿主機(jī)的3306端口。
可以看到,三條Docker命令就滿足了我們對(duì)git/maven/mysql的使用需求,而且可以完全移植到有Docker環(huán)境的任意機(jī)器。那么,接下來(lái)的問題是,如何發(fā)布我們的Java程序?
遵循Docker思維,做為開發(fā)者,應(yīng)該通過Docker來(lái)發(fā)布軟件。
首先,編寫一個(gè)Dockerfile來(lái)制作Docker鏡像,它有點(diǎn)類似Makefile的作用:
- #每個(gè)Docker鏡像需要基于某個(gè)基礎(chǔ)鏡像來(lái)構(gòu)建
- #新鏡像的構(gòu)建操作會(huì)在基礎(chǔ)鏡像上疊加
- FROM docker.oa.com:8080/docker/java7
- #將源碼編譯后產(chǎn)生的jar文件拷貝到鏡像里
- ADD target/myapp.jar /app/myapp.jar
- #指定容器的啟動(dòng)命令
- CMD java -jar /app/myapp.jar
保存以上的Dockerfile,運(yùn)行以下命令制作鏡像,指定鏡像名為myapp,版本為1.0:
- docker build -t myapp:1.0 .
鏡像制作完成后,可以提交到Docker倉(cāng)庫(kù),軟件發(fā)布就完成了:
- docker push myapp:1.0
可以看到,兩條Docker命令加一個(gè)Dockerfile就滿足了我們對(duì)軟件的發(fā)布需求。更重要的是,使用者可以像我們之前使用git/maven/mysql那樣,通過Docker獲取并運(yùn)行該軟件。
#p#
如何把Docker玩起來(lái)
君子動(dòng)口又動(dòng)手,才是好程序員。要想玩轉(zhuǎn)Docker,首先得動(dòng)手把Docker環(huán)境搭建起來(lái)。下面讓我們花5分鐘的時(shí)間在Windows上搭建Docker環(huán)境。
方式一
最簡(jiǎn)單的方式是直接安裝boot2docker,它是一個(gè)為體驗(yàn)Docker而打造的輕量級(jí)Linux發(fā)行版。在Windows上可以直接運(yùn)行boot2docker安裝文件,它默認(rèn)會(huì)綁定安裝VirtualBox以便在虛擬機(jī)中運(yùn)行boot2docker。
boot2docker極其輕量,安裝簡(jiǎn)單,但是它完全是運(yùn)行在內(nèi)存中的,這意味著你在系統(tǒng)中修改的配置或保存的文件,在重啟后都會(huì)丟失。在某些情況下,可能你希望***創(chuàng)建某個(gè)用戶賬號(hào),或者***保存某些文件(例如Dockerfile),這時(shí)候boot2docker就無(wú)法滿足了,可以嘗試方式二。
方式二
通過vagrant安裝coreos。coreos是另一個(gè)為Docker而打造的輕量級(jí)Linux發(fā)行版,但它的目標(biāo)是大規(guī)模生產(chǎn)環(huán)境部署,而不僅僅是體驗(yàn);vagrant是一個(gè)創(chuàng)建可移植的開發(fā)環(huán)境的工具。我們通過以下幾步來(lái)安裝coreos:
1. 安裝virtualbox
2. 安裝vagrant
3. 下載coreos的vagrant box——coreos_production_vagrant.box
4. 運(yùn)行以下命令添加vagrant box:
- vagrant.exe box add --name coreos coreos_production_vagrant.box
5. cd到一個(gè)新的文件夾,運(yùn)行以下命令啟動(dòng)coreos虛擬機(jī):
- vagrant.exe init coreos
- vagrant.exe up
6. 現(xiàn)在就可以ssh到coreos了:
- vagrant.exe ssh
7. 當(dāng)然也可以通過putty這樣的工具來(lái)ssh到coreos:IP=127.0.0.1,Port=2222。
到目前為止,相信你已經(jīng)能夠在Windows上自由體驗(yàn)Docker了,不妨試試將自己的軟件制作成鏡像,發(fā)布到倉(cāng)庫(kù),再讓其他人通過Docker獲取運(yùn)行,你會(huì)發(fā)現(xiàn)原來(lái)軟件交付真的是如此便捷!
接下來(lái)更進(jìn)一步,你可以考慮將復(fù)雜一點(diǎn)的分布式應(yīng)用遷移到Docker,這時(shí)候就需要搭建Docker集群,而更關(guān)鍵的問題是,如何做資源調(diào)度、擴(kuò)縮容、服務(wù)發(fā)現(xiàn)、自動(dòng)容錯(cuò)、集群監(jiān)控。Docker自身目前還不能解決集群應(yīng)用的問題(雖然已經(jīng)在朝著這個(gè)方向努力),這需要在Docker之上構(gòu)建集群管理系統(tǒng),業(yè)界有名的開源項(xiàng)目包括Kubernetes和Flynn,具體介紹可參考筆者的文章《Kubernetes初探:原理及實(shí)踐應(yīng)用》和《Flynn初探:基于Docker的PaaS平臺(tái)》。
總結(jié)
經(jīng)過本文的分享,希望大家對(duì)Docker有更了清晰的認(rèn)識(shí),并且能動(dòng)手玩起來(lái)。有任何疑問或者想法,歡迎通過郵件zhangjun2915@163.com交流,讓我們攜手走進(jìn)Docker時(shí)代,做新時(shí)代的弄潮兒。
博文出處:http://blog.csdn.net/zhangjun2915/article/details/42472813