Devops的概念已經(jīng)火了很久了,我一直想對這方面進(jìn)行一定的了解掌猛;再加上實(shí)驗(yàn)室項(xiàng)目環(huán)境依賴比較復(fù)雜盏浙,希望使用Docker來解決,所以最近就好好研究了一波Docker的相關(guān)實(shí)踐和原理荔茬。這里整理一下废膘,希望組成一個系列,從實(shí)踐到原理詳細(xì)講解一下Docker的使用慕蔚。
?第一篇就講一下Jenkins+Docker的自動化部署實(shí)踐丐黄。大致的流程如下:目前我有兩個服務(wù)器,分別是阿里云和bandwagon,代碼存儲在github上孔飒,每次push都會觸發(fā)阿里云上的jenkins的構(gòu)建任務(wù)灌闺,jenkins將github上的代碼fetch到本地,編譯打包成war文件坏瞄,生成docker image并上傳到docker registry上桂对,然后通過ssh來登錄bandwagon服務(wù)器pull下來新生成的image并啟動。由于篇幅問題惦积,本篇文章不會介紹有關(guān)docker image的build和docker registry的搭建接校,但是我會在后續(xù)文章中再做詳細(xì)講解。
?學(xué)習(xí)Docker,我推薦先在網(wǎng)絡(luò)上找說明指南蛛勉,一步一步自己嘗試的使用鹿寻,然后如果覺得有必要可以看一下《Docker容器和容器云》這本書。
?本文內(nèi)容都是docker和jenkins的基礎(chǔ)知識诽凌,為了節(jié)約你的時間毡熏,本文的主要內(nèi)容如下:
- docker 基礎(chǔ)命令
- jenkins docker版本的搭建,構(gòu)建任務(wù)的配置
- Pubish Over SSH 安裝和配置
- 通過github的webhook來觸發(fā)jenkins構(gòu)建任務(wù)
Docker運(yùn)行jenkins
Docker如此火爆的一個原因是因?yàn)樗纬闪艘粋€良好的生態(tài)圈侣诵,基本上主流的軟件應(yīng)用都有相應(yīng)的Docker image痢法。如果大家不清楚Docker image的含義,建議大家看一下Docker中文指南杜顺,我們可以通過docker pull
命令來下載響應(yīng)的image,然后運(yùn)行财搁。比如我們希望在阿里云服務(wù)器上部署一個jenkins應(yīng)用,首先可以執(zhí)行下列語句來獲取一個jenkins的image躬络。
docker pull jenkinsci/jenkins:lts
這里我們使用pull從docker registry上拉取image,但是目前業(yè)界上有很多共有或在私有的docker registry,比如說docker hub和daoCloud尖奔。所以image的全稱就由三部分組成:域名或在ip + / + 軟件名稱 + : + 版本號,所以上邊的這條命令就是讓docker去jenkinsci這個Jenkins機(jī)構(gòu)自己部署的registry上下載jenkins的lts版本的image.你也可以直接使用docker pull jenkins
來下載image,但docker會默認(rèn)的從docker hub上下載jenkins的laster版本穷当。
下載成功之后提茁,你可以使用docker images
命令來查看當(dāng)前下載的image信息
你可以通過docker run
命令來運(yùn)行docker容器,請注意我這里的用詞馁菜,在Docker中image和container是不同的概念茴扁,你可以將他們簡單的理解成Java中類和對象的關(guān)系。我們使用下面的命令來啟動這個jenkins容器汪疮。
sudo docker run -d --name jenkins -p 9090:8080 -v /var/jenkins_home:/var/jenkins_home jenkinsci/jenkins:lts
我們來依次講解一下run命令的幾個參數(shù)把:
-d
后臺運(yùn)行docker容器并打印容器ID峭火。如果不加-d
參數(shù),那么容器運(yùn)行會和終端綁定铲咨,如果終端關(guān)閉躲胳,那么容器也會關(guān)閉,但是容器不會被刪除纤勒。但是如果你只是想試一試某個容器坯苹,運(yùn)行后自動進(jìn)入命令行,那么可以使用-it參數(shù);如果你想容器關(guān)閉之后自動刪除摇天,那么就使用-rm參數(shù)粹湃。--name
給docker container起一個別名,后續(xù)可以通過別名來管理容器泉坐,否在會系統(tǒng)會默認(rèn)分配一個隨機(jī)的別名为鳄。-p
docker容器和外側(cè)的端口映射,jenkins服務(wù)是運(yùn)行在docker容器內(nèi)部的腕让,但是docker容器默認(rèn)不對外暴露接口孤钦,所以通過這個參數(shù)將內(nèi)部的8080端口映射到服務(wù)器本身的9090端口上歧斟。-v
數(shù)據(jù)卷的掛載。這里涉及到docker container的一個特性偏形,container如果停止運(yùn)行了静袖,那么再次啟動時,之前所有運(yùn)行相關(guān)的數(shù)據(jù)和文件就都不存在了俊扭,就類似于設(shè)置了自動還原的電腦一般队橙,無論你做了多少的操作,一旦關(guān)機(jī)重啟之后就又恢復(fù)到最初的狀態(tài)萨惑。數(shù)據(jù)卷就是來解決上述問題的捐康,通過Docker container外部的文件夾的掛載,將可持久化的文件存儲到外部掛載的文件夾中庸蔼。
然后你就可以根據(jù)你自己的ip地址來鍵入下列地址http:ip:9090來訪問jenkins的主頁了解总。
?這里有一點(diǎn)需要注意的是,需要注意你阿里云服務(wù)器設(shè)置的網(wǎng)絡(luò)安全協(xié)議朱嘴,是否禁用掉了9090這個端口倾鲫。
Publish over SSH配置
?Jenkins的初始化配置和SSH Over Publish的安裝請大家自行百度粗合,這里我主要講解一下SSH Over Pushlish配置萍嬉。
?首先我們要在jenkins服務(wù)器上生成密鑰對,使用ssh-keygen -t rsa
命令來生成秘密對隙疚,這樣的話壤追,在~/.ssh/下就會有私鑰id_rsa和公鑰id_rsa.pub。
?然后你需要上傳公鑰到目標(biāo)服務(wù)器上供屉,也就是我的bandwagon服務(wù)器上行冰,可以使用ssh-copy-id
來將文件上傳到服務(wù)器上,類似于scp
命令的使用方式伶丐。
ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<host>
?最后我們需要修改目標(biāo)服務(wù)器的ssh配置文件悼做,配置文件為/etc/ssh/sshd_config。設(shè)置ssh-server允許使用私鑰和公鑰對的方式登錄哗魂,然后使用sudo /etc/init.d/ssh restart
命令重啟ssh服務(wù)肛走。
RSAAuthentication yes
PubkeyAuthentication yes
#AuthorizedKeysFile %h/.ssh/authorized_keys
?上述步驟成功之后,大家在系統(tǒng)管理中配置Publish over SSH录别。相關(guān)的配置信息如下圖所示朽色。
?你還可以點(diǎn)擊下方的高級選項(xiàng),來配置ssh服務(wù)器的端口组题,超時時間等信息葫男,還可以點(diǎn)擊Test Configuration來檢測是否配置成功。
構(gòu)建任務(wù)配置
?我們先創(chuàng)建一個構(gòu)建任務(wù)崔列,該任務(wù)從github repo上將代碼拉取下來梢褐,然后執(zhí)行構(gòu)建任務(wù),然后通過Publish Over SSH在目標(biāo)服務(wù)器上進(jìn)行部署。
?我們首先配置源碼管理模塊盈咳,選擇Git選項(xiàng)趣效,然后配置Repository URL 并添加認(rèn)證信息≈硖埃可以將自己的github帳號和密碼加入其中跷敬。
?不同的項(xiàng)目的構(gòu)建命令不同,但是我們可以在構(gòu)建后操作模塊設(shè)置后續(xù)操作热押,通過ssh登錄目標(biāo)服務(wù)器西傀,讓目標(biāo)服務(wù)器執(zhí)行命令行操作來pull最新上傳的image并且執(zhí)行,這樣就完成了部署桶癣。
Push觸發(fā)構(gòu)建任務(wù)
?完成上述配置拥褂,你就可以手動在jenkins上啟動構(gòu)架任務(wù)了,但是要做到自動化部署牙寞,還必須設(shè)置Push操作自動觸發(fā)jenkins構(gòu)建任務(wù)的機(jī)制饺鹃。
?我們先到首頁-用戶管理界面打開自己的用戶界面,然后點(diǎn)擊左側(cè)的設(shè)置按鈕间雀,并點(diǎn)擊show API token
按鈕來獲取API token.然后在構(gòu)建任務(wù)設(shè)置頁面的構(gòu)建觸發(fā)器模塊勾選觸發(fā)遠(yuǎn)程構(gòu)建選項(xiàng)悔详,并將token填到里邊去。這是jenkins會提示你如何通過URL來觸發(fā)構(gòu)建任務(wù)惹挟。
?然后我們打開github上相應(yīng)庫的設(shè)置頁面茄螃。點(diǎn)擊左側(cè)的Webhooks選項(xiàng),然后添加hook.將上述的url填寫到Payload URL欄中连锯,點(diǎn)擊添加归苍。如果添加成功之后,每次你push一個新版本运怖,那么jenkins就會自動進(jìn)行部署了拼弃。
?如果你發(fā)現(xiàn)webhooks發(fā)送請求失敗,那可能是因?yàn)槟鉰enkins安全設(shè)置的問題摇展,禁止掉了發(fā)送請求自動化構(gòu)建吻氧。
后記
?本篇講的都是十分基礎(chǔ)性的內(nèi)容,后一篇文章講一下dockerfile的原理和注意事項(xiàng)與docker registry吗购。