使用Docker做開發的建議團隊工作流

Philo發表於2015-06-09

意義

自從Docker進入到我們的工作流程之後給環境配置框架搭建,持續整合,持續交付方面帶來了很多好處,首先相對於虛擬機器來說,最直接的好處是帶來了更小的映象,同時程式以容器的方式執行不但啟動速度快而且效能也好過虛擬機器,同時它的配置可以非常快速的調整。其次對於開發來說,我們整個團隊都使用的是Sublime+git的方式進行開發,使用Docker之後無論是什麼平臺只要有Shell都可以很方便的統一測試&開發環境。

Docker特性的使用

  1. 磁碟掛載(-v)
    一直以來我們在使用Docker過程中都遵循著一個道理Docker只是一個環境他只是執行程式的一種手段。我們不能在docker中持久化資料,無論是檔案還是資料庫都是不允許的,因為很有可能測試結束之後會丟失資料。用於開發的Docker Image我們需要針對資料持久化新開方便除錯使用的資料庫,我們需要掛載針對應用的資料庫持久化資料夾,當然我們還需要針對指令碼進行目錄掛載,如果是golang的話執行之前可能要自動化構建golang程式。
  2. 埠對映
    雖然docker給我們提供了link的方法來實現容器之間的連結,但是我們依賴還是使用了最傳統的埠對映的方式來進行服務的對外發布。因為我們覺得關係越簡單,整個平臺的服務就越穩定,雖然連結的這種方式並沒有什麼不好之處。

工作流程

定製容器準備開發&&執行環境

從Dockerfile開始部署環境,有兩個方向上的選擇,一種是自己定製作業系統,另外一種是依賴其他人做好的。

先說第一種方法:在我之前的blog中已經有提到,可以大概參考一下。

這種方法缺點主要在於,需要非常瞭解Linux或者至少做過LFS才能方便自己定製作業系統,要對業務底層依賴有一定了解。因為此方法需要精簡image所以需要手動解決依賴問題。對於依賴比較多的情況不適用。

第二種方法,在之前的blog中也有提到過,有詳細的過程以及Dockerfile參考。

這種方法構建的image大概100MB+雖然比虛擬機器(按G來算)小了很多,但是在遷移分發Image的時候還是要注意(如果你沒有自己的Docker Hub)。如果使用檔案遷移請用save的方式來分發image,在上面連結的blog中有提到備份遷移的問題。

另外一個注意的地方,如果是用別人的image要注意安全,會不會裡面掛了後門之類的,然後要摸清系統配置,準備好程式碼或可執行二進位制檔案的掛載位置,資料庫持久化檔案存放的位置等等都要摸清。最後在執行的時候都要給出掛載方案。

釋出之後要做的事

因為Docker只是一個容器而不是專案中的一部分,所以只是專案實現的一種手段,具體應該如何使用它,需要一定的文件支撐,也就是開發業務流程文件。

文件中要詳細的提出所有依賴的Service配置檔案的位置,配置的狀態,持久化目錄位置,輸出的埠,開發完成之後業務部署的位置這些關於專案的儘量能想到的資訊,因為這套容器會跟著專案整個週期中作為基礎設施的一部分在執行。

除了配置方面,第二部分是建議的使用方法流程,比如:要說清楚程式碼是在容器內部編譯還是在其他容器中有做好的輔助工具編譯,還是有一個獨立的伺服器(專案比較大的時候需要一個獨立的構建伺服器,甚至需要一個專門管理構建&&版本的同事),如果是指令碼語言寫的就不需要這麼麻煩了。

專案釋出

專案進行到一個階段之後需要釋出,把程式碼或可執行二進位制檔案直接構建到image裡面就行了。注意先要判斷專案是否要使用Docker。

好處總結

在檔案持久化方面我們掛載的目錄實現了統一,配置檔案也實現了統一。

在PHP開發中再也不用擔心目錄大小寫敏感,檔案大小寫敏感,目錄長度限制等因為作業系統不統一的問題。

由於不同專案有不同的限制因素,因此在這裡介紹總體的工作流程,專案中涉及到不同的應用服務只需要比較小的調整。

相關文章