Shopify的Docker封裝技術(shù)使用經(jīng)驗(yàn)
Shopify是一個(gè)大型的RubyonRails應(yīng)用,其產(chǎn)品服務(wù)器能通過(guò)給1700個(gè)處理核心和6TB RAM分配任務(wù)來(lái)完成每秒處理8000多個(gè)請(qǐng)求。Shpify為了更加便捷、跨平臺(tái)跨版本地進(jìn)行分包任務(wù),采用了時(shí)下炙手可熱的Docker封裝技術(shù)。近日,Shopify在其博客上分享了自己的Docker技術(shù)使用經(jīng)驗(yàn)。
關(guān)于封裝格式的選擇,Docker提供很多封裝格式,從輕量級(jí)的單進(jìn)程容器到重量級(jí)的富應(yīng)用容器,一應(yīng)俱全。Shopify的開(kāi)發(fā)者選擇“纖薄”路徑的容器,并隔絕外部影響,目的就是為了減少CPU和內(nèi)存的負(fù)擔(dān)。不過(guò)雖然運(yùn)行纖薄容器,但還有一個(gè)初始化進(jìn)程(PID=1)使得監(jiān)測(cè)工具、保密管理和服務(wù)能夠緊密集成。除了初始化進(jìn)程,還添加了一個(gè)在每個(gè)容器內(nèi)占用PID=2并且簡(jiǎn)單啟動(dòng)應(yīng)用進(jìn)程(PID=3)的ppidshim。有該 ppidshim,應(yīng)用程序不會(huì)直接從(i.e. ppid != 1)繼承。除此以外還提供了健康檢查,以保證其正常運(yùn)行。
有一個(gè)要特別注意的一點(diǎn),Shopify稱之為“容器的100定律”。在選擇將何種服務(wù)放入容器中時(shí),假設(shè)一臺(tái)主機(jī)中運(yùn)行100個(gè)小容器,評(píng)估是需要運(yùn)行一個(gè)給定服務(wù)100次,還是共享一臺(tái)主機(jī)的服務(wù)更好。用于***效率的選擇,這個(gè)評(píng)判標(biāo)準(zhǔn)在實(shí)際中很有用處。100定律的使用需要一定的靈活性。一些情況下,僅僅需要寫(xiě)一下組件的“黏合器”,也可以通過(guò)配置來(lái)達(dá)到目的。最終,你應(yīng)該獲得一個(gè)容器,內(nèi)含你的應(yīng)用程序運(yùn)行所需的東西,以及一個(gè)提供了Docker托管和共享服務(wù)的主機(jī)環(huán)境。
關(guān)于Debug,沒(méi)有特別需要注意的,容器內(nèi)運(yùn)行應(yīng)用在絕大多數(shù)情況下和他們未封裝時(shí)行為相同,而且,大多數(shù)標(biāo)準(zhǔn)的Debug工具和技術(shù)在Docker主機(jī)上能正常運(yùn)行。所以開(kāi)發(fā)者只需照常調(diào)試。
命名方面。選取容器名稱的時(shí)候,盡量描述其工作內(nèi)容(例如:unicorn-1,resque-2),為了便于追溯,還要結(jié)合主機(jī)名(例如unicorn-1.server2.shopify.com.)。在使用過(guò)程中,將Docker的主機(jī)名標(biāo)簽也傳入容器中,方便問(wèn)題的追蹤。
注冊(cè)和部署。使用GitHub的提交掛鉤觸發(fā)一個(gè)容器生成每一個(gè)主推,并提交狀態(tài),表明構(gòu)建是否成功。使用Git的提交SHA來(lái)Docker_tag容器,如此可以一目了然容器中的代碼是什么版本。還把SHA放入(/app/REVISION)文件夾,容器內(nèi)的文件夾更容易進(jìn)行debug和腳本使用。一旦構(gòu)建成功,希望把容器推到一個(gè)中央注冊(cè)處。開(kāi)發(fā)者選擇運(yùn)行自己數(shù)據(jù)中心的注冊(cè)表以加速部署和盡量減少外部依賴。運(yùn)行Nginx的反向代理,可以緩存GET請(qǐng)求背后的標(biāo)準(zhǔn)Python注冊(cè)表的多個(gè)副本。大型網(wǎng)絡(luò)接口(10Gbps)和反向代理能有效處理“驚群效應(yīng)”。代理方式也使我們能夠運(yùn)行多個(gè)注冊(cè),并在注冊(cè)中斷時(shí)提供自動(dòng)故障切換。