SpringBoot项目整合Jenkins打包docker并上传私服

1. 需求

当前的操作流程是:
将springboot项目上传到svn库以后,执行jenkins的build操作,然后jenkins build完以后将项目jar包复制到目标服务器上,通过启动脚本来启动jar包

需要做到的功能是:

将SpringBoot项目上传到svn库以后,执行jenkins的build操作时,jenkins在构建项目后会将项目打成docker镜像,并且将镜像上传到私服,最后jenkins控制目标服务器从私服拉取镜像并启动。

2. 首先需要在jenkins服务器和目标服务其上面安装docker

2.1 安装docker

  • 检查内核版本,必须是3.10及以上
    uname -r
  • 安装docker
    yum install docker
  • 启动docker
    systemctl start docker
  • 查看docker 版本
    docker -v
    或者docker version
  • 开机启动docker
    systemctl enable docker
  • 停止docker
    systemctl stop docker

ps: 理论上应该是一切顺利的,但是实际上在安装的过程中也许就会遇到一些问题,比如内核版本过低,比如网络防火墙,比如不支持systemctl等等原因。这里不再追溯,因为问题可能千奇百怪。

2.1 docker配置远程访问

这步操作的目的是让docker可以远程访问你,这样程序就可以在其他机器上将镜像打包到docker所在的机器上了。

  • 修改/usr/lib/systemd/system/docker.service


    SpringBoot项目整合Jenkins打包docker并上传私服_第1张图片
    不要忘记最后的斜杠
  • 重新加载配置文件
    systemctl daemon-reload

  • 重启服务
    systemctl restart docker.service

  • 查看端口是否开启
    netstat -nptl

    SpringBoot项目整合Jenkins打包docker并上传私服_第2张图片
    image.png

  • 直接curl看是否生效
    curl http://127.0.0.1:2375/info
    SpringBoot项目整合Jenkins打包docker并上传私服_第3张图片

3. 配置私服

docker 的仓库是docker hub,我们使用自己的私服harbor

3.1 搭建harbor

在harbor上创建项目


SpringBoot项目整合Jenkins打包docker并上传私服_第4张图片

3.2 docker 连接私服

  • 修改/etc/docker/daemon.json
{
        "insecure-registries":["ip"],
        "registry-mirrors": ["https://registry.docker-cn.com"]
}
  • 修改完以后,重启docker

  • 登陆私服
    docker login ip
    ip就是私服的ip,然后需要填写harbor的用户名和密码

完了之后,可以在/root/.docker/config.json看到信息

{
        "auths": {
                "ip": {
                        "auth": "emhvdWh1aTpaaG91aHVpMTIzNDU2"
                }
        }
}

可以检验一下,私服能不能用,先从docker hub上拉下来一个镜像,然后把它上传到私服上去。

  • 搜索kafka镜像
    docker search kafka
    SpringBoot项目整合Jenkins打包docker并上传私服_第5张图片
  • 拉取kafka镜像
    docker pull docker.io/spotify/kafka
    SpringBoot项目整合Jenkins打包docker并上传私服_第6张图片
  • 上传到私服

给镜像添加tag
docker tag docker.io/spotify/kafka:latest ip/jcpt/docker.io/spotify/kafka

上传到私服
docker push ip/jcpt/docker.io/spotify/kafka:latest

SpringBoot项目整合Jenkins打包docker并上传私服_第7张图片

SpringBoot项目整合Jenkins打包docker并上传私服_第8张图片

4. Spring Boot 项目打镜像并上传私服

需要引入maven插件docker-maven-plugin

4.1 无dockerfile方式

  • 修改pom文件
            
                com.spotify
                docker-maven-plugin
                1.2.0
                
                    http://ip:2375
                    ip/jcpt/jcpt-java8-jre
                    harbor
                    ip/jcpt/
                    fabric8/java-alpine-openjdk8-jre
                    ["java", "-jar", "./jcpt.jar"]
                    true
                    
                        2.0.13
                        latest
                    
                    
                        
                            /
                            ${project.build.directory}
                            ${project.build.finalName}.jar
                        
                    
                
            
  • dockerHost
    打包docker镜像的docker服务器,前面配置docker远程访问的作用就在此,会将docker构建在dockerHost配置的机器上
  • imageName
    镜像名称
  • serverId
    配置上传远程私服的serverId,需要在maven的setting.xml文件中配置对应的server
  
    
        harbor
        harbor的用户名
        harbor的密码
    
  
  • registryUrl
    私服的url

  • baseImage
    底包

  • entryPoint
    镜像入口

  • forceTags
    覆盖之前相同tag的镜像

  • imageTags
    镜像的tag,可制定多个

执行打包上传命令

mvn clean package docker:build -DskipTests -DpushImageTag

在目标机器上就会有镜像,并且push到了远程

4.2 dockerfile方式

在比较简单的场景下,不使用dockerfile就可以都建docker了,但是复杂一点的情况,就需要使用dockerfile了,dockerfile有一些自己的语法,这里只是简单使用

  • 修改pom文件
            
                com.spotify
                docker-maven-plugin
                1.2.0
                
                    http://ip:2375
                    ip/jcpt/jcpt-java8-jre
                    harbor
                    ip/jcpt/
                    src/main/docker
                    true
                    
                        2.0.13
                        latest
                    
                    
                        
                            /
                            ${project.build.directory}
                            ${project.build.finalName}.jar
                        
                    
                
            

使用dockerDirectory指定dockerfile文件所在的位置,不需要entryPoint和baseImage了,这些都放在dockerfile文件指定了。

  • dockerfile文件
SpringBoot项目整合Jenkins打包docker并上传私服_第9张图片
FROM fiadliel/java8-jre
ADD /jcpt.jar //
ENTRYPOINT ["java", "-jar", "./jcpt.jar"]

同样使用上面的打包命令
mvn clean package docker:build -DskipTests -DpushImageTag

5. 整合Jenkins将所有流程串起来

5.1 在jenkins的maven中添加构建和push docker的指令

clean package docker:build -DskipTests -DpushImageTag -Dproject.build.finalName=${BUILD_NAME} -Dnacos.server=${cloud.nacos} -P${mode}

SpringBoot项目整合Jenkins打包docker并上传私服_第10张图片

5.2 在jenkins的maven中指定settings.xml文件

因为settings.xml中包含了harbor的用户名密码的server


SpringBoot项目整合Jenkins打包docker并上传私服_第11张图片

5.3 post steps中控制目标服务器拉取镜像并运行

docker pull 192.168.206.61/jcpt/jcpt-java8-jre:latest
docker run -d --name jcpt --add-host ahhx-yf-elkserver-node01:ip --add-host ahhx-yf-elkserver-node02:ip --add-host ahhx-yf-elkserver-node03:ip -p 9099:9099 ip/jcpt/jcpt-java8-jre:latest

ps:
-p 9099:9099:开放端口
--add-host ahhx-yf-elkserver-node03:ip:添加host

到此结束,构建jenkins的时候,就会自动执行docker的一系列操作了。

你可能感兴趣的:(SpringBoot项目整合Jenkins打包docker并上传私服)