Docker — 云時代的程序分發(fā)方式

Docker — 云時代的程序分發(fā)方式

要說最近一年云計算業(yè)界有什么大事件?Google Compute Engine 的正式發(fā)布询兴?Azure入華乃沙?還是AWS落地中國?留在每個人大腦中的印象可能各不相同诗舰,但要是讓筆者來排名的話那么Docker絕對應(yīng)該算是第一位的警儒。如果你之前聽說過它的話,那么也許你會說“沒錯眶根,就是它”蜀铲,因為幾乎世界各地的開發(fā)、運(yùn)維都在談?wù)撝鳧ocker属百;如果你還沒聽說過Docker记劝,那么我真的建議你花上10分鐘來閱讀本文。

1. Docker簡介

1.1. 什么是Docker族扰?

Docker是一個重新定義了程序開發(fā)測試厌丑、交付和部署過程的開放平臺定欧。Docker也是容器技術(shù)的一種,它運(yùn)行于Linux宿主機(jī)之上怒竿,每個運(yùn)行的容器都是相互隔離的砍鸠,也被稱為輕量級虛擬技術(shù)或容器型虛擬技術(shù)。而且它有點類似Java的編譯一次耕驰,到處運(yùn)行爷辱,Docker則可以稱為構(gòu)建一次,在各種平臺上運(yùn)行朦肘,包括本地服務(wù)器和云主機(jī)等(Build once饭弓,run anywhere)。

容器就是集裝箱厚骗,我們的代碼都被打包到集裝箱里示启;Docker就是搬運(yùn)工,幫你把應(yīng)用運(yùn)輸?shù)绞澜绺鞯亓旖ⅲ沂浅咚佟?/p>

Docker是開源軟件夫嗓,代碼托管在GitHub上,使用Go語言編寫冲秽。Go可以稱得上是互聯(lián)網(wǎng)時代專門為開發(fā)分布式舍咖、高并發(fā)系統(tǒng)而生的編程語言。Docker也可以說是Go語言的一個殺手級應(yīng)用锉桑,而且在Docker生態(tài)圈里很多軟件也都是使用Go語言編寫的排霉。

1.2. Docker歷史

Docker項目始于2013年3月,由當(dāng)時的PaaS服務(wù)提供商dotCloud開發(fā)民轴,dotClound也是YCombinator S10的畢業(yè)生攻柠。盡管Docker項目很年輕,到現(xiàn)在也只有15個月而已后裸,然而它的發(fā)展勢頭如此之猛已經(jīng)讓很多人感嘆不已了瑰钮。

2013年10月dotCloud公司名字也由dotCloud, Inc.改為Docker, Inc.,集中更多的精力放到了Docker相關(guān)的研發(fā)上微驶。

1.3. Docker的技術(shù)基石

在進(jìn)入Docker的世界之前浪谴,我們先來看一下Docker實現(xiàn)所依賴的一些技術(shù)。

實際上Docker的出現(xiàn)離不開很多Linux kernel提供的功能因苹,甚至可以說Docker在技術(shù)上并沒有什么特別重大的創(chuàng)新之處苟耻,利用的都是已經(jīng)非常成熟的Linux技術(shù)而已,這些技術(shù)早在Solaris 10或Linux Kernel 2.6的時候就有了扶檐⌒渍龋可以毫不夸張的說Docker就是“站在了巨人的肩膀上”。

下面我們就先來了解一下Docker主要利用的Linux技術(shù)蘸秘。

1.3.1. 容器技術(shù)

容器(Container)有時候也被稱為操作系統(tǒng)級虛擬化官卡,以區(qū)別傳統(tǒng)的Hypervisor虛擬技術(shù)蝗茁。它不對硬件進(jìn)行模擬醋虏,只是作為普通進(jìn)程運(yùn)行于宿主機(jī)的內(nèi)核之上寻咒。

在容器中運(yùn)行的一般都是一個簡易版的Linux系統(tǒng),有root用戶權(quán)限颈嚼、init系統(tǒng)(采用LXC容器的情況下)毛秘、進(jìn)程id、用戶id以及網(wǎng)絡(luò)屬性阻课。

容器技術(shù)在云計算時代已經(jīng)被大量使用叫挟。Google公司的Joe Beda在今年5月做了一次題為《Containers At Scale — At Google, the Google Cloud Platform and Beyond》?注 1?的演講,在其中提到“Everything at Google runs in a container”限煞,每周啟動容器次數(shù)竟然多達(dá)20億次抹恳。

注 1?https://speakerdeck.com/jbeda/containers-at-scale

很多PaaS平臺都是基于容器技術(shù)實現(xiàn)的,比如目前最成功的PaaS平臺Heroku署驻。此外奋献,還有比較著名的開源PaaS平臺Cloud Foundry的Warden以及Google的Lmctfy(Let Me Contain That For You)?注 2?等。

注 2 Let Me Contain That For You旺上,?http://github.com/google/lmctfy

1.3.2. LXC

這也是在Linux下使用比較廣泛的容器方案瓶蚂。基本上我們可以認(rèn)為Linux containers = cgroups(資源控制) + namespaces(容器隔離)宣吱。

LXC很成熟很強(qiáng)大窃这,然而它卻不好使用,比如它不方便在多臺機(jī)器間移動征候,不方便創(chuàng)建管理杭攻,不可重復(fù)操作,也不方便共享等等疤坝,相對于開發(fā)人員來說兆解,它只是系統(tǒng)管理員的玩具。Docker的出現(xiàn)很好的解決了這些問題卒煞,它將容器技術(shù)的使用成本拉低到了一個平民價格痪宰。

1.3.3. namespaces

這是用來為容器提供進(jìn)程隔離的技術(shù),每個容器都有自己的命名空間畔裕,比如pid/net/ipc/mnt/uts等命名空間衣撬,以及為容器提供不同的hostname。namespace能保證不同的容器之間不會相互影響扮饶,每個容器都像是一個獨(dú)立運(yùn)行著的OS一樣具练。

1.3.4. cgroups

cgroups是一個Google貢獻(xiàn)的項目,它主要用來對共享資源的分配甜无、限制扛点、審計及管理哥遮,比如它可以為每個容器分配CPU、內(nèi)存以及blkio等的使用限額等陵究。cgroups使得容器能在宿主機(jī)上能友好的相處眠饮,并公平的分配資源以及杜絕資源濫用的潛在風(fēng)險。

容器技術(shù)實現(xiàn)方案可以用下面的圖進(jìn)行簡單說明铜邮。

圖 Docker如何和Linux內(nèi)核打交道

上圖中的cgroups仪召、namespaces和apparmor等都是Linux內(nèi)核提供的功能。不管是傳統(tǒng)的LXC還是Docker的libcontainer松蒜,都使用了Kernel的這些功能來實現(xiàn)容器功能扔茅。

1.3.5. 聯(lián)合文件系統(tǒng)

聯(lián)合文件系統(tǒng)是一個分層的輕量、高性能文件系統(tǒng)秸苗。Docker之所以這么吸引人召娜,很大程度上在于其在鏡像管理上所做出的創(chuàng)新。而聯(lián)合文件系統(tǒng)正是構(gòu)建Docker鏡像的基礎(chǔ)惊楼。

AUFS(AnotherUnionFS)是一個分層的基于Copy On Write技術(shù)的文件系統(tǒng)玖瘸,支持Union Mount,就是將具有不同文件夾結(jié)構(gòu)的鏡像層進(jìn)行疊加掛載胁后,讓它們看上去就像是一個文件系統(tǒng)那樣店读。

1.4. 容器技術(shù)VS虛擬機(jī)技術(shù)

容器技術(shù)和Hypervisor技術(shù)雖然不屬于同一層次的概念,但是作為具有計算能力的應(yīng)用運(yùn)行載體來說攀芯,它們還是有一定的共通性和競爭關(guān)系屯断,這里作此對比完全是為了加深讀者對容器技術(shù)的理解而已。

容器技術(shù)虛擬機(jī)技術(shù)占用磁盤空間小侣诺,甚至幾十KB(鏡像層的情況)非常大殖演,上GB啟動速度快,幾秒鐘慢年鸳,幾分鐘運(yùn)行形態(tài)直接運(yùn)行于宿主機(jī)的內(nèi)核上趴久,不同容器共享同一個Linux內(nèi)核運(yùn)行于Hypervisior上并發(fā)性一臺宿主機(jī)可以啟動成千上百個容器最多幾十個虛擬機(jī)性能接近宿主機(jī)本地進(jìn)程遜于宿主機(jī)資源利用率高低

比如開源PaaS實現(xiàn)軟件tsuru最初使用的是基于虛擬機(jī)的技術(shù),創(chuàng)建一個應(yīng)用程序需要5分鐘左右的時間搔确,而在采用Docker之后挪蹭,已經(jīng)將這個時間縮短到了10秒鐘了?注 3?迄汛。

注 3 tsuru and docker by Andrews Medina?https://speakerdeck.com/andrewsmedina/tsuru-and-docker

1.5. 我們能用Docker干什么屠橄?

Docker可以應(yīng)用在各種場景下趾浅,比如公司內(nèi)部開發(fā)測試使用,或者作為共有或者私有PaaS平臺等涕蜂。

現(xiàn)在PaaS平臺的發(fā)展已經(jīng)非常成熟了华匾,這里我們只羅列一些在開發(fā)中使用Docker技術(shù)可能會給我們帶來的益處。

1.5.1 在開發(fā)中

構(gòu)建開發(fā)環(huán)境變得簡單

簡單包括幾個方面的意思

快速:只需?docker run?即可共享:通過Dockerfile或者Registry自動化:一切代碼化的東西都可以自動化統(tǒng)一:每個人的開發(fā)環(huán)境都是一模一樣的

設(shè)想我們要基于Nginx/PHP机隙、MySQL和Redis開發(fā)蜘拉,我們可以創(chuàng)建3個Docker鏡像保存到公司私有的Registry中去萨西,每個開發(fā)人員使用的時候是需要執(zhí)行?docker run redis?即可以享用自己獨(dú)有的Redis服務(wù)了,而且這3個容器不管從占用磁盤空間還是運(yùn)行性能來說旭旭,都比虛擬機(jī)要好很多谎脯。

1.5.2. 在測試中

解決環(huán)境構(gòu)建問題

有時候構(gòu)建測試的環(huán)境是一項費(fèi)時費(fèi)力的工作,而Docker能讓這變得輕松您机。如果你的測試比較簡單的話穿肄,甚至直接拿開發(fā)構(gòu)建的鏡像就可以開始了年局。

消除環(huán)境不一致導(dǎo)致的問題

“在我的機(jī)器上運(yùn)行的好好的际看,怎么到你那里就不行了?”矢否,我想超過半數(shù)的程序員都曾經(jīng)說過類似的話仲闽。如果對導(dǎo)致這一問題的原因進(jìn)行統(tǒng)計的話,我想排在第一位的應(yīng)該非“環(huán)境不一致”莫屬了僵朗,這包括操作系統(tǒng)和軟件的版本赖欣、環(huán)境變量、文件路徑等验庙。

使用Docker的話你再也不用為此煩惱了顶吮。因為你交付的東西不光是你的代碼、配置文件粪薛、數(shù)據(jù)庫定義悴了,還包括你的應(yīng)用程序運(yùn)行的環(huán)境:OS加上各種中間件、類庫 + 你的應(yīng)用程序违寿。

1.5.3. 部署和運(yùn)維

基于容器的部署和自動化

Docker定義了重新打包程序的方法湃交。

Docker容器 + 用戶應(yīng)用 = 部署單位(構(gòu)件)

Docker可以看作是用代碼編寫出來的國際集裝箱,它可以把任何應(yīng)用及相關(guān)依賴項打包成一個輕量藤巢、可移植(Portable)搞莺、自包涵的容器。

以前部署代碼都是代碼級別的掂咒,有了Docker才沧,則可以進(jìn)行容器級別的部署。這樣帶來的最大的好處就是開發(fā)者本地測試绍刮、CI服務(wù)器測試温圆、測試人員測試,以及生產(chǎn)環(huán)境運(yùn)行的都可以是同一個Docker鏡像录淡。

快速進(jìn)行橫向擴(kuò)展

Docker容器的啟動速度很快捌木,可以瞬間啟動大量容器,所以在非常適合在業(yè)務(wù)高峰期進(jìn)行橫向擴(kuò)展嫉戚。這比傳統(tǒng)的啟動EC2實例或者物理機(jī)可要快多了刨裆。

天生的和云計算技術(shù)相結(jié)合

當(dāng)然澈圈,由于Docker具有很好的移植性,所以它更強(qiáng)大的地方還在于和云環(huán)境結(jié)合使用帆啃。

Docker容器是可移植瞬女,或者說跨平臺。將來的應(yīng)用部署可能是在本地進(jìn)行打包(成Docker鏡像)然后傳送到云端運(yùn)行努潘,至于是AWS還是GCE這不是問題诽偷,Docker都能在其上運(yùn)行。這樣不僅能在一定程度上解決vendor-lockin的問題疯坤,同時也使得在不同的云服務(wù)提供商之間遷移也變得簡單报慕。尤其是未來在使用多云(multi-cloud)環(huán)境的時候,這將非常便利压怠。

筆者認(rèn)為基于IaaS + 容器技術(shù)的應(yīng)用交付眠冈、部署方式將來一定會成為一種流行的方式。

進(jìn)行Blue-green部署

「Blue-green deployment」這個詞最初出現(xiàn)在《Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation 》一書菌瘫,后經(jīng)ThoughtWorks的Martin Fowler發(fā)揚(yáng)光大?注 4?蜗顽。

注 4?http://martinfowler.com/bliki/BlueGreenDeployment.html

Blue-green deployment方法其實很簡單,就是保持兩套一樣的生產(chǎn)環(huán)境雨让,而實際上只有一套環(huán)境真正的對外提供服務(wù)(圖中綠色環(huán)境)雇盖,而另一套環(huán)境則處于待機(jī)狀態(tài)(圖中藍(lán)色)。部署的時候栖忠,我們會先上線到藍(lán)色環(huán)境中崔挖,如果測試沒有問題了,再將路由切換到新的服務(wù)上娃闲。

Blue-green部署能帶來如下好處虚汛。

最小化停機(jī)時間快速回滾hot standby

而未來的開發(fā)和部署和可能就會像下面這樣進(jìn)行了。

① 開發(fā)人員將代碼push到Git倉庫② CI工具通過webhook得到最新代碼皇帮,構(gòu)建Docker鏡像并啟動容器進(jìn)行測試卷哩。③ 測試通過后將鏡像打標(biāo)簽后push到私有鏡像Registry④ CI工具通知CD工具⑤ CD工具通過Mesos/Marathon等進(jìn)行基于容器的部署⑥ 測試沒有問題后進(jìn)行容器的切換(即Blue-green切換)

2. Docker架構(gòu)解析

2.1. Docker整體結(jié)構(gòu)

Docker是一個構(gòu)建、發(fā)布属拾、運(yùn)行分布式應(yīng)用的平臺(見下圖)将谊,Docker平臺由Docker Engine(運(yùn)行環(huán)境 + 打包工具)、Docker Hub(API + 生態(tài)系統(tǒng))兩部分組成尊浓。

圖 Docker平臺

從圖中我們可以看到,Docker的底層是各種Linux OS以及云計算基礎(chǔ)設(shè)施纯衍,而上層則是各種應(yīng)用程序和管理工具栋齿,每層之間都是通過API來通信的。

Docker引擎

Docker引擎是一組開源軟件,位于Docker平臺的核心位置瓦堵。它提供了容器運(yùn)行時以及打包基协、管理等工具。

Docker引擎可以直觀理解為就是在某一臺機(jī)器上運(yùn)行的Docker程序菇用,實際上它是一個C/S結(jié)構(gòu)的軟件澜驮,有一個后臺守護(hù)進(jìn)程在運(yùn)行,每次我們運(yùn)行?docker?命令的時候?qū)嶋H上都是通過RESTful Remote API來和守護(hù)進(jìn)程進(jìn)行交互的惋鸥,即使是在同一臺機(jī)器上也是如此杂穷。

Docker Hub

Docker Hub是一個云端的分布式應(yīng)用服務(wù),它專注于內(nèi)容卦绣、協(xié)作和工作流耐量。Docker Hub除了可以托管、下載迎卤、查找Docker鏡像之外拴鸵,還提供了包括更管理、團(tuán)隊協(xié)作蜗搔、生命周期流程自動化等功能,以及對第三方工具和服務(wù)的集成八堡。

Docker Engine有點像一個C/S結(jié)構(gòu)的軟件樟凄,系統(tǒng)中有一個后臺守護(hù)進(jìn)程,每次我們運(yùn)行?docker?命令的時候?qū)嶋H上都是通過RESTful的Remote API來和守護(hù)進(jìn)程進(jìn)行交互的兄渺。

2.2. Docker鏡像(image)

2.2.1. Docker鏡像

Docker鏡像是Docker系統(tǒng)中的構(gòu)建模塊(Build Component)缝龄,是啟動一個Docker容器的基礎(chǔ)。

我們可以通過一個官方提供的示意圖來幫助我們來理解一下鏡像的概念挂谍。

Docker鏡像位于bootfs之上叔壤,實際上bootfs在系統(tǒng)啟動后會被卸載的。Docker鏡像(Images)是分層的口叙,這得益于其采用的聯(lián)合文件系統(tǒng)炼绘,前面我們已經(jīng)介紹過了。鏡像是有繼承(父子)關(guān)系的妄田,每一層鏡像的下面一層稱為父鏡像俺亮,沒有父鏡像的稱為基礎(chǔ)鏡像(Base Iamge,其實叫做Root Image可能更確切疟呐,不過這可能容易和rootfs混淆)脚曾。

2.2.2. 鏡像倉庫

我們可以將Docker鏡像倉庫理解為Git倉庫。Dcoker鏡像倉庫分為遠(yuǎn)程和本地启具,本地的概念好理解本讥,而一般來說遠(yuǎn)程倉庫就是Registry,包括官方的或者自建的私有Registry拷沸;我們通過?docker pull?和?docker push?命令在本地和遠(yuǎn)程之間進(jìn)行鏡像傳輸。

Docker鏡像的命名規(guī)則和GitHub也很像堵漱。比如我們自己創(chuàng)建的倉庫名稱都是類似?liubin/redis?這樣格式的,前面的?liubin?是用戶名或namespace勤庐,后面是倉庫名录择。

不過我們前面已經(jīng)看到運(yùn)行的ubuntu鏡像的時候是倉庫名就是?ubuntu?,而不帶用戶名前綴橄霉,這是表明它是由官方制作的窃爷,或者由官方認(rèn)可的第三方制作的鏡像邑蒋。我們可以認(rèn)為官方倉庫提供的鏡像都是安全的、最新的按厘,所以也可以放心使用医吊。

2.3. Docker容器(Container)

容器是一個基于Docker鏡像創(chuàng)建、包含為了運(yùn)行某一特定程序的所有需要的OS逮京、軟件卿堂、配置文件和數(shù)據(jù),是一個可移植的運(yùn)行單元懒棉。在宿主機(jī)來看草描,它只不過是一個簡單的用戶進(jìn)程而已。

容器啟動的時候策严,Docker會在鏡像最上層掛載一個read-write的文件系統(tǒng)穗慕,即上圖中標(biāo)記為writable的Container層,容器將跑在這個文件系統(tǒng)上妻导。這層可寫的文件系統(tǒng)是容器中才有的概念逛绵,如果我們對此容器進(jìn)行commit操作,那么該層文件系統(tǒng)則會被提交為一個新的只讀的鏡像層倔韭,并位于鏡像層的最上面的术浪。

我們可以認(rèn)為Docker鏡像是“靜”的".exe"文件,只在“硬盤”上狐肢;而容器是“動”的添吗,是在“內(nèi)存中”的,要想啟動一個容器份名,需要先把".exe"裝載到內(nèi)存。

鏡像和容器具有如下的轉(zhuǎn)換關(guān)系:

鏡像 ->?docker run?-> 容器容器 ->?docker commit?-> 鏡像

有時候我們經(jīng)常會將兩個名稱混用妓美,不過這并不會影響我們的理解僵腺。

2.4. Docker Registry

Docker Registry是Docker架構(gòu)中的分發(fā)模塊,它用來存儲Docker鏡像壶栋,我們可以將它理解為GitHub辰如。

Docker Hub是一個官方的Docker Registry,也是Docker鏡像的默認(rèn)存儲位置贵试。

當(dāng)然從安全管理的角度上來說琉兜,我們可能更愿意在自己公司內(nèi)部托管一個私有的Docker Registry,這可以通過使用Docker官方提供的Registry?注 5?軟件實現(xiàn)毙玻。

注 5 Docker Registry?https://github.com/dotcloud/docker-registry

運(yùn)行私有Registry非常簡單豌蟋,這也是一個典型的Docker風(fēng)格的應(yīng)用發(fā)布例子。

docker run –p 5000:5000 registry

3. 使用Docker

3.1. 初識容器

3.1.1. 創(chuàng)建并啟動容器

這里我們假定各位讀者已經(jīng)在自己的機(jī)器上安裝好了Docker桑滩。Docker主要的命令就是?docker?了梧疲,它的參數(shù)很多,關(guān)于它的具體使用方法,可以參考官方的文檔?注 6?幌氮,這里我們只簡單的介紹其中一些常用的用法缭受。

注 6?https://docs.docker.com/reference/commandline/cli/?和?https://docs.docker.com/reference/run/

啟動一個容器很簡單,我們只需要運(yùn)行?docker run?命令就可以了?注 6?该互。

注 6 為了方便區(qū)分米者,本文中運(yùn)行命令的時候如果提示符為?$?,表示實在宿主機(jī)(Ubuntu)中宇智,如果是?#?蔓搞,則表示是在Docker容器中

$ sudo docker run -i -t ubuntu /bin/bash

Unable to find image 'ubuntu' locally

Pulling repository ubuntu

e54ca5efa2e9: Pulling dependent layers

... 省略 ...

6c37f792ddac: Download complete

... 省略 ...

root@81874a4a6d2e:/#

docker run?命令會啟動一個容器。參數(shù)?ubuntu?指定了我們需要運(yùn)行的鏡像名稱普筹,后面的?bash?則指定了要運(yùn)行的命令败明,注意這個命令是容器中的命令,而不是宿主機(jī)中的命令太防。參數(shù)?-i?用來為容器打開標(biāo)準(zhǔn)輸入以和宿主機(jī)進(jìn)行交互妻顶,?-t?則會為容器分配一個終端。

在第一次啟動某鏡像的時候蜒车,如果我們本地還沒有這個鏡像讳嘱,則Docker會先從遠(yuǎn)程倉庫(Docker Hub)將容器的鏡像下載下來,下載完成之后才會啟動容器酿愧。

注意Docker里有一個很重要的概念就是容器ID或者鏡像ID沥潭,比如這個例子里的?e54ca5efa2e9?。這個ID是一個容器或者鏡像的唯一標(biāo)識嬉挡,它的長度為64位钝鸽,不過很多時候都可以簡寫為12位,這也和Git很像庞钢。

3.1.2. 讓Docker容器在后臺運(yùn)行

這時候我們可以使用?-d?參數(shù)來通過守護(hù)模式啟動一個容器拔恰,這樣容器將會在后臺一直運(yùn)行下去。這非常適合運(yùn)行服務(wù)類程序基括。如果需要颜懊,我們可以再通過?docker attach?命令連接到運(yùn)行中的容器。

3.1.3. 常用命令

docker ps

docker ps?用來查看正在運(yùn)行中的容器风皿。

從下面的輸出結(jié)果我們可以看出該容器狀態(tài)(STATUS列)為已經(jīng)停止執(zhí)行河爹,且沒有錯誤(Exited后面的狀態(tài)碼)。

$ sudo docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

60bab6f881e5 ubuntu:latest /bin/bash 14 minutes ago Exited (0) 5 seconds ago agitated_hopper

docker ps?命令的常用參數(shù)(及組合)如下桐款。

-a?: 查看所有容器咸这,包括已經(jīng)停止運(yùn)行的。-l?: 查看剛剛啟動的容器鲁僚。-q?: 只顯示容器ID-l?-q?: 則可以返回剛啟動的容器ID炊苫。

docker stop/start/restart

docker stop?用來停止運(yùn)行中的容器裁厅,同時你還可以用?docker start?來重新啟動一個已經(jīng)停止的容器。

docker restart?可以重啟一個運(yùn)行中的容器侨艾。這就相當(dāng)于對一個容器先進(jìn)行?stop?再?start?执虹。

3.2. 深入了解Docker鏡像

在對Docker容器有一個簡單的感性認(rèn)識之后,我們再來深入了解一下Docker鏡像的概念唠梨。

Docker鏡像實際上就是一個tarball袋励,它是一個能完整運(yùn)行的OS系統(tǒng),這非常像OS或VM鏡像当叭。它里面有基礎(chǔ)OS茬故、各種軟件包及類庫等。我們啟動一個容器蚁鳖,相當(dāng)于是啟動了一個“基礎(chǔ)OS”磺芭。

3.2.1. 標(biāo)簽(Tag)

我們還可以為鏡像打標(biāo)簽,這也和Git非常相似醉箕。其實你也可能在前面留意到了钾腺,?docker images?的輸出中有一列就是TAG的。我們在執(zhí)行?docker build?或者?docker commit?的時候都可以同時為倉庫名稱指定一個TAG讥裤,格式為?user_name/repo_name:tag?放棒,如果沒有指定這個TAG,則默認(rèn)為?latest?己英。

3.2.2. 常見鏡像操作

這里我們再介紹一下對鏡像常見的一些操作间螟。

查看本地鏡像列表

docker images?命令用來列出當(dāng)前系統(tǒng)中的所有本地鏡像,即我們已經(jīng)通過?docker run?或者?docker pull?下載下來的鏡像损肛,鏡像文件保存在本地的?/var/lib/docker?文件夾下厢破。

下載鏡像到本地

只需要運(yùn)行?docker pull?命令即可,命令非常簡單治拿,問題在于你的網(wǎng)路速度和連通性溉奕。

刪除鏡像

docker rmi?用來從本地倉庫中刪除一個不再需要的鏡像,即"rm image"的縮寫忍啤。

3.3. 構(gòu)建鏡像

我們可以創(chuàng)建自己的Docker鏡像,在我們的日常工作中會經(jīng)常進(jìn)行鏡像構(gòu)建操作仙辟。構(gòu)建Docker鏡像非常簡單同波,而且方法也有幾種。

3.3.1. 手工創(chuàng)建

這個方法最簡單直接的方法叠国。其流程是啟動一個容器未檩,在里面進(jìn)行一些列安裝、配置操作粟焊,然后運(yùn)行?docker commit?命令來將容器commit為一個新鏡像冤狡。

$ sudo docker run -t -i ubuntu bash

root@c4be1df52810:/# apt-get update

root@c4be1df52810:/# apt-get -y install redis-server

root@c4be1df52810:/# exit

通過下面的命令得到剛才容器的ID號并進(jìn)行commit操作孙蒙。

$ sudo docker ps -q -l

c4be1df52810

$ sudo docker commit -m="manually created image" -a="bin liu <liubin0329@gmail.com>" -run='{"CMD":["/usr/bin/redis-server"], "PortSpecs": ["6379"]}' c4be1df52810 liubin/redis:manually

Warning: '-run' is deprecated, it will be removed soon. See usage.

744ce29b2fcf0ad7ad8b2a89c874db51376c3fdd65d1f4f0c6f233b72f8c3400

注意上面的警告信息,在?docker commit?命令指定?-run?選項已經(jīng)不被推薦了悲雳,這里為了說明這個例子而故意使用了這個選項挎峦。建議創(chuàng)建鏡像還是使用Dockerfile的方式,即能將創(chuàng)建過程代碼化合瓢、透明化坦胶,還能進(jìn)行版本化。

再次運(yùn)行?docker images?命令晴楔,就應(yīng)該能看到我們剛才通過?docker commit?命令創(chuàng)建的鏡像了(鏡像ID為744ce29b2fcf?顿苇,鏡像名為?liubin/redis:manually?)。

3.3.2. 使用Dockerfile文件

使用Dockerfile構(gòu)建Docker鏡像

這是一個官方推薦的方法税弃,即將構(gòu)建鏡像的過程代碼化纪岁,比如要安裝什么軟件,拷貝什么文件则果,進(jìn)行什么樣的配置等都用代碼進(jìn)行描述幔翰,然后運(yùn)行?docker build?命令來創(chuàng)建鏡像文件。官方的自動構(gòu)建即是基于保存在GitHub等代碼托管服務(wù)上的Dockerfile進(jìn)行的短条。Dockerfile即是具體的用于構(gòu)建的配置文件名导匣,也是這類文件的類型名稱。

使用Dockerfile構(gòu)建Docker鏡像非常簡單茸时,我們只需要創(chuàng)建一個名為?Dockerfile?的文件贡定,并編寫相應(yīng)的安裝、配置腳本就可以了可都。我們還是以上面安裝Redis服務(wù)為例缓待,看看如何使用Dockerfile構(gòu)建一個鏡像。

首先渠牲,創(chuàng)建一個?redis?文件夾(文件夾名任意旋炒,無任何限制),并進(jìn)入該文件夾签杈,然后創(chuàng)建一個?Dockerfile?文件瘫镇。這個文件的文件名是固定的,其內(nèi)容如下答姥。

FROM ubuntu

MAINTAINER bin liu <liubin0329@gmail.com>

RUN apt-get update

RUN apt-get -y install redis-server

EXPOSE 6379

ENTRYPOINT ["/usr/bin/redis-server"]

Dockerfile文件的語法非常簡單铣除,每一行都是一條指令,注釋則以?#?開頭鹦付。每條指令都是“指令名稱 參數(shù)”的形式尚粘,指令名稱一般都是大寫。比如?FROM?指令表明了我們的鏡像的基礎(chǔ)鏡像(嚴(yán)格來說叫父鏡像敲长,我們的所有操作都將以此鏡像為基礎(chǔ))郎嫁,這里是?ubuntu?秉继,但實際上它可以是存在的任何鏡像,比如?liubin/ruby?泽铛。?RUN?指令則用來在構(gòu)建過程中執(zhí)行各種命令尚辑、腳本,比如這里是?apt-get?命令厚宰,你也可以指定一個很復(fù)雜很長的腳本文件路徑腌巾。AUFS有42層文件系統(tǒng)的限制?注 7?,這時候我們可以通過在?RUN?指令中執(zhí)行多條命令铲觉,即?cmd1?&&?cmd2?&&cmd3?&&?...?這種形式就可以可避免該問題了澈蝙。?EXPOSE?表示此鏡像將對外提供 端口的服務(wù)。?ENTRYPOINT?則指定了啟動該鏡像時的默認(rèn)運(yùn)行程序撵幽。

注 7?https://github.com/dotcloud/docker/issues/1171

具體的Dockerfile語法在官方網(wǎng)站?注 8?有詳細(xì)說明灯荧,相信花個10分鐘就能通讀一遍,這里唯一比較容易混淆的就是ENTRYPOINT?和?CMD?指令了盐杂,關(guān)于它們的區(qū)別逗载,還是留作每位讀者自己的課題去研究一下吧。

注 8?https://docs.docker.com/reference/builder/

Dockerfile準(zhǔn)備好了之后链烈,運(yùn)行?docker build?命令即可構(gòu)建鏡像了厉斟。

$ sudo docker build -t liubin/redis:dockerfile .

這里?-t?表示為構(gòu)建好的鏡像設(shè)置一個倉庫名稱和Tag(如果省略Tag的話則默認(rèn)使用?latest?)。最后的一個?.表示?Dockerfile?文件的所在路徑强衡,由于我們是在同一文件夾下運(yùn)行?docker build?命令擦秽,所以使用了?.?。

由于篇幅所限漩勤,這里我們就省略了?docker build?命令的輸出感挥。不過如果你親自動手執(zhí)行?docker build?命令的話,那么從它的輸出應(yīng)該很容易理解越败,Dockerfile里的每一條指令触幼,都對應(yīng)著構(gòu)建過程中的每一步,而且每一步都會生成一個新的類似容器的哈希值一樣的鏡像層ID究飞。也正是這些層霉祸,使得鏡像能共享很多信息,并且能進(jìn)行版本管理嘴脾、繼承和分支關(guān)系管理等。這除了能節(jié)省大量磁盤空間之外搪缨,還能在構(gòu)建鏡像的時候通過使用已經(jīng)構(gòu)建過的層(即緩存)來大大加快了鏡像構(gòu)建的速度惑惶。比如在我們在使用Dockerfile進(jìn)行構(gòu)建鏡像時千绪,如果在某一步出錯了荸型,那么實際上之前步驟的操作已經(jīng)被提交了,修改Dockerfile后再次進(jìn)行構(gòu)建的話炸茧,Docker足夠聰明到則會從出錯的地方開始重新構(gòu)建瑞妇,因為前面的指令執(zhí)行結(jié)構(gòu)都已經(jīng)被緩存了稿静。

如果你使用?docker history?命令來查看該鏡像的歷史信息,你會發(fā)現(xiàn)它的輸出和?docker build?的記錄是相匹配的辕狰,每一條Dockerfile中的指令都會創(chuàng)建一個鏡像層改备。此命令還能查看每個鏡像層所占空間大小,即?SIZE?列的內(nèi)容蔓倍。比如本例中?MAINTAINER?這樣指令悬钳,實際上它只是關(guān)于鏡像的元數(shù)據(jù),并不占用額外的磁盤空間偶翅,所以它的層大小為0字節(jié)默勾。而?RUN apt-get?-y install redis-server?創(chuàng)建的層則會在鏡像中增加文件,所以是需要占用磁盤空間的倒堕。

自動構(gòu)建(Automated Builds)

Docker Hub的目的之一就是要成為應(yīng)用程序交換的中轉(zhuǎn)站灾测,它還支持自動構(gòu)建功能。自動構(gòu)建的Dockerfile可以托管在GitHub或者Bitbucket上垦巴,當(dāng)我們將代碼提交并push到托管倉庫的時候媳搪,Docker Hub會自動通過webhook來啟動鏡像構(gòu)建任務(wù)。

配置自動構(gòu)建很簡單骤宣,只需要在Docker Hub中綁定GitHub或者Bitbucket賬號就可以了秦爆,如何具體操作這里不做詳細(xì)說明了。

3.3.3. 使用Packer

Packer?注 10?是一個通過配置文件創(chuàng)建一致機(jī)器鏡像(identical machine images)的非常方便的工具憔披。Packer同樣出自Vagrant的作者M(jìn)itchell Hashimoto之手等限。它支持虛擬機(jī)VirtualBox和VMWare等虛擬機(jī)軟件,以及Amazon EC2芬膝、DigitalOcean望门、GCE以及OpenStack等云平臺,最新版的Packer也增加了對Docker的支持锰霜。

注 10?http://www.packer.io/

Packer的使用也比較簡單筹误,這里我們就舉例說明了,讀者可以自己試一下癣缅。

3.4. 發(fā)布鏡像

如果你愿意厨剪,還可以將在本地制作鏡像push到Docker Hub上和其他人分享你的工作成果。

首先你要有一個Docker Hub賬號并已經(jīng)為登錄狀態(tài)友存,這樣才能往Docker Hub上push鏡像文件祷膳。注冊Docker Hub賬號只能通過網(wǎng)站注冊?注 11?,這里我們假設(shè)各位讀者已經(jīng)擁有Docker Hub了賬號屡立。

注 11?https://hub.docker.com/

登錄Docker Hub通過?docker login?命令直晨。

登錄成功后,我們就可以push鏡像了。注意這里我們沒有指定Tag抡秆,Docker知道如何去做奕巍。

$ sudo docker push liubin/redis

我們前面說過,鏡像文件是分層的儒士,很多鏡像文件可以共用很多層。比如我們這次往服務(wù)器push鏡像的時候檩坚,實際push的只有一層(?744ce29b2fcf?)而已着撩,這是因為我們的鏡像文件是基于?ubuntu?這個base鏡像創(chuàng)建的,而ubuntu?鏡像早已經(jīng)在遠(yuǎn)程倉庫中了匾委。

我們在層?744ce29b2fcf?中對應(yīng)的操作是?bash?命令拖叙,并在容器中安裝了Redis。而這次修改只有不到6M的容量增加赂乐,而如果只是修改配置文件的話薯鳍,那么一次push操作可能只需要耗費(fèi)幾K的網(wǎng)絡(luò)帶寬而已。

4. DockerCon14總結(jié)

首屆Docker大會(DockerCon14)于當(dāng)?shù)貢r間6月9日~6月10日在舊金山舉行挨措。相對于計劃中的500個參會名額挖滤,最終有超過900人報名,并提交了超過150個演講申請浅役。

關(guān)于這次Docker大會的更多信息可以參考其官方網(wǎng)站:?http://www.dockercon.com/斩松。

4.1. Docker官方發(fā)布的產(chǎn)品和服務(wù)

4.1.1. Docker 1.0的發(fā)布及商業(yè)支持

在這次大會上最重要的事情莫過于Docker 1.0的發(fā)布了。Docker 1.0已經(jīng)可以在Red Hat觉既、Debian惧盹、Ubuntu、Fedora瞪讼、SuSE等主流Linux系統(tǒng)下運(yùn)行钧椰,在功能、穩(wěn)定性以及軟件質(zhì)量上都已經(jīng)達(dá)到了企業(yè)使用的標(biāo)準(zhǔn)符欠,文檔也更加系統(tǒng)嫡霞、完善。并且提供了Docker Hub云服務(wù)背亥,方便開發(fā)者和企業(yè)進(jìn)行應(yīng)用分發(fā)秒际。最重要的是Docker, Inc.還宣布了對Docker的商業(yè)支持,尤其是對Docker 1.0版本的長期支持狡汉。此外娄徊,Docker, Inc.還會提供Docker相關(guān)的培訓(xùn)、咨詢等工作盾戴。

4.1.2. Docker Engine + Docker Hub

同時從1.0開始寄锐,Docker的架構(gòu)也發(fā)生了較大的變化。Docker已經(jīng)從單一的軟件轉(zhuǎn)變?yōu)榱艘粋€構(gòu)建、發(fā)布橄仆、運(yùn)行分布式應(yīng)用的平臺剩膘。

新的Docker平臺由Docker Engine(運(yùn)行環(huán)境 + 打包工具)、Docker Hub(API + 生態(tài)系統(tǒng))兩部分組成盆顾。

Docker引擎

Docker引擎是一組開源軟件怠褐,位于Docker平臺的核心位置。它提供了容器運(yùn)行時以及打包您宪、管理等工具奈懒。

Docker Hub

Docker Hub是一個云端的分布式應(yīng)用服務(wù),它專注于內(nèi)容宪巨、協(xié)作和工作流磷杏。

Docker Hub可以看作是原來Docker index服務(wù)的升級版。Docker Hub除了可以托管Docker鏡像之外捏卓,還提供了包括更管理极祸、團(tuán)隊協(xié)作、生命周期流程自動化等功能怠晴,以及對第三方工具和服務(wù)的集成遥金。

在Docker, Inc.看來,典型的基于Docker Hub的軟件開發(fā)生命周期為:在本地基于Docker引擎開發(fā) -> 打包應(yīng)用程序 -> 將應(yīng)用程序push到Docker Hub -> 從Docker Hub上下載此應(yīng)用鏡像并運(yùn)行龄寞。它將鏡像構(gòu)建的任務(wù)交給Dev汰规,將鏡像部署的任務(wù)交給Ops。

4.1.3. 新組件

Docker Engine也有了一些新的變化物邑,而部分功能實際上早在Docker 0.9就開始提供了溜哮。如果你還在運(yùn)行Docker 0.8及其以前的版本的話坎匿,那么還是及早升級的比較好驼唱。

libswarm

libswarm是一個"toolkit for composing network services”信卡。它定義了標(biāo)準(zhǔn)接口用于管理和編配一個分布式系統(tǒng)休吠,并提供了一致的API潮梯。libswarm打算支持各種編配系統(tǒng)碗淌,雖然它看上去更像個高層接口封裝的API而已喷橙。

libcaontainer

libcontainer是一個容器的參考實現(xiàn)扼劈,它通過Go語言實現(xiàn)來使用Linux的命名空間等技術(shù)锣笨,而不需要額外的外部依賴蝌矛。

實際上在Docker 0.9的時候這個模塊就已經(jīng)分離出來了,到了1.0的時候错英,此模塊成為了獨(dú)立項目并且可以單獨(dú)使用入撒。并且從0.9版本的時候開始Docker就已經(jīng)開始就采用libcontainer來代替LXC作為默認(rèn)的容器實現(xiàn)方式了,LXC變成了可選項之一椭岩。

libchan

libchan現(xiàn)在是Docker的標(biāo)準(zhǔn)通信層茅逮,被稱為網(wǎng)絡(luò)上的go channel璃赡,普通的Go channel只能運(yùn)行在單機(jī)上,而libchan可以跨Unix socket或純TCP/TLS/HTTP2/SPDY/Websocket等運(yùn)行献雅。使用libchan碉考,可以非常方便的進(jìn)行任意結(jié)構(gòu)的消息傳遞、實時雙工異步通信挺身、并發(fā)編程及同步等侯谁。

最后我們再從下面的這張圖,更形象的認(rèn)識一下這三個工具的作用及關(guān)系章钾。

4.2. 大公司的熱情

如果看一下演講嘉賓列表?注 13?良蒸,你一定會感嘆這陣容太豪華了。不錯伍玖,很多演講嘉賓都來自大型互聯(lián)網(wǎng)公司,比如Facebook剿吻、Twitter窍箍、Google、Heroku丽旅、Yelp以及Group等椰棘,很多還都是VP、CTO等高級別的管理人員榄笙,可見這次大會規(guī)格之高邪狞,分量之重。并且他們中的很多人還都進(jìn)入到了Docker治理委員會茅撞。

注 13?http://www.dockercon.com/speakers.html

4.2.1. Google

前面我們已經(jīng)介紹了Google公司內(nèi)部的服務(wù)都是跑在容器之中的帆卓,Google對Docker也表現(xiàn)出了相當(dāng)濃厚的興趣。除了他們負(fù)責(zé)基礎(chǔ)設(shè)施的VP Eric Brewer進(jìn)行了主題為《Robust Containers》的演講之外米丘,他們還介紹了自己開源容器管理軟件Kubernetes和對容器資源進(jìn)行監(jiān)控的cAdvisor剑令。

4.2.2. Red Hat

Red Hat Enterprise Linux 7版將內(nèi)置Docker,雖然版本還是0.11拄查,不過很快就會升級的吁津。另外Atomic項目也是Red Hat主導(dǎo)開發(fā)的。

4.3. 其它感受

其他一些筆者認(rèn)為比較有意思的就是使用基于Mesos工具群來對容器進(jìn)行集群管理了堕扶。比如Twitter和Groupon都做了使用Mesos + Aurora/Marathon + ZooKeeper在數(shù)據(jù)中心進(jìn)行資源分配和管理的分享碍脏;甚至在Twitter看來,數(shù)據(jù)中心也可以看做是一臺計算機(jī)稍算,Mesos就是這臺計算機(jī)的OS典尾。

另外就像我們前面在Docker使用場景中介紹過的那樣,很多公司都在使用Docker進(jìn)行持續(xù)集成邪蛔。

5. Docker現(xiàn)狀及展望

在本節(jié)我們將會站在一個開放的角度和更高的層次來審視一下Docker的現(xiàn)狀急黎,包括其問題點扎狱,以及對Docker將來的可能性做一些膚淺的推測。

5.1. 生態(tài)系統(tǒng)

Docker的發(fā)展離不開其生態(tài)系統(tǒng)?注 14?勃教,我們學(xué)習(xí)Docker也同樣需對其生態(tài)系統(tǒng)有所了解淤击。我們可以從下面三點來審視一下Docker當(dāng)前的發(fā)展?fàn)顩r。

注 14 關(guān)于Docker的生態(tài)環(huán)境故源,大家也可以參考網(wǎng)上有人制作的一份思維導(dǎo)圖污抬。http://www.mindmeister.com/389671722/docker-ecosystem

5.1.1. 廠商支持

前面我們已經(jīng)說過了,包括RedHat等在內(nèi)的Linux發(fā)行商以及Google绳军、AWS印机、Rackspace等云服務(wù)提供商都表示對Docker非常濃厚的興趣,甚至已經(jīng)進(jìn)行了非常深入的實踐门驾。從這一點上來說射赛,Docker有非常好的政治背景。

5.1.2. 開源項目

圍繞Docker的開源項目就更多了奶是,主要有以下幾類楣责,我們將挑選出一些比較有意思且開發(fā)較活躍的項目進(jìn)行簡單介紹。

PaaS平臺

PaaS平臺大多基于容器技術(shù)聂沙,Docker天生就適合做PaaS秆麸。

Flynn

Flynn是一個高度模塊化的下一代開源PaaS實現(xiàn)。Flynn分為兩層及汉,Layer 0是底層沮趣,也叫資源層,基于Google的Omega論文?注 15?開發(fā)坷随,這一層也包括服務(wù)發(fā)現(xiàn)房铭。Layer 1則用來進(jìn)行部署、管理應(yīng)用程序甸箱。Flynn目前開發(fā)比較活躍育叁,是一個值得關(guān)注的開源項目,而且今年夏天很可能就會發(fā)布1.0的版本了芍殖。

注 15?http://eurosys2013.tudos.org/wp-content/uploads/2013/paper/Schwarzkopf.pdf

https://flynn.io/

Deis

Deis是一個支持共有和私有PaaS的開源實現(xiàn)豪嗽。它支持運(yùn)行使用Ruby, Python, Node.js, Java, PHP和Go等語言進(jìn)行應(yīng)用開發(fā),并能部署到AWS, Rackspace和DigitalOcean等云上豌骏。

http://deis.io/

CI/CD(持續(xù)集成/持續(xù)部署)

由于Docker的沙箱性龟梦、創(chuàng)建速度快等特性,它與生俱來也適合進(jìn)行CI/CD窃躲。很多基于Docker的CI/CD開源方案和服務(wù)如雨后春筍般的涌現(xiàn)出來计贰。

Drone

開源的支持各種語言的CI工具,并且提供了CI/CD服務(wù)Drone.io

https://drone.io/

Strider CD

開源的CI/CD方案蒂窒,集成GitHub躁倒。

http://stridercd.com/

私有倉庫托管(Registry)/容器托管

這類服務(wù)主要進(jìn)行私有倉庫的托管荞怒,根據(jù)用戶的托管倉庫數(shù)量收費(fèi)。Doccker Hub也提供私有倉庫的收費(fèi)套餐秧秉。

Quay

Quay除了能托管私有鏡像之外褐桌,還能和GitHub集成,使用Dockerfile進(jìn)行鏡像構(gòu)建象迎。

https://quay.io/

Shippable

Shippable支持Github和Bitbucket荧嵌,并且提供100%免費(fèi)的服務(wù),包括私有倉庫砾淌。

https://www.shippable.com/

Orchard

Orchard也是一個和StackDock類似的Docker托管服務(wù)啦撮,它提供了便捷的命令行工具來運(yùn)行各種Docker命令。同時它也提供免費(fèi)的私有Registry服務(wù)汪厨,前面介紹的Fig工具就是此公司開發(fā)的赃春。

https://www.orchardup.com/

筆者認(rèn)為傳統(tǒng)的云計算服務(wù)提供商除了在云主機(jī)上提供對容器的支持之外,說不定將來還會提供專門托管容器的服務(wù)劫乱。

開發(fā)管理工具

軟件工程師天生就是閑不住和想盡一切辦法要提高自己效率的一群人聘鳞。這里我們簡單介紹兩個方便進(jìn)行Docker開發(fā)的工具。

Shipyard

Shipyard是一個Docker鏡像和容器管理工具要拂,除了基本的鏡像構(gòu)建,容器啟動等功能之外站楚,它還具有在瀏覽器中attach到容器的功能脱惰,并通過hipache?16?來進(jìn)行容器之間的連接。同時它也支持跨節(jié)點的Docker管理和容器Metrics采集窿春。

注 16 Hipache: a distributed HTTP and websocket proxy?https://github.com/dotcloud/hipache

https://github.com/shipyard/shipyard

Fig

Fig是一個為了提高基于Docker開發(fā)的效率而創(chuàng)建的工具拉一,它通過一個配置文件來管理多個Docker容器,非常適合組合使用多個容器進(jìn)行開發(fā)的場景旧乞。

http://orchardup.github.io/fig/index.html

5.1.3. 社區(qū)

Docker開發(fā)社區(qū)非澄等螅活躍,除了35名全職員工(外加一只烏龜)之外尺栖,還有450名左右的外部代碼貢獻(xiàn)者嫡纠。到目前Docker Hub已經(jīng)擁有超過16000多個應(yīng)用,在GitHub上也有超過7000個Docker相關(guān)的項目延赌,其中不乏很多受關(guān)注度非常高的項目除盏。

在Twitter上,科技媒體上以及個人Blog上挫以,每天都能看到很多關(guān)于Docker的內(nèi)容者蠕。

線下社區(qū)活動也在蓬勃展開中。在世界范圍內(nèi)除了南極洲掐松,Docker Meetup已經(jīng)遍布35個國家100多個城市踱侣,北京在今年3月8日舉行了國內(nèi)第一次的Docker Meetup粪小,當(dāng)時有超過40人報名參加。而且第二次北京Docker Meetup將在七月中舉行抡句,目前正在緊鑼密鼓的籌備之中探膊。

5.2. 運(yùn)用中的問題點

雖然Docker很火,有時候我們也需要反過來看看它還有哪些不令我們滿意的地方玉转,或者說在使用上還存有疑慮突想。當(dāng)然這里的問題都是筆者個人主觀看法,只是非常片面的一部分究抓,各位讀者一定要帶著批判性的思維去理解它猾担。

5.2.1. Debug、調(diào)優(yōu)

查看日志可能是最簡單直接的方式了刺下。當(dāng)然也有很多人都會在Docker容器中運(yùn)行一個SSHD服務(wù)绑嘹,然后通過SSH登錄到容器中去,不過不建議使用這種方法橘茉。

官方推薦使用nsenter?注 17?工具來完成類似的工作工腋,通過它可以進(jìn)入到指定的namespace中并控制一個容器。

注 17?https://github.com/jpetazzo/nsenter

5.2.2. 數(shù)據(jù)管理

這里所說的數(shù)據(jù)包括數(shù)據(jù)庫文件畅卓,Log擅腰,用戶上傳的文件等。

在容器中要想處理數(shù)據(jù)文件翁潘,可能最簡單的方式就是通過共享卷標(biāo)來實現(xiàn)趁冈,即?docker run?-v?。但是隨之帶來的問題是既然是文件拜马,都存在備份問題渗勘,如何備份?用ftp或者在容器和宿主機(jī)之間共享文件夾的方式俩莽?而且隨著容器數(shù)量的增多旺坠,對共享卷標(biāo)的管理也勢必會更復(fù)雜。

筆者認(rèn)為理想的解決方法就是使用云服務(wù)扮超,比如數(shù)據(jù)庫使用RDS取刃,文件使用S3。如果不想使用云服務(wù)出刷,則可以考慮自己通過FastDFS等實現(xiàn)自己的“云存儲”蝉衣。Log則通過fluentd/logstash進(jìn)行集計再用Graphite/Kibana等進(jìn)行可視化。

5.2.3. 如何和配置管理工具配合使用

到底在容器時代巷蚪,還需不需要傳統(tǒng)的Puppet或Chef這樣的配置管理工具病毡?當(dāng)然,從配置管理工具的角度來說屁柏,他們都不會放棄對Docker的支持啦膜,比如Puppet就已經(jīng)增加了對Docker(安裝有送、管理鏡像和容器)的支持。

但隨著不可變基礎(chǔ)設(shè)施的普及?注 18?僧家,冪等性將不再重要雀摘,因為我們的容器只需要配置一次。要對容器做出修改八拱,可能只需要修改Dockerfile/manifest/recipe文件重新Provisioning即可阵赠。而且也不需要在容器內(nèi)部安裝任何agent,這樣的話類似Ansible這樣純SSH的配置管理工具比較適合對Docker進(jìn)行配置肌稻。甚至還可能出現(xiàn)專門為Docker的更簡單的配置管理工具清蚀。

注 18 筆者個人偏見而已

5.2.4. 安全性

是軟件就會存在bug,包括安全漏洞爹谭,Docker也不例外枷邪。就在今年6月份,Docker剛爆出了一個容器逸出的漏洞?注 19?诺凡。不管是Hypervisor技術(shù)還是容器技術(shù)东揣,安全問題始終都是一個不可避免的話題,雖然它們出問題的幾率要比中間件軟件(Apache腹泌,Nginx嘶卧、Tomcat)和軟件框架(Struts、Rails)等的概率要小很多凉袱。

注 19?http://blog.docker.com/category/security-2/

事后Docker, Inc.還是比較積極的面對了這件事脸候,除了及時披露詳細(xì)情況之外,還著重強(qiáng)調(diào)了他們的安全政策绑蔫。

5.2.5. 有狀態(tài)和無狀態(tài)容器

在不可變基礎(chǔ)設(shè)施(Immutable Infrastructure)里,一切都可以分為有狀態(tài)(stateful)的和無狀態(tài)(stateless)的泵额,容器也不例外配深。容器似乎更適合跑無狀態(tài)的服務(wù),然而業(yè)內(nèi)對如何分別對待這兩種服務(wù)還沒有太好的最佳實踐嫁盲。

5.3. 對Docker展望

最后再容筆者斗膽對Docker的將來做一些展望篓叶。除了Docker本身自己會蓬勃發(fā)展之外,圍繞Docker的生態(tài)圈必將更加成熟和強(qiáng)大羞秤。

5.3.1. 集群管理(Orchestration)和服務(wù)發(fā)現(xiàn)(Service Discovery)

相對于對單臺機(jī)器進(jìn)行Provisioning而言缸托,云環(huán)境下則需要對多臺機(jī)器進(jìn)行Orchestration。Orchestration這個詞翻譯過來就是編排瘾蛋、編配的意思俐镐,我們也可以理解為集群管理。它主要由兩部分工作組成:

監(jiān)控服務(wù)器哺哼,發(fā)現(xiàn)變化(軟硬件異常佩抹、網(wǎng)絡(luò)異常叼风、正常變更等)根據(jù)監(jiān)視事件采取相應(yīng)的行動。

服務(wù)發(fā)現(xiàn)

在松耦合的分布式環(huán)境下棍苹,應(yīng)用程序不一定跑在同一臺機(jī)上无宿,甚至是跨越數(shù)據(jù)中心的。這時候服務(wù)發(fā)現(xiàn)就顯得格外重要了枢里。

Zookeeper

Chubby?注 20?可以稱得上是很多服務(wù)發(fā)現(xiàn)孽鸡、集群管理軟件的鼻祖了,比如Zookeeper?注 21?栏豺,這些軟件都提供數(shù)據(jù)存儲彬碱、leader選舉、元數(shù)據(jù)存儲冰悠、分布式鎖堡妒、事件監(jiān)聽(或watch,監(jiān)視)等功能溉卓。

注 20?http://research.google.com/archive/chubby.html

注 21?http://zookeeper.apache.org/

etcd

etcd?注 22?很新也很輕量皮迟,安裝很簡單,配置也不復(fù)雜桑寨,所以非常適合入門伏尼。etcd存儲的是key-value格式的數(shù)據(jù)。

etcd是CoreOS的一個組件尉尾。同時CoreOS提供了一個基于公有云的服務(wù)發(fā)現(xiàn)服務(wù)discovery.etcd.io爆阶。

注 22?https://github.com/coreos/etcd

此外,我們還可以有Skydns/Skydock?注 23?沙咏、Discoverd?注 24?等選擇辨图。

注 23 基于DNS的服務(wù)發(fā)現(xiàn)。?https://github.com/crosbymichael/skydock

注 24 Flynn的一個組件肢藐,它目前是基于etcd的故河,但是也可以擴(kuò)展諸如Zookeeper等分布式存儲機(jī)制。https://github.com/flynn/discoverd

集群管理

圍繞Docker使用場景的開源集群管理軟件有很多吆豹,比如Geard鱼的、Fleet、Consul及Serf等痘煤,這些軟件都是隨著Docker應(yīng)運(yùn)而生的凑阶;此外還有很多老牌的集群管理軟件,比如Mesos等也可以很好的結(jié)合Docker使用衷快。

Serf和Consul

Serf?注 25?是一個基于Gossip協(xié)議去中心的服務(wù)器發(fā)現(xiàn)和集群管理工具宙橱,它非常輕量,高可用并具備容錯機(jī)制。

注 25?http://www.serfdom.io/

Consul?注 26?是一個服務(wù)發(fā)現(xiàn)和集群配置共享的軟件养匈,除了K/V store功能之外哼勇,它還支持跨數(shù)據(jù)中心及容錯功能,并能進(jìn)行服務(wù)健康監(jiān)測呕乎。

注 26?http://www.consul.io/

這兩個軟件都Vagrant作者所在公司HashiCorp?注 27?發(fā)布的產(chǎn)品积担,這個公司也值得大家關(guān)注。

注 27?http://www.hashicorp.com/products

Apache Mesos & Marathon & deimos & etc.

Mesos用于對多個節(jié)點的資源進(jìn)行管理猬仁,它將多臺服務(wù)器作為一臺“虛擬機(jī)”看待帝璧,并在這臺虛擬機(jī)上分配資源,用戶通過使用framework進(jìn)行資源管理湿刽。Marathon是一個Mesos的framework的烁,用來啟動、管理需要長時間運(yùn)行的任務(wù)诈闺。deimos則是一個為Mesos準(zhǔn)備的Docker插件渴庆。

其它工具

Cloud Foundry在5月份發(fā)布的Docker版的BOSH工具,有興趣的讀者可以參考一下Decker?注 28?項目雅镊。

注 28 Decker = Docker + Cloud Foundry.?http://www.cloudcredo.com/decker-docker-cloud-foundry/

另外Clocker?注 29?這個項目也比較有意思襟雷,它基于Apache Brooklyn(目前還在孵化器中),能在多云環(huán)境下基于Docker容器進(jìn)行應(yīng)用部署仁烹。這個項目的擴(kuò)展性很好耸弄,非常方便自己定制。不過項目還太年輕卓缰,要想使用的話恐怕還需要些時日计呈。

注 29?https://github.com/brooklyncentral/clocker

5.3.2. 和OS的深度結(jié)合

在Fedora上使用的systemd?注 30?就已經(jīng)提供了集成容器和虛擬機(jī)的功能。

注 30 systemd是用來替代Linux中init系統(tǒng)的系統(tǒng)軟件征唬,目前已經(jīng)在Fedora/RHEL等中采用

Docker除了能在各種主流Linux上使用之外捌显,還出現(xiàn)了有專為運(yùn)行Docker容器而定制的OS了,比如CoreOS?注 31?总寒,RedHat的Atomic?注 32?扶歪。

注 31?https://coreos.com/?,在6月末剛剛宣布獲得了八百萬美元的A輪融資注 32?http://www.projectatomic.io/

CoreOS

CoreOS是一個精簡版的Linux偿乖,可以運(yùn)行在既有硬件或者云上,它也是一個最近備受關(guān)注的項目哲嘲。CoreOS不提供類似yum或者apt類似的包管理工具贪薪,你不需要在CoreOS中安裝軟件,而是讓程序都在Docker容器中去運(yùn)行眠副。CoreOS使用systemd和fleet來對容器進(jìn)行管理画切,通過etcd進(jìn)行服務(wù)發(fā)現(xiàn)和配置信息共享。

Atomic

Project Atomic是最近才發(fā)布的一個項目囱怕,它也是一個瘦身版的Linux霍弹,只包含systemd/geard?注 33?/rpm-OSTree以及Docker組件毫别,專門用來部署和管理Docker容器。它能在接近硬件裸機(jī)級別上高性能的運(yùn)行大量容器典格,而且它還是基于SELinux的岛宦,在安全上也有保障。

注 33?http://openshift.github.io/geard/

5.3.3. Container技術(shù)規(guī)范化和兼容性

就在DockerCon14開始的前一天耍缴,F(xiàn)lynn發(fā)布了Pinkerton砾肺,一個支持在其它容器中使用Docker鏡像的技術(shù)。

而另一方面防嗡,我們知道除了LXC变汪,Docker之外,還有很多其它容器技術(shù)蚁趁,比如Zones,jail和LMCTFY等裙盾,那么試想這么多的容器之上,是否有統(tǒng)一接口他嫡、互相兼容或者在容器上加一層封裝的可能性呢番官?比如讓一種容器的鏡像,能運(yùn)行到其它容器中涮瞻?Docker容器已經(jīng)能互相連接了鲤拿,會不會異構(gòu)的容器之間也能進(jìn)行某種交互呢?

6. 總結(jié)

Docker雖然入門和使用起來非常簡單署咽,但整個生態(tài)系統(tǒng)還是挺龐大的近顷,而且其底層技術(shù)也都很復(fù)雜,由于篇幅有限及筆者學(xué)識不精宁否,也只能說一些皮毛之事窒升,最多只能算是拋塊磚而已;而且筆者也有一種意猶未盡的感覺慕匠,但是由于篇幅所限饱须,不能說到面面俱到,更多的內(nèi)容台谊,還請各位讀者自己去深入挖掘蓉媳。

總之筆者認(rèn)為Docker還是非常有趣的一個東西,值得大家花些時間體驗一下锅铅,相信在各位的工作中多多少少都能用的上Docker酪呻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盐须,隨后出現(xiàn)的幾起案子玩荠,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阶冈,死亡現(xiàn)場離奇詭異闷尿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)女坑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門填具,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人堂飞,你說我怎么就攤上這事灌旧。” “怎么了绰筛?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵枢泰,是天一觀的道長。 經(jīng)常有香客問我铝噩,道長衡蚂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任骏庸,我火速辦了婚禮毛甲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘具被。我一直安慰自己玻募,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布一姿。 她就那樣靜靜地躺著七咧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叮叹。 梳的紋絲不亂的頭發(fā)上艾栋,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音蛉顽,去河邊找鬼蝗砾。 笑死,一個胖子當(dāng)著我的面吹牛携冤,可吹牛的內(nèi)容都是我干的悼粮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼曾棕,長吁一口氣:“原來是場噩夢啊……” “哼扣猫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起睁蕾,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤苞笨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后子眶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瀑凝,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年臭杰,在試婚紗的時候發(fā)現(xiàn)自己被綠了粤咪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蟆湖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情充蓝,我是刑警寧澤卑笨,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站赤兴,受9級特大地震影響妖滔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桶良,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一座舍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧陨帆,春花似錦簸州、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瑰步,卻和暖如春矢洲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缩焦。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工读虏, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袁滥。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓盖桥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親题翻。 傳聞我的和親對象是個殘疾皇子揩徊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡介 Docke...
    極客圈閱讀 10,473評論 0 120
  • Docker — 云時代的程序分發(fā)方式 - 簡書 http://www.reibang.com/p/7745d8d...
    葡萄喃喃囈語閱讀 413評論 0 0
  • 0. 前言 docker是什么嵌赠?docker是用GO語言開發(fā)的應(yīng)用容器引擎塑荒,基于容器化,沙箱機(jī)制的應(yīng)用部署技術(shù)姜挺〕菟埃可...
    sessionboy閱讀 3,838評論 2 49
  • 五、Docker 端口映射 無論如何炊豪,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機(jī)是訪問不到的凌箕。此外拧篮,除了...
    R_X閱讀 1,738評論 0 7
  • 電視機(jī)里傻笑著的大三男孩,輕聲哼唱著《小幸運(yùn)》牵舱,突然就想起了生命中那些稍縱即逝的一點點歡欣他托。用了上午的時間匆匆忙忙...
    morlindeer閱讀 373評論 0 1