有了前几篇的基础后,我们现在已经能docker 篇:构建 docker 镜像上传私有仓库拉取私有镜像启动容器jenkins 篇:配置 pipeline触发 pipeline接下来就可以结合两者,用 jenkins + docker 来自动化部署我们的项目。配置 Jenkinsjenkins 的配置思路为构建机(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 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在 Build 和 Deploy 环节里,使用了 $BUILD_NUMBER 这个变量来作为镜像的 tag,这个变量是 jenkins 的系统变量之一,代表当前的构建号,每次构建这个号会加一,所以可以作为我们镜像的 tag。其他系统变量可 在此查看。Network这里使用 docker run 命令的时候,加入了 –network 参数,这个参数用来指定 Docker 容器运行的网络,默认为 bridge,即桥接模式。这种模式下在容器内通过 localhost 是访问不到宿主机的。如果指定为 host 则容器与宿主机共用网络,就无需使用 -p 命令映射端口了。这种模式下会破话隔离性,这里是为了在容器内方便地连接宿主机的 mysql 和 redis,推荐将 mysql 和 redis 也使用 docker 运行,host 值可作为一种临时解决方案。配置 Dockerdocker 的配置无需做太多修改FROM node:10.15.0-alpineMAINTAINER sunhengzhe@foxmail.comCOPY . /app/WORKDIR /appRUN npm install pm2 -gEXPOSE 1337CMD [“pm2-runtime”, “pm2/production.json”]这里的基本镜像使用了 node 的 alpine 版本,alpine 是面向安全的轻型 Linux 发行版,它的体积非常小。目前 Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu 做为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等。其他删除镜像如果需要批量删除镜像,可以使用docker rmi $(docker images | grep ‘镜像名’ | awk ‘{print $3}’) 持久化日志如上篇提到的,可以通过 -v 挂载容器内日志目录到宿主机。