為什么Ruby程序員應(yīng)該了解和掌握Docker

Docker技術(shù)在ruby社區(qū)是有影響力的,我所知道的一些創(chuàng)業(yè)團(tuán)隊(duì)很早就在運(yùn)用它來解決環(huán)境管理、持續(xù)集成以及部署的問題了。但是,也有一些同學(xué)尚未注意到這個(gè)技術(shù),或者了解過后認(rèn)為它不是很重要,所以我想討論一下Docker對(duì)Ruby系技術(shù)的幫助。

有的人可能對(duì)Docker技術(shù)不太了解,不妨參考論壇里的這篇文章以及肖德時(shí)寫的系列文章

Docker 與 Vagrant

我一直很喜歡Vagrant這個(gè)工具,兩三年前就用它來進(jìn)行自己項(xiàng)目的環(huán)境維護(hù),那時(shí)候主要是做測(cè)試,由于Vagrant將操作系統(tǒng)環(huán)境進(jìn)行了標(biāo)準(zhǔn)化,我很容易就能讓自己的應(yīng)用系統(tǒng)以及相關(guān)的測(cè)試結(jié)果保持穩(wěn)定。

Vagrant還有一個(gè)好處,Ruby社區(qū)比較偏愛Mac,但是線上的系統(tǒng)基本都是Linux,所以開發(fā)環(huán)境所做的測(cè)試是有疑問的,特別是遇到一些有so依賴的gem,這時(shí)一個(gè)和線上完全一樣的環(huán)境就特別重要。

其實(shí)上面的表述不太準(zhǔn)確,vagrant也有各種provider,我所說的場(chǎng)景,基本上都是virtualbox的provider,所以這些地方正確的說法是 vagrant/virtualbox。

和Docker相比,vagrant/virtualbox組合的成本還是很高的,無論是setup一個(gè)環(huán)境還是reset一個(gè)環(huán)境,都需要一段時(shí)間的等待,vagrant只是把virtualbox的操作DSL了而已,底層的做法沒有變化。而Docker由于本質(zhì)上就是一個(gè)進(jìn)程,因此天生就是輕量級(jí)的。對(duì)于運(yùn)行時(shí)間在分鐘級(jí)別的自動(dòng)化測(cè)試工作,docker顯然有很大的優(yōu)勢(shì)。

當(dāng)然,也有人會(huì)認(rèn)為docker不能模擬完整的操作系統(tǒng),不過這恐怕是一個(gè)優(yōu)點(diǎn)而不是缺點(diǎn)。我在以前的文章中已經(jīng)說過了,這里概述一下主要觀點(diǎn)——

docker簡(jiǎn)化了操作系統(tǒng)這個(gè)基礎(chǔ)設(shè)施,讓應(yīng)用精簡(jiǎn)為其最核心的形態(tài)——攜帶有限資源的進(jìn)程,在此基礎(chǔ)上更有利于架構(gòu)上的最佳實(shí)踐

而對(duì)Ruby工程師而言,這個(gè)“最佳實(shí)踐”中肯定少不了的一條就是——微服務(wù)

微服務(wù)

Ruby工程師中有很多就是Rails工程師,而Rails實(shí)際上更傾向于單體架構(gòu),因此后來社區(qū)的工程師們才需要在實(shí)際工作中總結(jié)1 to 30這樣的實(shí)踐。

其實(shí)微服務(wù)本身不是個(gè)教條,即使沒有人教,我們也常常自發(fā)的去進(jìn)行服務(wù)化改造,但是這個(gè)工作并不容易,主要是會(huì)受到一些問題的掣肘,比如運(yùn)維復(fù)雜度和系統(tǒng)測(cè)試成本會(huì)大幅度上升等等。

處理這些困難,首先當(dāng)然是看是否必要,一些簡(jiǎn)單場(chǎng)景我們也可以用單體架構(gòu)直接搞定,但是我們很容易會(huì)注意到,這兩年大家越來越多的提到了微服務(wù)或者服務(wù)化,這背后其實(shí)是有趨勢(shì)的——各種業(yè)務(wù)形態(tài)都在朝著互聯(lián)網(wǎng)級(jí)的用戶規(guī)模推進(jìn),同時(shí)大家都在努力從每一個(gè)用戶的各種維度上挖掘價(jià)值(這導(dǎo)致了大數(shù)據(jù)的需求),這些場(chǎng)景變得越來越常見,單體架構(gòu)是難以支持的。

既然微服務(wù)或者服務(wù)化不可避免,那么就要有相應(yīng)的對(duì)策,雖然Ruby社區(qū)也有很多人在不同問題點(diǎn)上針對(duì)微服務(wù)進(jìn)行改進(jìn)(比如完善異步化框架,以及對(duì)服務(wù)協(xié)議的探索等),但是在基礎(chǔ)設(shè)施層面,Docker是最重要的武器,沒有之一!

對(duì)Ruby工程師來說,Docker能做兩件事:約束邊界和建立通用基礎(chǔ)服務(wù)。

約束服務(wù)邊界

Ruby項(xiàng)目Docker化,并不是簡(jiǎn)單換個(gè)虛擬機(jī)那么簡(jiǎn)單,我們會(huì)面對(duì)拆分的壓力,相信很多人嘗試用Dockerfile來描述自己的項(xiàng)目的時(shí)候都會(huì)覺得束手束腳,但這些地方其實(shí)是促使我們想清楚——這個(gè)應(yīng)用到底要做什么?它和外界是什么關(guān)系?對(duì)于外界的變化它如何響應(yīng)?失敗后怎樣恢復(fù)?

這類的問題對(duì)系統(tǒng)架構(gòu)非常重要。比如應(yīng)用到底要做什么,這是讓工程師去思考系統(tǒng)的目標(biāo),無論是提供web服務(wù),管理調(diào)度后臺(tái)任務(wù),還是提供實(shí)時(shí)分析,它們都應(yīng)該有一個(gè)盡可能單一的目標(biāo),在這個(gè)基礎(chǔ)之上,我們建立的服務(wù)才有可能是易測(cè)試、易擴(kuò)展和易維護(hù)的。

其它問題也類似,這些地方以前如果沒有留意,很可能不是沒問題,而是沒意識(shí)到,使用Docker有助于我們意識(shí)到這些問題。

另外補(bǔ)充一點(diǎn),由于Ruby項(xiàng)目不能完全脫離動(dòng)態(tài)庫依賴(java大都可以),本身的打包機(jī)制又沒有自包含結(jié)構(gòu)(gem+bundle不包括動(dòng)態(tài)庫,相比之下,Golang是靜態(tài)聯(lián)編的),在分布式環(huán)境中的交付和軟件包分發(fā)其實(shí)是有著先天不足的,Docker的Image恰好補(bǔ)上了這一塊,簡(jiǎn)直是睡覺時(shí)候有人送枕頭了。

建立通用基礎(chǔ)服務(wù)

當(dāng)我們將應(yīng)用系統(tǒng)分裂為各種服務(wù)并明確其邊界以后,就出現(xiàn)了“分久必合”的問題,這很自然,服務(wù)化改造并不是各行其是,應(yīng)用之間還是要協(xié)作,而對(duì)應(yīng)用的運(yùn)維——服務(wù)發(fā)現(xiàn)、水平擴(kuò)展、容錯(cuò)等等——都需要基礎(chǔ)設(shè)施的支持。

以前,對(duì)于這種運(yùn)維基礎(chǔ)設(shè)施,各公司甚至同一個(gè)公司的各個(gè)團(tuán)隊(duì)的做法都千差萬別,
但是借助Docker以及周邊的生態(tài)圈,我們可以很容易的得到通用的服務(wù)發(fā)現(xiàn)框架,享受自動(dòng)的部署和彈性擴(kuò)展。

更好的消息是,這些基礎(chǔ)服務(wù)是通用的——不但不關(guān)心是rails還是sinatra,甚至根本不關(guān)心是不是ruby。

這也很好理解,Docker是對(duì)進(jìn)程這個(gè)操作系統(tǒng)工作單元進(jìn)行了簡(jiǎn)化約束,而進(jìn)程的概念本來就是與語言和框架無關(guān)的

這使得Ruby工程師以及Ruby項(xiàng)目可以更為自由的選擇合適的技術(shù)去擴(kuò)展公司的產(chǎn)品線。

延伸技術(shù)框架

Ruby 剛出來的時(shí)候,有很多來自 Java 社區(qū)的工程師加入其中(我也算是其中之一吧),很多人最大的感受是——視野被打開了。曾經(jīng)象口號(hào)一樣的“all in java”變成了落后的標(biāo)志,大家意識(shí)到,一把鑰匙開一把鎖,用最合適的技術(shù)針對(duì)性的解決問題才是聰明的做法,單純排斥某種技術(shù)或者語言框架并不明智。

這個(gè)道理在Ruby/RoR應(yīng)用開發(fā)中也不例外,但是不少人在使用了幾年ruby以后都會(huì)遇到一個(gè)問題——“ruby確實(shí)很適合開發(fā)Web,但是現(xiàn)在有些問題需要使用XX技術(shù),而我們的系統(tǒng)嚴(yán)重依賴ruby環(huán)境,這該怎么辦呢?”

我認(rèn)為問題就出在“系統(tǒng)嚴(yán)重依賴ruby環(huán)境”上,研發(fā)的基礎(chǔ)設(shè)施,比如配管、自動(dòng)化測(cè)試、打包、部署,不應(yīng)該僅滿足一種技術(shù)或是語言,它一開始就要考慮到通用性,否則我們就只能“手里拿著錘子,看誰都像釘子”。

Docker本身和語言無關(guān),它唯一的約束大概就是要運(yùn)行在Linux上,這個(gè)對(duì)互聯(lián)網(wǎng)服務(wù)端系統(tǒng)來說也算是標(biāo)準(zhǔn)了,問題不大。所以,我們應(yīng)該以Docker為核心打造研發(fā)的基礎(chǔ)設(shè)施,這將是未來的一筆重要投資。

當(dāng)然,為未來畫餅是危險(xiǎn)的,不過還好,Docker領(lǐng)域的創(chuàng)業(yè)很活躍,有很多團(tuán)隊(duì)和公司已經(jīng)做了相當(dāng)多的基礎(chǔ)工作,對(duì)于Ruby工程師和Ruby創(chuàng)業(yè)團(tuán)隊(duì),去用現(xiàn)成的基礎(chǔ)設(shè)施其實(shí)更方便。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容