容器技術的火爆和日益普及已經成為不爭的事實,眾多公有云平臺紛紛支持Docker,AWS、Google、Azure、阿里云以及國內的各大公有云廠商都推出了容器云業(yè)務,國內也有不少創(chuàng)業(yè)公司通過構建容器Paas平臺幫助企業(yè)實現(xiàn)微服務架構改造。
達觀數據作為領先的人工智能企業(yè),在容器技術領域也積累了比較多的實踐經驗。達觀提供的文本挖掘、智能推薦、垂直搜索,無論是公有云服務,或者私有化部署,主要是基于容器云實現(xiàn),從而保證部署的高效率、服務的穩(wěn)定性、快速可擴展性和應用的隔離性,為我們的客戶提供了持續(xù)升級的長久穩(wěn)定服務。
發(fā)布一個應用的經典過程一般是這樣:首先要在測試服務器上進行開發(fā),配置環(huán)境依賴并測通;再到生產環(huán)境中,為一臺臺服務器配置環(huán)境依賴并部署應用。即使現(xiàn)在已經進入云計算時代,整個發(fā)布過程依然沒有太大變化。當我們有大量架構迥異的應用服務,需要發(fā)布到多種環(huán)境,如本地環(huán)境、虛擬機環(huán)境、公有云環(huán)境等等,底層使用的又是各種不同類型的硬件,稍有不慎就會導致發(fā)布失敗。
?
圖 1 異構應用部署到多樣硬件的問題
從下面的矩陣圖可以更直觀的感受到我們面對的困難之大,矩陣的列代表不同的硬件環(huán)境,行代表各種應用/服務。矩陣列出了一個應用的發(fā)布或者重構所要考慮的復雜情況,不管是應用的開發(fā)人員,還是系統(tǒng)運維人員,都必須從一開始就要考慮復雜環(huán)境帶來的問題,以保證發(fā)布和升級的順利。
圖 2 異構應用和多樣硬件矩陣
解決這個問題的思路非常有意思。Docker公司給出了非常形象的比喻:集裝箱運輸。1960年之前的全球化運輸過程如下圖所示,不同的貨物和不同的運輸方式也構成了一個龐大的矩陣。托運貨物的人,和搬運工會擔心不同類型的貨物放在一起會造成相互碰撞、擠壓導致?lián)p壞。
然而將不同貨物分類進行運輸是一種非常高成本、低效率的解決方式,貨物在運輸途中可能需要在某個港口卸貨,與來自其他地方的同類型貨物一起裝車,再運到下一個目的地。整個運輸過程導致大量的貨物被損壞,或者被盜。
圖 3 1960年以前的貨物運輸
全球化運輸現(xiàn)在已經不是問題,各個港口整齊堆放的集裝箱就是完美的解決方案。各種類型的貨物,小到奶粉、化妝品,大到特斯拉跑車,都可以被裝箱到一個標準的集裝箱內。托運貨物的人只需要保證貨物在集裝箱內的密封和固定,而無需關心集裝箱如何被擺放和運輸。
負責運輸的人則無需關心一個個集裝箱內裝的不同貨物,只需把集裝箱當做一個封閉、無差別的獨立個體,進行裝載,卸貨,堆放,運輸,整個過程中集裝箱保持封閉狀態(tài)直到被運送到目的地。從輪船到火車,再到卡車運輸,都可以利用起重機(吊車)對集裝箱進行操作,實現(xiàn)流程的自動化,從而以非常廉價的方式,有效解決了不同類型貨物在長距離運輸中的問題。
圖 4 標準化集裝箱解決運輸問題
將Docker比喻為代碼方面的集裝箱綜合運輸系統(tǒng),確實非常形象而恰當。Docker將任何類型的應用(貨物)和它的依賴打包成為一個標準的,輕量級的,便攜的,獨立的集裝箱,讓各類應用都支持一套標準的運作模式,只要安裝了Docker程序的服務器都可以運行。
開發(fā)者在筆記本上開發(fā)和測試完成的Docker容器,可以無差別的運行在測試環(huán)境、生產環(huán)境,無論服務器是物理機、虛擬機、公有云服務器上,或者是以上各種類型服務器的組合。應用開發(fā)過程只需執(zhí)行一次,即可保證應用在任何環(huán)境上運行的一致性。對于運維人員,則只需要配置一次不同環(huán)境的服務器,即可運行任何Docker容器,不管容器是web服務還是api系統(tǒng),規(guī)避了傳統(tǒng)部署方式中開發(fā)、測試、生產和其他環(huán)境的不一致性問題。
圖 5 標準化的Docker技術解決代碼“運輸”問題
Docker技術的有多重特點和優(yōu)勢,我們基于實踐經驗進行簡單總結,其在實際應用中體現(xiàn)出的主要特性有以下三個方面:
環(huán)境標準化和持續(xù)部署
前面已經提到,傳統(tǒng)的開發(fā)和部署的生命周期中,常常因為不同環(huán)境的細微差異導致應用運行失敗,例如依賴的缺失或者版本不匹配。Docker的出現(xiàn)很好的解決了這一問題,保證了從開發(fā)、測試到部署的環(huán)境一致性。Docker將應用和所需的配置和依賴一起打包到鏡像中,在不同環(huán)境中只要使用同一個鏡像,即可保證應用的正常運行,無需其他人工干預,這也是Docker對開發(fā)和運維人員都有巨大吸引力的原因。
隔離性
Docker不同容器志堅是相互隔離的,每個容器使用自己的環(huán)境和資源。使用不同堆棧的應用程序基于Docker可以運行在同一個宿主機上,相互之間不會產生影響,也就不會產生使用源碼部署常常會遇到的依賴相互沖突的問題。使用源碼部署的另一個問題,是當從宿主機上刪除應用的時候,刪除依賴的時候就需要考慮是否有別的應用也在使用,經常導致誤刪依賴影響其他應用,或者忘記刪除無用的依賴?;贒ocker則不會有此類問題,當我們不再需要某個應用的時候,可以簡單的通過刪除容器,則應用的代碼和依賴會作為一個整體一并刪除,同時也不影響其他應用。
版本控制
Docker另一個重要功能,是提供了類似git倉庫一樣的鏡像倉庫Docker hub,支持開發(fā)人員將鏡像的變更提交到Docker hub倉庫,并通過版本號進行管理。發(fā)布變更的時候也只需要修改鏡像版本號并重啟容器,假設發(fā)布的變更引入了一個bug,也可以非常快速的回滾到前一個版本。相比虛擬機,Docker的啟動和停止非常快速,如同運行一個進程一般,整個變更的過程往往只需幾分鐘時間。
傳統(tǒng)的虛擬機通過硬件虛擬化創(chuàng)造一個虛擬的系統(tǒng),每個虛擬機都有自己的內存、硬盤和操作系統(tǒng),預分配的資源會被虛擬機完全占用。使用虛擬機來隔離應用會造成比較大的資源浪費,一個應用加上依賴只有幾十到幾百M的大小,而操作系統(tǒng)往往還需要消耗10G左右容量。
?
圖 6 容器技術和虛擬機的對比
?
上圖展示了容器技術和虛擬機的區(qū)別。容器包含了應用和所需的依賴,但不需要獨占資源,沒有一個虛擬系統(tǒng),而是和宿主機共享硬件資源和操作系統(tǒng),和其他容器共享內核,從而實現(xiàn)資源的動態(tài)分配。多個容器在同一個宿主機操作系統(tǒng)中的用戶空間以獨立的進程運行。因此,容器相比虛擬機要輕量許多,在一個主機上可以同時啟動近百個容器,一個應用要在數量上橫向擴展非常便捷,而虛擬機則幾乎不可能啟動同樣多的數量。對于重啟操作,容器近似于重啟一個進程,而虛擬機則相當于重啟操作系統(tǒng)。
隨著容器技術的日益成熟,微服務架構也有了越來越多的實踐落地。傳統(tǒng)集中式架構開發(fā)的大型應用,比如CRM、ERP等系統(tǒng),在今天看來已經顯得過于龐大復雜,缺乏靈活性,隨著新需求的不斷出現(xiàn),對集中式架構的升級和調整變得日益困難,比如修改原有系統(tǒng)以適配移動設備。技術層面上,現(xiàn)在已經有大量的輕量級開源技術,包括容器技術,在互聯(lián)網、云計算、人工智能領域被大量運用,催生了微服務架構的出現(xiàn)。下圖展示了服務架構的演變。
圖 7 軟件系統(tǒng)架構演變
微服務架構是指一個較為復雜的應用由多個相對“微小”的服務組成,每個微服務只負責完成一個特定的任務,可以被獨立部署,支持快速的橫向擴展。各個微服務之間以松耦合的方式相互配合,不同的服務可以部署在不同的服務器上。每個微服務將相關的業(yè)務邏輯和數據放在一起,可以看作是整個應用的組件,可以被獨立升級甚至替換。這樣做的好處是保證各個微服務相互獨立,從而實現(xiàn)快速交付和迭代升級。
Docker容器技術的特性使其天然地適用于微服務的落地實現(xiàn),一個容器實現(xiàn)一個微服務,在服務器集群上運行各個微服務容器,來構建一套完整的應用。為了支持多租戶,甚至可以部署多套完全相同的應用,每套應用服務一個或一部分租戶,應用之間相互隔離,應用的資源也按照租戶的使用量來分配。
當容器和服務器的數量達到一定規(guī)模的時候,就會碰到管理的問題,即如何有效管理大量的服務器和容器,保證應用的穩(wěn)定運行、方便升級和故障的快速解決。容器編排工具提供圖形化界面或者命令行來管理容器和服務器集群,提供容器配置、任務發(fā)布、服務發(fā)現(xiàn)、負載均衡、系統(tǒng)監(jiān)控和故障恢復、聲明式系統(tǒng)配置以及有關容器部署和性能的規(guī)則和約束定義機制等。
?
從最新趨勢來看,Google開發(fā)的Kubernetes從眾多編排工具中脫穎而出,贏下了容器編排工具大戰(zhàn)?;?a href="http://35285.cn/">達觀數據自身的容器實踐經驗,Kubernetes是所有編排工具中穩(wěn)定性最高的,尤其是在管理較大規(guī)模的容器集群時,這和業(yè)界同行的實踐經驗基本吻合。Kubernetes針對pods進行調度,pod是最小的基本單位。一個pod封裝一個或多個容器、存儲資源、一個獨立的網絡IP以及管理控制容器運行的策略。Pod封裝的多個容器一定是緊耦合的,它們之間能共享資源。
?
相比Kubernetes,Docker原生編排工具Swarm在集群搭建和使用上要相對簡單一些,學習和部署成本相對低一些。較新版本的Docker已經集成了Swarm。Swarm支持跨多個主機進行編排,管理較小規(guī)模的容器集群也綽綽有余,對于初學者也可以很快的部署和運行。
容器技術為軟件開發(fā)和系統(tǒng)運維帶來了顛覆性的突破,在達觀數據的客戶中,不管是新晉的互聯(lián)網企業(yè),還是久居行業(yè)重心的傳統(tǒng)企業(yè),都紛紛擁抱容器技術,開啟了系統(tǒng)架構的容器化升級和微服務轉型。如此大規(guī)模的不分行業(yè)的普及,足以預示容器技術無可限量的發(fā)展前景,而隨著容器技術的普及,系統(tǒng)開發(fā)和管理的效率必將上升到一個新的臺階,為企業(yè)帶來效益的提升。
-
https://github.com/DeanXu/Docker-introduce/blob/master/README.md
-
https://www.weave.works/blog/comparing-container-orchestration
-
http://docs.kubernetes.org.cn?
-
https://docs.docker-cn.com/
BOUT
關于作者
紀傳俊,達觀數據聯(lián)合創(chuàng)始人,承擔公司重大緊急項目的架構設計和研發(fā)管理工作。復旦大學計算機專業(yè)碩士,曾任職于盛大創(chuàng)新院推薦組負責起點中文網和酷六視頻的相關推薦,后任職于盛大文學數據中心全面負責大數據挖掘任務調度系統(tǒng),智能審核系統(tǒng)和反作弊系統(tǒng)。對大數據挖掘技術,機器學習算法,分布式集群搭建和任務調度有較深入的理解和實踐經驗。
?