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 root@xx.xx.xx.xx "
                                  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 sunhengzhe@foxmail.com
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 挂载容器内日志目录到宿主机。

相关推荐