天天看點

Docker系列之Jenkins自動化部署

Devops的概念已經火了很久了,我一直想對這方面進行一定的了解;再加上實驗室項目環境依賴比較複雜,希望使用Docker來解決,是以最近就好好研究了一波Docker的相關實踐和原理。這裡整理一下,希望組成一個系列,從實踐到原理詳細講解一下Docker的使用。

 第一篇就講一下Jenkins+Docker的自動化部署實踐。大緻的流程如下:目前我有兩個伺服器,分别是阿裡雲和bandwagon,代碼存儲在github上,每次push都會觸發阿裡雲上的jenkins的建構任務,jenkins将github上的代碼fetch到本地,編譯打包成war檔案,生成docker image并上傳到docker registry上,然後通過ssh來登入bandwagon伺服器pull下來新生成的image并啟動。由于篇幅問題,本篇文章不會介紹有關docker image的build和docker registry的搭建,但是我會在後續文章中再做詳細講解。

 學習Docker,我推薦先在網絡上找說明指南,一步一步自己嘗試的使用,然後如果覺得有必要可以看一下《Docker容器和容器雲》這本書。

 本文内容都是docker和jenkins的基礎知識,為了節約你的時間,本文的主要内容如下:

  • docker 基礎指令
  • jenkins docker版本的搭建,建構任務的配置
  • Pubish Over SSH 安裝和配置
  • 通過github的webhook來觸發jenkins建構任務

Docker運作jenkins

Docker如此火爆的一個原因是因為它形成了一個良好的生态圈,基本上主流的軟體應用都有相應的Docker image。如果大家不清楚Docker image的含義,建議大家看一下

Docker中文指南

,我們可以通過

docker pull

指令來下載下傳響應的image,然後運作。比如我們希望在阿裡雲伺服器上部署一個jenkins應用,首先可以執行下列語句來擷取一個jenkins的image。

docker pull jenkinsci/jenkins:lts
           

這裡我們使用pull從docker registry上拉取image,但是目前業界上有很多共有或在私有的docker registry,比如說docker hub和daoCloud。是以image的全稱就由三部分組成:域名或在ip + / + 軟體名稱 + : + 版本号,是以上邊的這條指令就是讓docker去jenkinsci這個Jenkins機構自己部署的registry上下載下傳jenkins的lts版本的image.你也可以直接使用

docker pull jenkins

來下載下傳image,但docker會預設的從docker hub上下載下傳jenkins的laster版本。

下載下傳成功之後,你可以使用

docker images

指令來檢視目前下載下傳的image資訊

你可以通過

docker run

指令來運作docker容器,請注意我這裡的用詞,在Docker中image和container是不同的概念,你可以将他們簡單的了解成Java中類和對象的關系。我們使用下面的指令來啟動這個jenkins容器。

sudo docker run -d --name jenkins -p 9090:8080 -v /var/jenkins_home:/var/jenkins_home jenkinsci/jenkins:lts
           

我們來依次講解一下run指令的幾個參數把:

  • -d

    背景運作docker容器并列印容器ID。如果不加

    -d

    參數,那麼容器運作會和終端綁定,如果終端關閉,那麼容器也會關閉,但是容器不會被删除。但是如果你隻是想試一試某個容器,運作後自動進入指令行,那麼可以使用-it參數;如果你想容器關閉之後自動删除,那麼就使用-rm參數。
  • --name

    給docker container起一個别名,後續可以通過别名來管理容器,否在會系統會預設配置設定一個随機的别名。
  • -p

    docker容器和外側的端口映射,jenkins服務是運作在docker容器内部的,但是docker容器預設不對外暴露接口,是以通過這個參數将内部的8080端口映射到伺服器本身的9090端口上。
  • -v

    資料卷的挂載。這裡涉及到docker container的一個特性,container如果停止運作了,那麼再次啟動時,之前所有運作相關的資料和檔案就都不存在了,就類似于設定了自動還原的電腦一般,無論你做了多少的操作,一旦關機重新開機之後就又恢複到最初的狀态。資料卷就是來解決上述問題的,通過Docker container外部的檔案夾的挂載,将可持久化的檔案存儲到外部挂載的檔案夾中。

然後你就可以根據你自己的ip位址來鍵入下列位址http:ip:9090來通路jenkins的首頁了。

 這裡有一點需要注意的是,需要注意你阿裡雲伺服器設定的網絡安全協定,是否禁用掉了9090這個端口。

Publish over SSH配置

 Jenkins的初始化配置和SSH Over Publish的安裝請大家自行百度,這裡我主要講解一下SSH Over Pushlish配置。

 首先我們要在jenkins伺服器上生成密鑰對,使用

ssh-keygen -t rsa

指令來生成秘密對,這樣的話,在~/.ssh/下就會有私鑰id_rsa和公鑰id_rsa.pub。

 然後你需要上傳公鑰到目标伺服器上,也就是我的bandwagon伺服器上,可以使用

ssh-copy-id

來将檔案上傳到伺服器上,類似于

scp

指令的使用方式。

ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<host>
           

 最後我們需要修改目标伺服器的ssh配置檔案,配置檔案為/etc/ssh/sshd_config。設定ssh-server允許使用私鑰和公鑰對的方式登入,然後使用

sudo /etc/init.d/ssh restart

指令重新開機ssh服務。

RSAAuthentication yes
PubkeyAuthentication yes
#AuthorizedKeysFile     %h/.ssh/authorized_keys
           

 上述步驟成功之後,大家在系統管理中配置Publish over SSH。相關的配置資訊如下圖所示。

jenkins1.png

 你還可以點選下方的進階選項,來配置ssh伺服器的端口,逾時時間等資訊,還可以點選Test Configuration來檢測是否配置成功。

建構任務配置

 我們先建立一個建構任務,該任務從github repo上将代碼拉取下來,然後執行建構任務,然後通過Publish Over SSH在目标伺服器上進行部署。

 我們首先配置源碼管理子產品,選擇Git選項,然後配置Repository URL 并添加認證資訊。可以将自己的github帳号和密碼加入其中。

jenkins2.png

 不同的項目的建構指令不同,但是我們可以在建構後操作子產品設定後續操作,通過ssh登入目标伺服器,讓目标伺服器執行指令行操作來pull最新上傳的image并且執行,這樣就完成了部署。

jenkins3.png

Push觸發建構任務

 完成上述配置,你就可以手動在jenkins上啟動構架任務了,但是要做到自動化部署,還必須設定Push操作自動觸發jenkins建構任務的機制。

 我們先到首頁-使用者管理界面打開自己的使用者界面,然後點選左側的設定按鈕,并點選

show API token

按鈕來擷取API token.然後在建構任務設定頁面的建構觸發器子產品勾選觸發遠端建構選項,并将token填到裡邊去。這是jenkins會提示你如何通過URL來觸發建構任務。

jenkins5.png

 然後我們打開github上相應庫的設定頁面。點選左側的Webhooks選項,然後添加hook.将上述的url填寫到Payload URL欄中,點選添加。如果添加成功之後,每次你push一個新版本,那麼jenkins就會自動進行部署了。

jenkins6.png

 如果你發現webhooks發送請求失敗,那可能是因為你jenkins安全設定的問題,禁止掉了發送請求自動化建構。

後記

 本篇講的都是十分基礎性的内容,後一篇文章講一下dockerfile的原理和注意事項與docker registry。