天天看點

用Git子子產品和Docker Compose實作高效開發工作流

本文講的是<b>用Git子子產品和Docker Compose實作高效開發工作流</b>,【編者的話】搭建開發環境一直讓程式員們頭疼,本文使用Git子子產品和Docker Compose實作高效率的開發工作流,讓程式員能夠輕松搭建出開發環境,把精力投入到需要開發的應用本身。

自我們從Continuous Software雇傭了第一位遠端開發的程式員以來,我們就意識到精簡開發工作流的重要性。當新入職的程式員接手由很多應用組成的複雜項目時,我們想盡量避免以下這幾個問題:

缺少stack子產品:Node.js、PHP、PostgreSQL等

不清楚項目元件/應用的總體概況

本地配置沖突:監聽端口、資料庫配置等

此外,就我個人經驗而言,我們這樣的程式員太容易找不着北了。曾經,我入職一個公司的第一整天都花在搭建開發環境上,試圖去了解所有的東西怎麼才能一起工作,而無法直接就去了解公司開發的應用到底是怎麼工作的。

在具體介紹如何解決上述問題之前,我先介紹下我們項目使用的開發工作流。

我們的每個項目都在Bitbucket上有自己的Team(和GitHub上的Organization對應)。每個應用都會在Team下建立一個Repository(比如,<code>api</code>、<code>dashboard</code>、<code>cpanel</code>)。在這些子子產品之上,建立了一個名為<code>development</code>的Repository。子子產品的同一層級有<code>README.md</code>和<code>docker-compose.yml</code>兩個檔案。

當新程式員加入項目時,隻需在Bitbucket上浏覽<code>development</code>repository,根據<code>README.md</code>的步驟就可以快速搭建環境。具體步驟如下所示:

至此,一切就都已經搭建好,并運作在本地機器上了。

本章介紹我們是如何實作上述工作流的。

如前所述,需要建立一個開發倉庫,以及為每個應用建立對應的倉庫。這裡我們建立了<code>api</code>、<code>dashboard</code>和<code>cpanel</code>。當建立這些倉庫的時候,重點關注<code>development</code>倉庫的搭建。

現在将應用程式的倉庫添加為<code>development</code>倉庫的子子產品,隻需要鍵入如下指令:

這樣,你的<code>development</code>倉庫根目錄下會建立出<code>.gitmodules</code>檔案。程式員也就可以在克隆<code>development</code>repository的時候一次得到所有的應用程式并運作:

現在我們已經搭建好了<code>development</code>倉庫,可以通過<code>cd</code>的方式通路所有不同的應用程式。接下來我們要用之前提到的編排工具:Docker Compose來容器化所有的應用及其配置。

首先從<code>api</code>應用程式開始。打開<code>docker-compose.yml</code>,為API聲明一個容器,并為這個容器選擇基礎鏡像。本示例中的代碼基于Node.js,是以選擇官方Node.js鏡像:

這時,運作指令<code>docker-compose up -d</code>會建立出一個名為<code>&amp;lt;project&gt;_api_1</code>的容器,這個容器什麼也不做(啟動後立即退出)。運作指令<code>docker-compose ps</code>可以得到由<code>docker-compose.yml</code>編排的所有容器的資訊。

接下來配置<code>api</code>容器,使其多一些功能。為了實作這個目的,我們需要:

将源代碼挂載到容器中

聲明用什麼指令運作應用

暴露合适的端口以供通路應用

這樣配置檔案類似:

現在再運作<code>docker-compose up -d</code>,就啟動了<code>api</code>應用,可以在<code>http://localhost:8000</code>通路它。這個程式可能會崩潰,可以使用<code>docker-compose logs api</code>檢查容器日志。

這裡,我懷疑<code>api</code>的崩潰是因為它連不上資料庫。是以需要添加<code>database</code>容器,并讓<code>api</code>容器能夠使用它。

通過建立<code>database</code>容器,并将其連接配接到<code>api</code>容器,我們就可以在<code>api</code>容器裡找到<code>database</code>。要想展示API的環境(比如,<code>console.log(process.env)</code>),必須使用如下變量,比如<code>POSTGRES_1_PORT_5432_TCP_ADDR</code>和<code>POSTGRES_1_PORT_5432_TCP_PORT</code>。這是我們在API的配置檔案裡使用的關聯到資料庫的變量。

通過link指令,這個資料庫容器被認為是API容器的依賴條件。這意味着Docker Compose在啟動API容器之前一定會先啟動資料庫容器。

現在我們用同樣的方式描述其它應用程式。這裡,我們可以通過環境變量<code>API_1_PORT_8000_TCP_ADDR</code>和<code>API_1_PORT_8000_TCP_PORT</code>,将<code>api</code>連接配接到<code>dashboard</code>和<code>cpanel</code>應用。

就像之前為資料庫修改API配置檔案一樣,可以為dashboard和cpanel應用使用類似的環境變量,進而避免寫死。

現在可以再次運作<code>docker-compose up -d</code>指令和<code>docker-compose ps</code>指令:

應用應該就已經啟動并運作了。

從<code>http://localhsot:8000</code>可以通路api。

從<code>http://localhsot:8001</code>可以通路dashboard。

從<code>http://localhsot:8002</code>可以通路cpanel。

<code>jwilder/nginx-proxy</code>鏡像将一切變得很簡單。隻需要在<code>docker-compose.yml</code>裡加上描述去建立一個名為<code>nginx</code>的新容器。根據<code>jwilder/nginx-proxy</code>的README檔案(挂載Docker守護程序socket,暴露80端口)配置該容器就可以了。之後,在現有容器裡再添加額外的環境變量<code>VIRTUAL_HOST</code>和<code>VIRTUAL_PORT</code>,如下:

<code>nginx</code>容器會檢查所有運作在Docker守護程序之上(通過挂載的<code>docker.sock</code>檔案)的容器,為每個容器建立合适的nginx配置檔案,并設定<code>VIRTUAL_HOST</code>環境變量。

要想完成本地路由的搭建,還需要在<code>etc/hosts</code>裡添加所有的<code>VIRTUAL_HOST</code>。我是手動用node.js的<code>hostile</code>包來完成這個工作的,不過我猜應該可以自動化實作,就像<code>jwilder/nginx-proxy</code>可以根據nginx配置檔案動态變化一樣。這裡需要再研究一下。

現在可以再次運作<code>docker-compose up -d</code>,然後使用和生産環境一樣的url通路應用程式,隻需用<code>.local</code>TLD代替<code>.com</code>TLD。

本文發表在AirPair上,如果你對更進一步這一章有任何建議,請随意fork并修改它。如果你發現本文有任何錯誤,也請幫忙修改。

===========================

譯者介紹

崔婧雯,現就職于VMware,進階軟體工程師,負責桌面虛拟化産品的品質保證工作。曾在IBM WebSphere業務流程管理軟體擔任多年系統測試工作。對虛拟化,中間件技術有濃厚的興趣。

原文釋出時間為:2015-03-20

本文作者:崔婧雯 

本文來自雲栖社群合作夥伴DockerOne,了解相關資訊可以關注DockerOne。

原文标題:用Git子子產品和Docker Compose實作高效開發工作流