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


    不要忘记最后的斜杠
  • 重新加载配置文件
    systemctl daemon-reload

  • 重启服务
    systemctl restart docker.service

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

    image.png

3. 配置私服

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

3.1 搭建harbor

在harbor上创建项目


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
  • 拉取kafka镜像
    docker pull docker.io/spotify/kafka
  • 上传到私服

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

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

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

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

4.1 无dockerfile方式

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

  • baseImage
    底包

  • entryPoint
    镜像入口

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

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

执行打包上传命令

mvn clean package docker:build -DskipTests -DpushImageTag

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

4.2 dockerfile方式

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

  • 修改pom文件
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.0</version>
                <configuration>
                    <dockerHost>http://ip:2375</dockerHost>
                    <imageName>ip/jcpt/jcpt-java8-jre</imageName>
                    <serverId>harbor</serverId>
                    <registryUrl>ip/jcpt/</registryUrl>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <forceTags>true</forceTags>
                    <imageTags>
                        <imageTag>2.0.13</imageTag>
                        <imageTag>latest</imageTag>
                    </imageTags>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>

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

  • dockerfile文件
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}

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

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


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的一系列操作了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容