天云軟件技術(shù)沙龍,帶你近距離了解Docker等容器技術(shù)!
原創(chuàng)在數(shù)據(jù)爆炸的今天,企業(yè)對(duì)互聯(lián)網(wǎng)應(yīng)用的要求一方面是速度,要求可以快速迭代,適應(yīng)市場(chǎng)需求變化;另一方面是穩(wěn)定性,在面對(duì)用戶量不斷增長(zhǎng)以及軟件應(yīng)用不斷更新的情況下,可以依然保持業(yè)務(wù)持續(xù)不中斷。這也是云計(jì)算發(fā)展的一個(gè)方向,用戶可以不必自己部署、安裝基層應(yīng)用,因?yàn)榭梢灾苯咏唤o云平臺(tái)實(shí)現(xiàn)。而在這方面,Docker是一個(gè)尤其典型的應(yīng)用!關(guān)于Docker等容器技術(shù),你究竟了解多少?其使用場(chǎng)景都有哪些呢?9月24日,由DockOne社區(qū)和天云軟件聯(lián)合主辦的容器技術(shù)沙龍?jiān)诒本㊣C咖啡舉辦,由各位技術(shù)大咖帶你近距離了解Docker!
作為一個(gè)標(biāo)準(zhǔn)的中間件,Docker相當(dāng)于云計(jì)算的“集裝箱”,承載著后端的各種技術(shù),并且可以保障多個(gè)技術(shù)同時(shí)運(yùn)行的速度。技術(shù)人員只需關(guān)注將自己開發(fā)好的代碼、技術(shù)放在Docker鏡像里面,而運(yùn)維人員也只需關(guān)注讓這種標(biāo)準(zhǔn)化的Docker在平臺(tái)上運(yùn)行起來(lái)即可。
首先,中國(guó)電信云計(jì)算公司研發(fā)工程師張其棟給大家?guī)?lái)“中國(guó)電信基于Mesos+Docker的運(yùn)維自動(dòng)化在CDN中的實(shí)踐”的主題演講。
張其棟首先表示,使用Mesos+Docker的大背景是中國(guó)電信云公司的CDN架構(gòu)。之所以采用這樣的架構(gòu),是因?yàn)楹笃诘臉I(yè)務(wù)范圍比較大,用戶比較廣,后期的設(shè)備量會(huì)達(dá)到幾萬(wàn)臺(tái),如果用傳統(tǒng)的思路進(jìn)行運(yùn)維,對(duì)于運(yùn)維的壓力太大。
張其棟認(rèn)為容器技術(shù)有自動(dòng)化部署、持續(xù)集成、敏捷開發(fā)和提高開發(fā)效率、彈性調(diào)度、資源復(fù)用等優(yōu)勢(shì)。他表示,中國(guó)電信在選擇了Docker之后,首先是實(shí)現(xiàn)業(yè)務(wù)軟件的容器化。比如直播轉(zhuǎn)碼業(yè)務(wù)軟件實(shí)現(xiàn)容器化。在實(shí)現(xiàn)了業(yè)務(wù)容器化之后,就需要選擇編排軟件。中國(guó)電信最終選擇的是Apache的Mesos。另外,他給出了選擇Mesos的如下幾個(gè)原因:一是相對(duì)比較成熟;二是數(shù)據(jù)分析相關(guān)軟件跟Mesos結(jié)合起來(lái)更容易。
當(dāng)然在Docker落地過(guò)程中也遇到了一些問(wèn)題,張其棟表示中國(guó)電信在落地Docker的過(guò)程中確實(shí)也遇到過(guò)一些坑,當(dāng)然他也給出了自己的解決建議:
1、Docker默認(rèn)共享內(nèi)存太小,普通權(quán)限無(wú)法更改。我們給了***權(quán)限。現(xiàn)在新版本Docker已經(jīng)支持更改共享內(nèi)存了,在測(cè)試環(huán)境里可以用新命令去更改。后期會(huì)把***權(quán)限去掉,使用命令行進(jìn)行共享內(nèi)存的更改。
2、Docker***權(quán)限會(huì)把容器107G存儲(chǔ)給寫滿,寫滿之后,再生成一個(gè)容器可以成功,但是運(yùn)行不起來(lái)。有兩個(gè)方法,一個(gè)是更改107G存儲(chǔ),變成2T或者4T的大硬盤,不能從根源上解決問(wèn)題。還有一個(gè)辦法,從業(yè)務(wù)軟件上避免這個(gè)問(wèn)題,把日志盡量往小寫,另外把日志映射出來(lái)。
3、直播轉(zhuǎn)碼和切片無(wú)法獲取CP方給的組播流。解決方案是給容器HOST模式,性能上沒有損失,但用網(wǎng)絡(luò)比較多。
4、修改防火墻后,Docker網(wǎng)絡(luò)環(huán)境不通。修改防火墻后重啟防火墻,之前運(yùn)行起來(lái)的鏡像,再次運(yùn)行時(shí)網(wǎng)絡(luò)是不通的。現(xiàn)在的解決方案是規(guī)避它,在使用鏡像的時(shí)候,先把防火墻所有的配置參數(shù)調(diào)好,不要重啟防火墻。
北京天云融創(chuàng)軟件技術(shù)有限公司研發(fā)總監(jiān)劉春陽(yáng)主要負(fù)責(zé)公司容器化以及平臺(tái)化產(chǎn)品的規(guī)劃和設(shè)計(jì)。他給大家?guī)?lái)主題為“企業(yè)應(yīng)用容器化的痛點(diǎn)、坑和解決之道”的演講。主要分享了針對(duì)企業(yè)級(jí)的平臺(tái)性的產(chǎn)品設(shè)計(jì)過(guò)程當(dāng)中,可能會(huì)面臨什么樣的需求,面臨什么樣的問(wèn)題,包括天云軟件本身所采取的一些技術(shù)選型。
他認(rèn)為,在電信領(lǐng)域,Docker有著自己的特殊性。首先電信行業(yè)里面有運(yùn)營(yíng)商企業(yè),然后是應(yīng)用提供商,然后是資源提供商,這三個(gè)是分離的。管理方對(duì)于資源提供方,應(yīng)用提供方都有要求,因此要求業(yè)務(wù)要能敏捷,要能快,盡快適應(yīng)他們的需求。其次是業(yè)務(wù)要穩(wěn)定;***是高效率。而容器技術(shù)給以上三方帶來(lái)了改變,利用容器,可以利用行程中的程序邏輯,可以用標(biāo)準(zhǔn)的協(xié)議交付第三方,使彼此之間角色沒有重疊現(xiàn)象資源提供者可以無(wú)差別的對(duì)待資源。其次,利用容器技術(shù),可以在Docker放貨柜混合編排,混合部署,促進(jìn)平臺(tái)的統(tǒng)一性。另外,通過(guò)利用標(biāo)準(zhǔn)化的容器技術(shù),促進(jìn)研發(fā)流程的自動(dòng)化和應(yīng)用模式化。
劉春陽(yáng)認(rèn)為,容器現(xiàn)在面臨的挑戰(zhàn)主要有以下兩個(gè):
1、標(biāo)準(zhǔn)不統(tǒng)一。至少目前來(lái)說(shuō),容器的標(biāo)準(zhǔn)相對(duì)統(tǒng)一,但是容器平臺(tái)管理的標(biāo)準(zhǔn)至少有三家在,標(biāo)準(zhǔn)不統(tǒng)一,導(dǎo)致大家在使用過(guò)程當(dāng)中,技術(shù)選型的時(shí)候會(huì)有挑戰(zhàn)。
2、容器的技術(shù)涉及到資源,涉及到應(yīng)用內(nèi)部,所以它具有一定的輕量性,不是交付虛機(jī)就可以。因此容器要解決個(gè)問(wèn)題,否則就沒有辦法做模式化,而不做模式化的話,平臺(tái)的很多東西都無(wú)法構(gòu)建。
當(dāng)當(dāng)網(wǎng)個(gè)性化推薦組項(xiàng)目負(fù)責(zé)人肖驍主要為大家分享了關(guān)于當(dāng)當(dāng)網(wǎng)個(gè)性化推薦組應(yīng)用Docker進(jìn)行應(yīng)用部署以及小團(tuán)隊(duì)試水Docker的的若干經(jīng)驗(yàn),分享主要包括:現(xiàn)有應(yīng)用Docker化的過(guò)程和結(jié)合Jenkins的自動(dòng)化構(gòu)建。他的演講主題是 “當(dāng)當(dāng)網(wǎng)Docker應(yīng)用實(shí)踐”。
肖驍告訴我們,要是把程序放在容器里,程序至少是無(wú)狀態(tài)的,不能依賴于宿主機(jī)的一切環(huán)境和目錄等。Docker以后,代碼流水線管理,提高開發(fā)效率。
而用Docker把現(xiàn)有的程序Docker化,需要注意哪些東西呢?
1、鏡像構(gòu)建。一定要從Dockerfile生成,如果不從Dockerfile生成,以后更新、回滾是很麻煩的。
2、避免依賴過(guò)深。不要在基礎(chǔ)鏡像上加太多產(chǎn)生其他的鏡像,最多是三四層。一層是base鏡像,再往上是工具,再往上一層就是自己的程序,再多就比較亂。
3、發(fā)布。使用Docker可以用很標(biāo)準(zhǔn)的過(guò)程做上線、回滾或者是升級(jí)。
4、日志管理。如果把日志放在容器里,容器銷毀了,日志就沒有了。要把日志實(shí)時(shí)保留,有一種辦法是把日志放在宿主機(jī),完全不依賴宿主機(jī)的任何環(huán)境。肖驍建議放一些日志收集等。
5、環(huán)境變量。指定里面的環(huán)境變量,應(yīng)用再去環(huán)境變量。這是Docker啟動(dòng)的時(shí)候用這個(gè),如果上集群的話,這個(gè)稍微麻煩一點(diǎn)。
6、配置中心。用數(shù)據(jù)庫(kù),把配置放在里面都可以。用Docker的話,在里面改配置文件,再啟動(dòng)的時(shí)候,配置文件就沒有了,有個(gè)簡(jiǎn)單的方法就是配置文件,給每一個(gè)版本配置文件都打一個(gè)容器。
7、網(wǎng)絡(luò)管理。 現(xiàn)在主要是用Host,網(wǎng)絡(luò)性能***用Bridge,現(xiàn)在如果用自定義的話,可以建多個(gè)像Docker0這樣的網(wǎng)絡(luò),可以為容器之間連接和隔離。
他說(shuō),如果自己團(tuán)隊(duì)想用Docker的話,運(yùn)行環(huán)境、內(nèi)核版本、操作系統(tǒng)的發(fā)行版本,這些都是有要求的。
1、鏡像載荷要求。一個(gè)現(xiàn)有的比較成熟的架構(gòu)應(yīng)用,要放到Docker里要考慮是不是依賴宿主機(jī)的環(huán)境,包括本地的IP和本地目錄等。
2、數(shù)據(jù)中心過(guò)大。 數(shù)據(jù)中心過(guò)大時(shí)采用折中的方法,先往上扔一個(gè)空數(shù)據(jù),后臺(tái)***次啟動(dòng)的時(shí)候,如果容器里面沒有數(shù)據(jù)的話,自己就下了,這可能也是一個(gè)折中的辦法。
3、鏡像管理、版本控制。如果提交一個(gè)鏡像,包括版本號(hào)等,必須要有比較嚴(yán)格的規(guī)定,格式和定義必須要仔細(xì)規(guī)定一下,要不然就會(huì)亂。
相信不少人都想知道,在異構(gòu)技術(shù)棧、5種語(yǔ)言、500+個(gè)微服務(wù)(包括Task)、網(wǎng)狀調(diào)用關(guān)系狀況下,如何做到一鍵構(gòu)建測(cè)試環(huán)境,并同時(shí)支持50個(gè)Feature獨(dú)立測(cè)試卻互不影響? 折800的架構(gòu)師劉凱以 “用Docker&K8s構(gòu)建自動(dòng)化測(cè)試環(huán)境”為主題的演講為大家做了妙答:用Docker + Kubernetes實(shí)現(xiàn)一鍵構(gòu)建測(cè)試環(huán)境。按需拉起容器,按需部署,按照關(guān)聯(lián)計(jì)算,拉起關(guān)聯(lián)的服務(wù)。
但是,在使用Docker + Kubernetes過(guò)程中需要解決如下問(wèn)題:
1、變異構(gòu)為同質(zhì)。不同的語(yǔ)言部署方式是不一樣的, 必須用一個(gè)方式,代碼上傳的時(shí)候,自帶環(huán)境、版本和庫(kù)。那么用什么樣的部署方式把異構(gòu)的語(yǔ)言變成同步呢? 提供一個(gè)統(tǒng)一的接口可以構(gòu)建、傳輸、部署。
2、配置管理。要自動(dòng)化部署,一鍵拉起幾百個(gè)服務(wù)和幾十個(gè)服務(wù),要知道相互的關(guān)系,要連什么服務(wù),要怎么配置,必須做到自動(dòng)化配置。要加一個(gè)存儲(chǔ),要加一個(gè)ES,必須在ES上建索引等。
3、服務(wù)管理。如何做服務(wù)注冊(cè)、服務(wù)發(fā)現(xiàn)、如何做負(fù)載均衡。不同類型的服務(wù),啟動(dòng)以后,位置是不一樣的,HTDP服務(wù)要對(duì)外掛IP,要注冊(cè)到外面的負(fù)載均衡里面,應(yīng)用層面的服務(wù)是不需要這樣做的。
4、監(jiān)控。如果測(cè)試時(shí),測(cè)不通,報(bào)告異常、超時(shí),必須能在豎狀結(jié)構(gòu)里面知道哪個(gè)節(jié)點(diǎn)報(bào)錯(cuò),如果從最前端一層一層向下排查,將會(huì)非常耗時(shí)。失敗了用紅點(diǎn)標(biāo)出來(lái),然后告訴失敗原因是什么。請(qǐng)求發(fā)不過(guò)去,是什么原因,圖形數(shù)據(jù)怎么來(lái)?采用更加激進(jìn)的做法:整個(gè)測(cè)試環(huán)境,把所有包抓下來(lái),知道源IP以及調(diào)度內(nèi)容是成功還是失敗,從而分析所有容器節(jié)點(diǎn)的調(diào)度關(guān)系是成功還是失敗,這些數(shù)據(jù)配合服務(wù)依賴關(guān)系,完全可以把數(shù)據(jù)貫到監(jiān)控?cái)?shù)據(jù)上,這樣一來(lái)就知道哪個(gè)節(jié)點(diǎn)進(jìn)來(lái)了,有什么錯(cuò),有多長(zhǎng)時(shí)間。
5、兼容性。Docker化以后,怎么把之前沒有Docker化的服務(wù)和流程融入到里面,Docker研發(fā)流程要做相應(yīng)的改造。接口和數(shù)據(jù)庫(kù)要兼容。
6、編排部署。上線、開發(fā)時(shí)先更新哪個(gè)服務(wù),再更新哪個(gè)服務(wù),加一個(gè)配置,然后改數(shù)據(jù)庫(kù)等等。這么復(fù)雜的事情,如果沒有合理的編排是很難做到自動(dòng)化的。用DAG的方式去描述部署計(jì)劃,通過(guò)拖拽的方式表達(dá)要干什么。
7、隔離。一鍵拉起測(cè)試環(huán)境同時(shí)還要做到按需拉取,要對(duì)服務(wù)之間的調(diào)度關(guān)系做隔離。在隔離區(qū)里面,每個(gè)來(lái)源IP不一樣,***個(gè)隔離區(qū)的來(lái)源IP,把請(qǐng)求轉(zhuǎn)到相應(yīng)的隔離區(qū)里面。
8、依賴關(guān)系。服務(wù)之間調(diào)度鏈很深,如果不對(duì)調(diào)度鏈關(guān)系進(jìn)行管理,很難知道被拉起的是什么服務(wù)。向上找依賴分析,把依賴的服務(wù)一起部署。把500個(gè)服務(wù)的依賴關(guān)系都清算出來(lái),放在一個(gè)服務(wù)庫(kù)里面,能看到相互依賴關(guān)系。
9、統(tǒng)一命名。看起來(lái)沒有技術(shù)含量,但是在做自動(dòng)化部署和自動(dòng)化測(cè)試時(shí)是非常關(guān)鍵的。