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。相關的配置信息如下圖所示。
?你還可以點擊下方的高級選項,來配置ssh服務器的端口,超時時間等信息,還可以點擊Test Configuration來檢測是否配置成功。
構建任務配置
?我們先創建一個構建任務,該任務從github repo上將代碼拉取下來,然后執行構建任務,然后通過Publish Over SSH在目標服務器上進行部署。
?我們首先配置源碼管理模塊,選擇Git選項,然后配置Repository URL 并添加認證信息。可以將自己的github帳號和密碼加入其中。
?不同的項目的構建命令不同,但是我們可以在構建后操作模塊設置后續操作,通過ssh登錄目標服務器,讓目標服務器執行命令行操作來pull最新上傳的image并且執行,這樣就完成了部署。
Push觸發構建任務
?完成上述配置,你就可以手動在jenkins上啟動構架任務了,但是要做到自動化部署,還必須設置Push操作自動觸發jenkins構建任務的機制。
?我們先到首頁-用戶管理界面打開自己的用戶界面,然后點擊左側的設置按鈕,并點擊show API token
按鈕來獲取API token.然后在構建任務設置頁面的構建觸發器模塊勾選觸發遠程構建選項,并將token填到里邊去。這是jenkins會提示你如何通過URL來觸發構建任務。
?然后我們打開github上相應庫的設置頁面。點擊左側的Webhooks選項,然后添加hook.將上述的url填寫到Payload URL欄中,點擊添加。如果添加成功之后,每次你push一個新版本,那么jenkins就會自動進行部署了。
?如果你發現webhooks發送請求失敗,那可能是因為你jenkins安全設置的問題,禁止掉了發送請求自動化構建。
后記
?本篇講的都是十分基礎性的內容,后一篇文章講一下dockerfile的原理和注意事項與docker registry。