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