歡迎來到被容器技術(shù)改變的世界!
譯文如果你將容器整合到構(gòu)建工作流程中,我們未來的多云環(huán)境的所有要素都開始落實(shí)到位。
現(xiàn)代應(yīng)用程序取得發(fā)展很大程度上歸功于方興未艾的開發(fā)運(yùn)營(yíng)(DevOps)潮流以及由此帶來的各種自動(dòng)化工具。如今,廣大開發(fā)人員在考慮問題時(shí)需要著眼于使用的工具以及這些工具從最初設(shè)想到實(shí)際應(yīng)用程序的整個(gè)流程中如何協(xié)同使用,而不是僅僅著眼于編寫代碼。
容器是這種新工作流程中最重要的新工具之一。諸如Docker之類的新技術(shù)幫助我們獲得關(guān)鍵服務(wù)后,將它們從底層基礎(chǔ)設(shè)施中抽象出來。這種方法讓我們得以重新思考如何部署應(yīng)用程序,以及如何才能充分地利用云基礎(chǔ)設(shè)施。
完整的基礎(chǔ)設(shè)施
在亞馬遜公司近日于倫敦召開的一次大會(huì)上,AWS的一位用戶描述了他的團(tuán)隊(duì)如何處理應(yīng)用程序的更新:他們不是簡(jiǎn)單地推送更改后的代碼,而是讓構(gòu)建過程的輸出成為“完整的基礎(chǔ)設(shè)施”。
只有該基礎(chǔ)設(shè)施部署并測(cè)試完畢后,他才會(huì)切換到DNS,讓它成為一個(gè)活動(dòng)系統(tǒng)。這種方法具有諸多優(yōu)點(diǎn),尤其是讓你可以在投入運(yùn)行的頭幾天當(dāng)中將舊的虛擬基礎(chǔ)設(shè)施當(dāng)成備用系統(tǒng),之后再刪除。
推出完整的基礎(chǔ)設(shè)施這一想法最初看起來似乎很奇怪,但是當(dāng)你考慮了云部署的經(jīng)濟(jì)性后,它比部署更新要來得省錢多了。它還意味著你部署的是一種已知狀態(tài),而不是更新可能運(yùn)行了一段時(shí)間,操作系統(tǒng)或軟件可能自動(dòng)更新的服務(wù)器和服務(wù)。
這種辦法不需要投資硬件。開發(fā)、測(cè)試和生產(chǎn)可以使用同樣的云平臺(tái)――只需要為每種環(huán)境提供不同的虛擬網(wǎng)絡(luò)就行,另外輔以適當(dāng)?shù)脑L問控制措施。你甚至可以在開發(fā)過程中使用生產(chǎn)數(shù)據(jù),需要干凈數(shù)據(jù)時(shí)只要克隆數(shù)據(jù)存儲(chǔ)區(qū)。
無所不包的容器
使用Docker對(duì)應(yīng)用程序進(jìn)行容器化處理,讓你易于從基礎(chǔ)設(shè)施抽象出關(guān)鍵的應(yīng)用程序元素。用這種方式處理軟件從開發(fā)運(yùn)營(yíng)方面來看頗為明智,你還更容易對(duì)需求不斷變化的服務(wù)進(jìn)行擴(kuò)展。如果用容器來封裝Node.js/Seneca微服務(wù),就可以快速部署新的實(shí)例,可以根據(jù)需要部署在同一個(gè)主機(jī)上,或者部署在新的虛擬機(jī)中。
這種方法帶來了一種令人關(guān)注的開發(fā)運(yùn)營(yíng)模式:冪等容器(idempotent container)。你構(gòu)建的容器可以一并封裝應(yīng)用程序、服務(wù)以及所有的依賴項(xiàng),而不是讓應(yīng)用程序或服務(wù)當(dāng)成構(gòu)建的終點(diǎn)。你啥時(shí)作出改變,你就構(gòu)建一個(gè)新的容器;你測(cè)試和部署容器時(shí)將其視為一個(gè)整體,而不是單個(gè)元素。這種方法非常明智,消除了開發(fā)過程中的某些風(fēng)險(xiǎn)。在傳統(tǒng)的構(gòu)建模式中,我們很容易走捷徑,僅僅測(cè)試變更部分,而不是測(cè)試整體部分。
一旦容器構(gòu)建并部署完畢,它應(yīng)該不會(huì)發(fā)生變化,除非又有新的容器已部署。由于容器就是沙盒,因此想與其中的內(nèi)容進(jìn)行交互,***的辦法就是通過API或(對(duì)最終用戶而言)通過容器提供的任何用戶界面(UI)。這使得容器成了微服務(wù)的理想抽象機(jī)制,服務(wù)API是***的接觸點(diǎn)。由于API定義好比是開發(fā)運(yùn)營(yíng)團(tuán)隊(duì)之間的一份契約,在小型服務(wù)器實(shí)例(比如CoreOS或微軟新的Nano Server)上運(yùn)行的容器就成了一種標(biāo)準(zhǔn)的基礎(chǔ)設(shè)施構(gòu)建模塊。
隨流而行
所以,看到Jenkins構(gòu)建流水線工具增添了對(duì)Docker的支持就不足為奇了。Jenkins已經(jīng)成為許多構(gòu)建流程中的一種標(biāo)準(zhǔn)構(gòu)建工具。其可以定制的模塊化架構(gòu)讓你很容易針對(duì)特定的工作流進(jìn)行調(diào)優(yōu),也很容易與源代碼控制工具和開發(fā)及測(cè)試平臺(tái)進(jìn)行整合。
正如Cloudbees的***技術(shù)官兼Jenkins項(xiàng)目創(chuàng)始人Kohsuke Kawaguchi在大會(huì)上所言,為Jenkins增添支持Docker的功能很有必要:“這促進(jìn)了對(duì)Jenkins的需求,將Docker當(dāng)作一種可執(zhí)行的程序包格式。你可以編譯并打包成二進(jìn)制代碼塊,然后你可以拿來運(yùn)行,不再需要時(shí)可以一扔了之。”
從Kawaguchi的這番話中顯然能看出,Docker及其他容器格式很吻合Cloudbees在Jenkins方面的愿景,“你可將其用于測(cè)試、用于生產(chǎn)。測(cè)試未通過,可以重新構(gòu)建??梢詫⒋a編譯成模塊,就像Ruby gem那樣,然后放入到容器,發(fā)送給Puppet用于部署。”
作為整個(gè)開發(fā)運(yùn)營(yíng)策略的一部分,這種做法有其道理:從基礎(chǔ)設(shè)施往下的一切都是代碼。正如Kawaguchi指出的那樣,如果一切都是代碼,“Git和Jenkins好比是相對(duì)代碼這些釘子的錘子。”
雖然Docker的文件格式對(duì)容器界來說目前是通用格式,不過看到Linux基金會(huì)贊助開發(fā)一種通用、開放的容器格式是件好事。這個(gè)項(xiàng)目已將許多容器開發(fā)人員和廠商聚集到一起,包括微軟等公司。如果有一種通用的容器格式得到業(yè)界的廣泛支持,我們就能夠利用同一個(gè)構(gòu)建流程,向多家云提供商(私有云和公有云)交付容器了。
一種通用的容器格式解決不了管理不同的云基礎(chǔ)設(shè)施定義方面的的所有問題,但是無疑多少會(huì)有助于讓人們更容易在Azure與AWS或在OpenStack與谷歌云之間遷移服務(wù)。同樣,借助由Puppet或Chef描述,并由Git軟件庫管理的的基礎(chǔ)設(shè)施,就有可能開發(fā)出一種轉(zhuǎn)換層,這種轉(zhuǎn)換層拿來應(yīng)用程序普通的虛擬機(jī)和網(wǎng)絡(luò)描述后,就能為你的任何目標(biāo)云提供商交付適當(dāng)?shù)木幣殴δ堋?/p>
一切都是代碼這種想法并不新穎,但現(xiàn)在邁出了讓這成為現(xiàn)實(shí)的步伐。由于Docker和Jenkins等工具相輔相成,我們現(xiàn)在開始看到它實(shí)際上有可能如何發(fā)揮效果。
原文標(biāo)題:How containers change everything