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