javaWeb学习docker

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

2019-05-08  本文已影响25人  虫儿飞ZLEI

1. 需求

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

需要做到的功能是:

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

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

2.1 安装docker

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

2.1 docker配置远程访问

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

3. 配置私服

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

3.1 搭建harbor

在harbor上创建项目


3.2 docker 连接私服

{
        "insecure-registries":["192.168.206.61"],
        "registry-mirrors": ["https://registry.docker-cn.com"]
}

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

{
        "auths": {
                "192.168.206.61": {
                        "auth": "emhvdWh1aTpaaG91aHVpMTIzNDU2"
                }
        }
}

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

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

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

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

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

4.1 无dockerfile方式

            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.0</version>
                <configuration>
                    <dockerHost>http://192.168.210.19:2375</dockerHost>
                    <imageName>192.168.206.61/jcpt/jcpt-java8-jre</imageName>
                    <serverId>harbor</serverId>
                    <registryUrl>192.168.206.61/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>
  <servers>
    <server>
        <id>harbor</id>
        <username>harbor的用户名</username>
        <password>harbor的密码</password>
    </server>
  </servers>

执行打包上传命令

mvn clean package docker:build -DskipTests -DpushImageTag

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

4.2 dockerfile方式

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

            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.0</version>
                <configuration>
                    <dockerHost>http://192.168.210.19:2375</dockerHost>
                    <imageName>192.168.206.61/jcpt/jcpt-java8-jre</imageName>
                    <serverId>harbor</serverId>
                    <registryUrl>192.168.206.61/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文件指定了。

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:192.168.220.185 --add-host ahhx-yf-elkserver-node02:192.168.220.184 --add-host ahhx-yf-elkserver-node03:192.168.220.186  -p 9099:9099 192.168.206.61/jcpt/jcpt-java8-jre:latest

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

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

上一篇下一篇

猜你喜欢

热点阅读