有了前几篇的基础后,我们现在已经能
- 构建 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 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
值可作为一种临时解决方案。
配置 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
挂载容器内日志目录到宿主机。