2016-03-27 22 views
1

我與碼頭工人和詹金斯的工作,和我想要做的兩個主要任務:泊塢窗和詹金斯

  1. 控制與管理詹金斯碼頭工人圖像和容器(運行/啓動/停止)。
  2. 在Docker鏡像中設置開發環境,然後使用jenkins構建並測試容器中的應用程序。

當我在網上衝浪,我發現許多解決方案網:

  • 運行詹金斯作爲容器和其他容器聯繫起來。
  • 將jenkins作爲服務運行,並使用提供的jenkins插件來支持docker。
  • 在包含開發環境的容器內運行jenkins。

所以我的問題是什麼是最好的解決方案,或者你可以建議其他的方法。

我聽說過有關在容器中運行容器的其他問題。這是一個好的做法還是更好地避免它?

+0

參見:http://stackoverflow.com/questions/36088227/how-to-run-a-docker-command-in-jenkins-build-execute-shell/ –

+0

好吧,謝謝你。但是你知道使用jenkins作爲守護進程還是作爲容器哪種方法更好? –

回答

4

將Jenkins作爲集裝箱化服務運行並不是一件困難的事情。有許多圖像可以讓你做到這一點。我花了幾分鐘才讓Jenkins 2.0-beta-1運行在一個容器中,從源代碼編譯(圖像可以在here找到)。特殊性我喜歡這種方法,您只需確保使用數據卷或數據容器作爲jenkins_home即可使數據保持不變。

當你想在容器中使用Jenkins來構建和管理容器本身時,事情會變得有點棘手。爲了實現這個目標,你需要實現一個名爲docker-in-docker的東西,因爲你需要一個docker守護進程和在Jenkins容器中可用的客戶端。

有一個非常好的教程解釋如何做到這一點:Docker in Docker with Jenkins and Supervisord

基本上,你需要使用像supervisord這樣的東西來使兩個進程(Jenkins和Docker)在容器中運行。這是可行的,並宣稱擁有良好的隔離等等。但是可能非常棘手,因爲docker守護進程本身也有一些依賴關係,它們也需要存在於容器中。所以,只有使用supervisord並運行這兩個進程是不夠的,您需要利用DIND項目本身來使其工作......並且您需要以特權模式運行容器...並且您需要使用「我需要處理一些奇怪的DNS問題...

對於我個人的喜好,它聽起來太多的解決方法,使一些簡單的工作,並在一個容器內運行兩個服務似乎打破碼頭工人的良好做法和分離原則關注點,我想避免的事情。

當我讀到這個時,我的意見更加強烈:Using Docker-in-Docker for your CI or testing environment? Think twice。值得一提的是,這最後一篇文章來自DIND作者本人,所以他值得關注。

我的最終解決方案是:運行Jenkins作爲集裝箱化服務,是的,但考慮到docker守護進程作爲底層服務器供應的一部分,即使因爲您的docker緩存和映像是您可能想要保留的數據它們完全由守護進程擁有和控制。

採用這種設置,所有你需要做的是安裝在您的詹金斯圖像泊塢窗守護插座(這還需要泊塢窗客戶端,而不是服務):

$ docker run -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v local/folder/with/jenkins_home:/var/jenkins_home namespace/my-jenkins-image 

或者與碼頭工人,撰寫volumes指令:

--- 
version: '2' 

services: 
    jenkins: 
    image: namespace/my-jenkins-image 
    ports: 
     - '8080:8080' 
    volumes: 
     - /var/run/docker.sock:/var/run/docker.sock 
     - local/folder/with/jenkins_home:/var/jenkins_home 

# other services ... 
+0

非常感謝。 –

+0

@JachkE,如果這有效,請接受答案,好嗎? –

+0

讓Docker容器中的jenkins在嘗試從Bitbucket上的私人回購中提取代碼時對我造成一些權限問題。我認爲它與運行Docker容器的root用戶有關係@VictorSchröder – David