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