起因:入职后公司需要的技能,全部项目都使用的Jenkins+Docker部署
深入了解Jenkins、Docker、SVN,去上面三个大佬的文章里看,我只总结使用步骤:
部署需求:父子依赖关系的SpringBoot项目,子系统依赖父工程中的内容,要求部署子系统,父子系统均放在SVN同级目录中(下图所示)
---- Jenkinsfile // 这句就不用写上了
pipeline {
agent none
environment {
VERSION = 'V1.0.0'
}
stages {
stage('build') {
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2'
}
}
steps {
sh 'cd xxx-base; mvn clean install'
sh 'cd xxx-scm; mvn clean package -U'
}
}
stage('docker') {
agent any
steps {
sh 'cd xxx-scm; docker build -f xxx-scm/Dockerfile -t reg.xxx.com/dev/xxx-scm:${SVN_REVISION} xxx-scm-system/target'
sh 'docker push reg.xxx.com/dev/xxx-scm:${SVN_REVISION}'
}
}
}
}
主要解释下面两句,上面两句比较死:
sh 'cd xxx-scm; docker build -f xxx-scm/Dockerfile -t reg.xxx.com/dev/xxx-scm:${SVN_REVISION} xxx-scm-system/target'
这句说的是,切换到子工程所在的路径,然后在子工程的 xxx-scm-system/target 目录下,根据Dockerfile构建一个容器,并取名为 reg.xxx.com/dev/xxx-scm,并设置tag为${SVN_REVISION},这里的 xxx-scm-system 即为项目启动类所在的模块,子工程打包后的jar包存放路径即为 xxx-scm-system/target。
sh 'docker push reg.xxx.com/dev/xxx-scm:${SVN_REVISION}'
这句是,推送镜像到远程仓库,远程仓库可能是自己公司搭建的
---- Dockerfile // 这句就不用写上了
FROM reg.xxx.com/dev/xxx-jre:8.1
WORKDIR /xxx
VOLUME /xxx-log
COPY xxx-scm-system-*-SNAPSHOT.jar xxx-scm.jar
EXPOSE 8877
ENTRYPOINT java $JAVA_OPTS -jar xxx-scm.jar
6. 把Dockerfile和Jenkinsfile上传到SVN路径下,进入Jenkins,点击“立即构建”打包项目并上传到远程仓库。绿了就对了,没绿就是错。
7. 下载镜像:打包完成后,鼠标放到 docker列上,选择 logs,选择上方的最后一行。
这里是点击进入后的界面,复制镜像名,下图所示
登录装有Docker镜像的服务器,把镜像拉取下来:执行docker pull reg.xxx.com/dev/xxx-scm:45469
,查看拉取状况 docker images
如果要下载镜像到windows,可以这样,执行 docker save -o xxx-scm:45469.tar reg.xxx.com/dev/xxx-scm:45469
,将镜像保存到了当前目录下,然后使用ftp工具down到window就行了
8. 运行容器,docker run -p 8877:8877 -v /root/SCM/config:/xxx/config -v /opt:/opt -d --name xxx-scm reg.xxx.com/dev/xxx-scm:45469
这句是说,映射容器的8877端口到物理机的8877端口,将容器的 /xxx/config 路径挂载到物理机的 /root/SCM/config 路径,将容器的 /opt 挂载到物理机的 /opt 路径,-d 表示以守护进程的模式运行容器,容器的名字叫 xxx-scm,建立容器 使用的镜像是 reg.xxx.com/dev/xxx-scm:45469。至于挂载哪个容器哪个目录,这里有句话要说,在 Dockerfile里有个配置项,叫WORKDIR /xxx
,这里的 /xxx,就是下图的 /xxx。