有了前幾篇的基礎後,我們現在已經能
- 構建 docker 鏡像
- 上傳私有倉庫
- 拉取私有鏡像
- 啓動容器
- 配置 pipeline
- 觸發 pipeline
接下來就可以結合兩者,用 jenkins + docker 來自動化部署我們的項目。
配置 Jenkins
jenkins 的配置思路爲
- 構建機(IP: xx.xx.xx.xx)拉取代碼
- 構建機安裝依賴
- 構建機運行測試
- 構建機打包並上傳鏡像至私有鏡像倉庫
- 部署機(IP: yy.yy.yy.yy)拉取鏡像
- 部署機重啓服務
對應 pipeline 配置如下
pipeline {
agent any
stages {
stage('Update') {
steps {
sh """
npm install
"""
}
}
stage('Test') {
steps {
sh "npm test"
}
}
stage('Build') {
steps {
sh """
docker build -t localhost:5000/wool-digger-api:$BUILD_NUMBER .
docker push localhost:5000/wool-digger-api:$BUILD_NUMBER
"""
}
}
stage('Deploy') {
steps {
sh """
ssh -o stricthostkeychecking=no [email protected] "
source /etc/profile
docker pull yy.yy.yy.yy:5000/wool-digger-api:$BUILD_NUMBER
docker rm -f wool-digger-api
docker run -d --name=wool-digger-api --network host yy.yy.yy.yy:5000/wool-digger-api:$BUILD_NUMBER
"
"""
}
}
}
}
BULID_NUMBER
在 Build
和 Deploy
環節裏,使用了 $BUILD_NUMBER
這個變量來作爲鏡像的 tag,這個變量是 jenkins 的系統變量之一,代表當前的構建號,每次構建這個號會加一,所以可以作爲我們鏡像的 tag。其他系統變量可 在此查看。
Network
這裏使用 docker run
命令的時候,加入了 --network
參數,這個參數用來指定 Docker 容器運行的網絡,默認爲 bridge
,即橋接模式。這種模式下在容器內通過 localhost
是訪問不到宿主機的。
如果指定爲 host
則容器與宿主機共用網絡,就無需使用 -p
命令映射端口了。這種模式下會破話隔離性,這裏是爲了在容器內方便地連接宿主機的 mysql
和 redis
,推薦將 mysql
和 redis
也使用 docker 運行,host
值可作爲一種臨時解決方案。
配置 Docker
docker 的配置無需做太多修改
FROM node:10.15.0-alpine
MAINTAINER [email protected]
COPY . /app/
WORKDIR /app
RUN npm install pm2 -g
EXPOSE 1337
CMD ["pm2-runtime", "pm2/production.json"]
這裏的基本鏡像使用了 node 的 alpine 版本,alpine 是面向安全的輕型 Linux 發行版,它的體積非常小。目前 Docker 官方已開始推薦使用 Alpine 替代之前的 Ubuntu 做爲基礎鏡像環境。這樣會帶來多個好處。包括鏡像下載速度加快,鏡像安全性提高,主機之間的切換更方便,佔用更少磁盤空間等。
其他
刪除鏡像
如果需要批量刪除鏡像,可以使用
docker rmi $(docker images | grep '鏡像名' | awk '{print $3}')
持久化日誌
如上篇提到的,可以通過 -v
掛載容器內日誌目錄到宿主機。