Jenkins + Docker 簡單部署 node.js 項目

有了前幾篇的基礎後,我們現在已經能

docker 篇

  • 構建 docker 鏡像
  • 上傳私有倉庫
  • 拉取私有鏡像
  • 啓動容器

jenkins 篇

  • 配置 pipeline
  • 觸發 pipeline

接下來就可以結合兩者,用 jenkins + docker 來自動化部署我們的項目。

配置 Jenkins

jenkins 的配置思路爲

  1. 構建機(IP: xx.xx.xx.xx)拉取代碼
  2. 構建機安裝依賴
  3. 構建機運行測試
  4. 構建機打包並上傳鏡像至私有鏡像倉庫
  5. 部署機(IP: yy.yy.yy.yy)拉取鏡像
  6. 部署機重啓服務

對應 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

BuildDeploy 環節裏,使用了 $BUILD_NUMBER 這個變量來作爲鏡像的 tag,這個變量是 jenkins 的系統變量之一,代表當前的構建號,每次構建這個號會加一,所以可以作爲我們鏡像的 tag。其他系統變量可 在此查看

Network

這裏使用 docker run 命令的時候,加入了 --network 參數,這個參數用來指定 Docker 容器運行的網絡,默認爲 bridge,即橋接模式。這種模式下在容器內通過 localhost 是訪問不到宿主機的。

如果指定爲 host 則容器與宿主機共用網絡,就無需使用 -p 命令映射端口了。這種模式下會破話隔離性,這裏是爲了在容器內方便地連接宿主機的 mysqlredis,推薦將 mysqlredis 也使用 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 掛載容器內日誌目錄到宿主機。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章