Docker Workflow(三) 編排工具

2021-09-22 23:28:12 字數 3327 閱讀 7495

本文講的是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-test

sleep 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...