本文講的是docker workflow(三):編排工具,
【編者的話】要在生產環境中發揮docker的威力,離不開編排工具的支援,否則將深陷容器監控與管理困難的泥沼。目前市面上有不少此類工具,如何選擇最合適的乙個,本文給出了一些參考。
iiiepe
的生產環境中使用docker的系列文章的第三部分。如果你還沒看過第一(
譯文)和第二(
譯文)部分,請先前往閱讀再繼續。本文中,我將討論我們測試過的編排工具,我們的選擇及原因。我也會說明我們如何使用jenkins來處理繁重的工作,以及它的組織方式。
使用docker真的非常酷,它解決了我們工作流中的多個問題,但也製造了一些問題。管理容器的工作量與管理虛擬機器相比只多不少,如果你沒使用編排工具來完成這件事,那你就錯了。一旦容器數量開始增長,將真的很難管理。
我們在docker hub
上開源的所有基礎映象都使用了supervisor。supervisor是個管理程序的美妙工具,如果乙個程序死亡,supervisor就會重啟它。因為docker工作的方式,容器需要有乙個程序處於執行狀態,以保持容器存活。程序無法後台化,如果程序死亡,容器也會死亡,你就不得不想辦法重啟容器。這大概是你一開始就想避免的問題。supervisor最棒的一點是它可以處理多個程序,因此乙個執行php應用的容器將執行php-fpm、nginx和sendmail。
我們大概花了兩周時間針對一系列的編排方案進行了測試。包括:
我不想對每個方案做詳盡回顧,這裡只是簡述一下。
使用docker的pass方案。基本上就是heroku加上docker。安裝簡單,但在儲存方面不夠靈活。這是最有吸引力的方案,但由於我們使用了drupal,它不適合我們。而且,它沒提供ui。
我們最終使用了shipyard,但只是作為乙個檢視器。shipyard還在不斷發展,它最大的問題是沒有辦法簡單的自動管理容器。正如我所說,我們僅僅把它作為乙個檢視器,用來監控所有容器和docker服務的狀態。如果乙個容器崩潰了,我們只需要使用shipyard重啟死亡的容器,而不用重啟該應用的所有容器。
它很有前途,但在我們需要時還不完善。它還大量依賴於某些我個人很不喜歡的模板。缺少**是我們測試時的乙個主要障礙。基本上,沒有**我們就只能在每台伺服器上安裝panamax。
paas方案,列表中最難安裝和配置的乙個。它擁有很多超過我們要求的功能,但缺少乙個我們需要的功能:kubernetes不處理儲存。
paas方案,它聲稱:
... amazon s3 ... 是儲存內容檔案到tsuru的正確方法。讀完這段話,我們都連安裝的慾望都沒了。
作為fig的替代品之一,沒有多主機能力是最大的問題。
maestro-ng在幾個方面勝出:容易使用、有乙個帶簡單命令的命令列介面、支援多主機、所有東西都在乙個yaml檔案中描述。
我們安裝了一台伺服器,並在上面安裝了maestro-ng,因為我們需要在每個web節點上開啟docker埠,為安全著想,只有maestro-ng可以連線docker。然後,我們將所有maestro檔案組織進乙個單獨的git專案。專案下是一些以應用的正式網域名稱(fqdn)命名的目錄,在每個目錄裡有乙個單獨的檔案,乙個maestro.yaml檔案:
如果我們需要測試某個具體專案(我們並不會做這類測試),只需要建立乙個maestro檔案並推送上去,然後我們就可以像其他專案一樣對待它。
使用maestro-ng,我們的持續交付流程縮減成兩個單獨命令:
maestro pull ; maestro restart
由於做這個有點費時,我們就讓jenkins來替我們完成。
此前我們沒使用jenkins,因此我們也沒實踐過持續整合(ci)和持續交付(cd),一切都是手工的,非常容易出錯。建立乙個新的工作流是將其加入的絕好機會。
我們所有專案都具有相同的工作流:
gitlab檢測到推送
gitlab觸發乙個web hook,並要求jenkins啟動乙個新任務
jenkins轉殖專案的最新版本
jenkins執行測試
如果測試通過,jenkins開始構建新的docker映象
映象構建完成後,jenkins將其推送到私有registry
jenkins通過ssh連線maestro-ng伺服器,並執行命令maestro pull ; maestro restart
在開始配置所有需要的虛擬機器時,我們決定將jenkins和docker registry安裝在同一臺虛擬機器上。這麼做有兩個原因:一是這台虛擬機器擁有大量空間,完全滿足二者要求,我們的web節點都比較小,這台虛擬機器相對而言大得多;二是將docker registry和jenkins安裝在同一臺虛擬機器上可以減少推送映象到registry的傳輸時間。這對我們來說很有效。
對於正常的、未經測試的應用,jenkins執行以下指令碼任務:
docker login --username="someusername" --password="somepassword" --email="someemail"
對於測試過的應用,jenkins會進行如下操作:
make prepare-testsleep 90
make install
make test
make clean-test
docker build --tag=iiieperobot/dashi3 .
docker login --username="iiieperobot" --email="someemail" --password="somepassword"
docker push iiieperobot/dashi3
在上述示例中,我們直接推送到docker hub,但99%的任務是推送到私有docker registry。
指令碼執行後,jenkins會通過ssh連線maestro-ng伺服器,並執行:
當新的基礎映象被重新構建,我們需要重新構建依賴該基礎映象的所有映象,因此對於每個基礎映象還有這樣乙個任務:
docker pull iiiepe/nginx-drupal
我們有乙個構建後的動作來構建依賴此映象的所有專案。
在寫作中途,我被問及是否在測試專案時使用docker。猜的沒錯,需要時我們就會用。有時我們不使用模擬方式(mocking)而是對資料庫進行測試,在進行這類測試時,我們會使用我上面描述的步驟,同時為了簡化操作,我們使用了makefiles,因此jenkins和開發人員都可以通過make test
來執行測試。
原文發布時間為:2015-03-31
三消遊戲(三)
後面一些更改就是實現下落下標更改的方法。這個方法要在一開始檢測三色的時候呼叫 with3arr this.filterdelsame with3arr,return with3arrupdatecellfalldownnum function cell 還要刪除陣列裡的相同元素 filterdels...
三周C 總結三
1 陣列概念 陣列名變數代表陣列首位址。定義 int x1 new int 10 string names 2.折半查詢演算法 要求陣列按照大小有序 static int quickfind int arr,int x 形式引數 int index 1 int low 0,high arr.leng...
C 學習(三) 基礎(三)
include using namespace std 1 引用的基本語法 引用 給一段記憶體空間起別名 語法 型別 別名 原名 void test1 注意 1 引用必須要初始化 void test2 2 建立乙個對陣列的引用 1 先定義出陣列的型別,在定義引用 陣列型別定義 typedef int...