在上一篇文章《從零實作DevOps(七):Jenkins+GitLab+Docker部署SpringBoot項目》的總結部分,我們提出了一個疑問,就是項目的安全性和可擴充性!如果使用Dockerfile來打包建構,那麼建構出來的鏡像如果想要儲存的話,就隻能儲存到雲端。這個雲端如果是Docker Hub的話,非開源的項目就十分不安全,那麼怎麼做到Docker鏡像安全存放呢?我們可以去搭建一個Docker私服倉庫,将建構好的鏡像推送到我們的私服倉庫上,就可以保證這個鏡像的安全性。再結合一下Jenkins來說,從主伺服器建構鏡像并上傳,然後在其他伺服器去拉取鏡像再運作,豈不是非常完美。理論到此結束,我們一起去試一下吧!
一、Docker私服搭建
1、前置條件
- 兩台Centos7作業系統(虛拟機或主機均可)
VMware建立虛拟機教程:VMware建立虛拟機教程
- 兩台虛拟機分别安裝Docker
Centos7安裝Docker流程:Centos7安裝Docker流程
- 假設已經安裝并配置好,現在我有兩台伺服器,如下
(1)主伺服器:192.168.1.11
(2)項目伺服器:192.168.1.12
我們所做的就是要在主伺服器上去搭建Docker私服倉庫,然後在項目伺服器上去拉取或送出鏡像!!!
2、主伺服器啟動私服倉庫容器
- 拉取私服倉庫最新版本的鏡像(registry)
docker pull registry
# 拉取成功後檢視是否存在
docker images
- 建立私服鏡像容器并啟動
設定一下自動啟動,這樣重新開機docker後就不用再次啟動容器了!
docker run --restart=always \
--name myregistry -d \
-p 5000:5000 registry
# 啟動成功後檢視啟動狀态
docker ps
- 用浏覽器通路私服倉庫位址
位址:http://192.168.1.11:5000/v2/_catalog
如圖,可以看到在主伺服器上的私服容器已經成功啟動,但是裡邊還沒有任何上傳的鏡像。
- 建立并修改docker源檔案“daemon.json”
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://yy28v837.mirror.aliyuncs.com"],
"insecure-registries":["192.168.1.11:5000"]
}
這裡解釋一下:
“registry-mirrors”是咱們配置的國内阿裡雲鏡像加速下載下傳的位址,從網上可以随便找一個或者可以自己建立一個,建立方法借鑒一個CSDN部落客的部落格,阿裡雲建立docker免費個人容器鏡像托管(私服)服務_阿裡雲容器鏡像服務個人版_金陵搬磚工的部落格-CSDN部落格。有興趣可以自己建立一個試試,如果不想建立的話,也可以跳過這步,直接用文中的即可。
“insecure-registries”就是私服倉庫的位址,也就是現在的本機。
- 重新啟動docker
systemctl restart docker
3、測試私服倉庫是否可以成功上傳鏡像
- 标記鏡像為私服倉庫鏡像
随便找一個鏡像,給這個鏡像打個标簽,證明他是私服倉庫的鏡像
docker tag testproject 192.168.1.11:5000/testproject
查詢一下,标簽是否成功标記
- 上傳标簽鏡像到私服倉庫
docker push 主控端IP:私服端口号/鏡像名稱
docker push 192.168.1.11:5000/testproject
- 浏覽器測試是否上傳成功
- 如圖,可以看到之前打包好的鏡像已經上傳成功!
4、項目伺服器設定私服倉庫位址
- 進入項目伺服器(192.168.1.12)
- 建立并設定Docker配置檔案
vim /etc/docker/daemon.json
{
"insecure-registries":["192.168.1.11:5000"]
}
“insecure-registries”就是私服倉庫的位址
- 重新開機docker
systemctl restart docker
- 拉取剛才上傳的私服鏡像,并檢視是否成功
docker pull 192.168.1.11:5000/testproject
docker images
至此,Docker私服搭建已經全部完成,讓我們把它結合到Jenkins裡試試吧!
二、Jenkins流水線配置
Docker私服搭建成功之後,我們需要把他結合到Jenkins中,那麼怎麼結合,流程又是怎樣呢?其實很簡單,就是兩步:
- Jenkins主伺服器打包鏡像并上傳到Docker私服倉庫
- SSH到項目伺服器,然後拉取鏡像并運作
試一下,搞起來!
1、準備工作
參考一下我之前寫的這篇文章:
Jenkins以傳統jar包方式部署SpringBoot項目教程:Jenkins以傳統jar包方式部署SpringBoot項目教程
從這一篇教程中,除了最後一步的”Execute shell”不需要跟着做,其他都可以進行配置,包括:
(1)Jenkins安裝Maven、GitLab插件并進行Maven的全局配置
(2)建立流水線,配置項目git位址和分支,與GitLab挂鈎配置Webhooks
(3)選擇Maven Shell并配置Maven指令打包
建立完成後的效果:
(1)源碼管理
(2)建構觸發器
(3)建構環境
(4)編譯項目
到此為止,所有的前置條件全部準備完畢,我們開始進行Docker私服的部署!!!
2、建構Docker鏡像并上傳私服倉庫
- Dockerfile編寫并放入項目根目錄
Dockerfile檔案的寫法可以參考這篇連結:Dockerfile檔案編寫
- “Build Steps”中,Maven打包之後,點選“增加建構操作”,選擇“Execute shell”
- 在已選擇的“Execute shell”中,填寫指定Dockerfile的指令
#!/bin/bash
# 删除已經建構好的鏡像
docker rmi hhproject:latest
# 使用Dockerfile來建構自己的鏡像(testProject就是鏡像名稱,latest是版本号)
# 最後的“.”千萬不要忘記加
docker build -t hhproject:latest .
# 給建立好的鏡像打标簽
docker tag hhproject 192.168.1.11:5000/hhproject
# 給打好标簽的鏡像上傳的私服倉庫
docker push 192.168.1.11:5000/hhproject
- 點選應用、儲存,傳回到流水線首頁
- 點選“Build Now”或者送出一次代碼,看一下是否開始建構
- 建構成功後,檢視一下浏覽器裡的私服位址,看一下鏡像是否上傳成功
- 可以看到,剛才推送的鏡像已經推送成功!
3、遠端伺服器寫腳本(拉取鏡像+啟動容器)
建立檔案夾和腳本檔案
mkdir -p /data/registry
cd /data/registry
vim deploy.sh
腳本内容deploy.sh為:
#!/bin/bash
# 強制删除正在運作的容器
docker rm -f hhproject
# 删除原有的私服鏡像
docker rmi 192.168.1.11:5000/hhproject
# 重新拉取私服倉庫的鏡像
docker pull 192.168.1.11:5000/hhproject
# 根據打包好的鏡像來建立容器并啟動
docker run --name hhproject -p 8087:8085 -d 192.168.1.11:5000/hhproject:latest
4、Jenkins配置SSH遠端指令
Jenkins安裝“Publish Over SSH”插件教程:Jenkins安裝“Publish Over SSH”插件教程
- 在剛才的”Execute shell“,繼續”增加建構操作“,選擇”Send files or execute commands over SSH“
- 在”SSH Server Name“中選擇項目伺服器,之前的系列文章中以有過配置
- 在最後一項”Exec command“中,執行剛才配置的啟動腳本
sh /data/registry/deploy.sh
配置完成後,如圖:
- 點選應用,儲存,回到首頁,點選”Build Now“,測試是否建構成功
5、測試結果
剛才建構成功後,進入項目伺服器(192.168.1.12)。我們可以發現,私服倉庫的鏡像已經拉取成功,并且容器已經啟動成功。
三、總結
至此,搭建Docker私服以及将私服運用到Jenkins遠端部署文章已經全部完成。主要的技術點在于:私服的容器啟動、遠端伺服器的Docker配置、以及遠端伺服器執行腳本的編寫。流程非常明确:主伺服器建構鏡像并上傳到私服倉庫,然後項目伺服器拉取鏡像并啟動。其實,到此為止,《從零實作DevOps》系列已經進入尾聲,還差一篇自動化部署微服務的文章,最近項目忙,有時間我會繼續更新。感謝大家喜歡,一起努力!!!
所有你想象的一切,皆是現實!