服務(wù)項(xiàng)目:網(wǎng)站建設(shè)、仿站、程序開(kāi)發(fā)、APP開(kāi)發(fā)設(shè)計(jì)、移動(dòng)網(wǎng)站開(kāi)發(fā)設(shè)計(jì)、企業(yè)網(wǎng)站設(shè)計(jì)、電子商務(wù)網(wǎng)站開(kāi)發(fā)、網(wǎng)站維護(hù)、網(wǎng)站推廣、UX/UI 、HTML5、CSS3、JS / Jquery ...
四川???萍加邢薰?></a></div>
                    <div   id=四川???萍加邢薰? title=
四川???萍加邢薰?(開(kāi)發(fā)設(shè)計(jì)官網(wǎng))TEL : 15308000360 / QQ : 38585404

您的位置:首頁(yè) > 技術(shù)經(jīng)驗(yàn) > 網(wǎng)站運(yùn)維 > 正文

漫談Docker-云時(shí)代的程序分發(fā)方式
技術(shù)支持服務(wù)電話:15308000360 【7x24提供運(yùn)維服務(wù),解決各類系統(tǒng)/軟硬件疑難技術(shù)問(wèn)題】

要說(shuō)最近一年云計(jì)算業(yè)界有什么大事件?Google Compute Engine

的正式發(fā)布?Azure入華?還是AWS落地中國(guó)?留在每個(gè)人大腦中的印象可能各不相同,但要是讓筆者來(lái)排名的話那么Docker絕對(duì)應(yīng)該算是第一位的。如果你之前聽(tīng)說(shuō)過(guò)它的話,那么也許你會(huì)說(shuō)“沒(méi)錯(cuò),就是它”,因?yàn)閹缀跏澜绺鞯氐拈_(kāi)發(fā)、運(yùn)維都在談?wù)撝鳧ocker;如果你還沒(méi)聽(tīng)說(shuō)過(guò)Docker,那么我真的建議你花上10分鐘來(lái)閱讀本文。

1. Docker簡(jiǎn)介

1.1. 什么是Docker?

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

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

Docker是開(kāi)源軟件,代碼托管在GitHub上,使用Go語(yǔ)言編寫(xiě)。Go可以稱得上是互聯(lián)網(wǎng)時(shí)代專門(mén)為開(kāi)發(fā)分布式、高并發(fā)系統(tǒng)而生的編程語(yǔ)言。Docker也可以說(shuō)是Go語(yǔ)言的一個(gè)殺手級(jí)應(yīng)用,而且在Docker生態(tài)圈里很多軟件也都是使用Go語(yǔ)言編寫(xiě)的。

1.2. Docker歷史

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

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

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

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

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

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

1.3.1. 容器技術(shù)

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

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

容器技術(shù)在云計(jì)算時(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”,每周啟動(dòng)容器次數(shù)竟然多達(dá)20億次。

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

很多PaaS平臺(tái)都是基于容器技術(shù)實(shí)現(xiàn)的,比如目前最成功的PaaS平臺(tái)Heroku。此外,還有比較著名的開(kāi)源PaaS平臺(tái)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下使用比較廣泛的容器方案?;旧衔覀兛梢哉J(rèn)為L(zhǎng)inux containers = cgroups(資源控制) + namespaces(容器隔離)。

LXC很成熟很強(qiáng)大,然而它卻不好使用,比如它不方便在多臺(tái)機(jī)器間移動(dòng),不方便創(chuàng)建管理,不可重復(fù)操作,也不方便共享等等,相對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),它只是系統(tǒng)管理員的玩具。Docker的出現(xiàn)很好的解決了這些問(wèn)題,它將容器技術(shù)的使用成本拉低到了一個(gè)平民價(jià)格。

1.3.3. namespaces

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

1.3.4. cgroups

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

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

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

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

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

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

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

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

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

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

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

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

1.5. 我們能用Docker干什么?

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

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

1.5.1 在開(kāi)發(fā)中

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

簡(jiǎn)單包括幾個(gè)方面的意思

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

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

1.5.2. 在測(cè)試中

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

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

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

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

使用Docker的話你再也不用為此煩惱了。因?yàn)槟憬桓兜臇|西不光是你的代碼、配置文件、數(shù)據(jù)庫(kù)定義,還包括你的應(yīng)用程序運(yùn)行的環(huán)境:OS加上各種中間件、類庫(kù) + 你的應(yīng)用程序。

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

基于容器的部署和自動(dòng)化

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

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

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

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

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

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

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

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

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

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

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


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



上一篇:億級(jí)Web系統(tǒng)搭建—單機(jī)到分布式集群
下一篇:重新思考數(shù)據(jù)中心網(wǎng)絡(luò)

相關(guān)熱詞搜索:docker 分發(fā)方式