jenkins打包构建springboot项目为docker镜像并上传nexus私服

前提:jenkins,docker,nexus都已经搭建完毕

一. 开启docker远程访问

  1.修改docker.service文件

   Docker 安装成功之后,首先需要修改 Docker 配置来开启允许远程访问 Docker 的功能。
    文件位置:/lib/systemd/system/docker.service
    修改内容:在加入如下内容:
DOCKER_OPTS=“-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock”
jenkins打包构建springboot项目为docker镜像并上传nexus私服_第1张图片

2.添加http访问

  由于我们私库使用的时http而不是https ,故需要在启动参数文件中设置。
  文件地址:/etc/docker/daemon.json(如果该路径下没有daemon.json文件需要自己创建一个)
  添加内容:docker hosted类型仓库地址 ip:端口号

{
	"insecure-registries": [
    	    "ip:端口号"
    	]
}

jenkins打包构建springboot项目为docker镜像并上传nexus私服_第2张图片
  开放2375端口

firewall-cmd --zone=public --add-port=2375/tcp --permanent
systemctl restart firewalld

  重启docker

systemctl daemon-reload
systemctl restart docker

  登录验证

docker login -u登录私库的用户名  -p密码 ip:端口号

在登录需要输入登录用户名及密码,即为你的nexus3的登录用户名及密码
输出Login Succeeded即登录成功
jenkins打包构建springboot项目为docker镜像并上传nexus私服_第3张图片

  上传镜像

    可以尝试将自己服务器上的镜像上传的nexus
    标记要上传的镜像为私有仓库镜像;

docker tag 镜像名称:版本号(这里也可以是镜像id) 私库ip:端口号/镜像名称:版本号

   例如:

docker tag mongo:latest 192.168.0.xx:8083/mongo:latest

  上传镜像

docker push 192.168.0.xx:8083/mongo:latest

  登录nexus网页查看上传镜像:
jenkins打包构建springboot项目为docker镜像并上传nexus私服_第4张图片

  仓库类型说明:

    group:这是一个仓库聚合的概念,用户仓库地址选择 Group 的地址,即可访问 Group 中配置的,用于方便开发人员自己设定的仓库。
    maven-public 就是一个 Group 类型的仓库,内部设置了多个仓库,访问顺序取决于配置顺序,3.x 默认为 Releases、Snapshots、Central,当然你也可以自己设置。
    hosted:私有仓库,内部项目的发布仓库,专门用来存储我们自己生成的 jar 文件
    snapshots:本地项目的快照仓库
    releases: 本地项目发布的正式版本
    proxy:代理类型,从远程中央仓库中寻找数据的仓库(可以点击对应的仓库的 Configuration 页签下, Remote Storage 属性的值即被代理的远程仓库的路径),如可配置阿里云 maven 仓库
    central:中央仓库

二. 项目配置

  1.写dockerfile文件

        在跟resources文件下添加Dockerfile文件(不是必须在resources下)
jenkins打包构建springboot项目为docker镜像并上传nexus私服_第5张图片
    Dockerfile文件内容

FROM openjdk:11
MAINTAINER xxx

# 在主机 /var/lib/docker目录下创建一个临时文件,并链接到容器的 /tmp
VOLUME /tmp
#
# 将jar包添加到容器中,并命名为 test.jar
ADD test-1.0.jar test.jar
# 指定nacos的命名空间和运行环境
ENV SPRING_CLOUD_NACOS_CONFIG_NAMESPACE='xxx'
ENV SPRING_PROFILES_ACTIVE='xxx'
# 运行jar包
ENTRYPOINT java -Xms128m -Xmx128m -Dspring.cloud.nacos.config.server-addr=xxx:8848  -Dspring.cloud.nacos.config.namespace=${SPRING_CLOUD_NACOS_CONFIG_NAMESPACE}  -Dspring.cloud.nacos.config.username=xxx -Dspring.cloud.nacos.config.password=xxx -Dspring.cloud.nacos.config.file-extension=yaml -Dspring.profiles.active=${SPRING_PROFILES_ACTIVE} -jar test.jar
# 设置时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

# SpringBoot项目配置的端口号为9999,需要将9999暴露出去
EXPOSE 9999

dockerfile文件关键字介绍

关键字 作用 备注
FROM 指定父镜像 指定dockerfile基于那个image构建
MAINTAINER 作者信息 用来标明这个dockerfile谁写的
LABEL 标签 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看
RUN 执行命令 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”]
CMD 容器启动命令 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”]
ENTRYPOINT 入口 一般在制作一些执行就关闭的容器中会使用
COPY 复制文件 build的时候复制文件到image中
ADD 添加文件 build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务
ENV 环境变量 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value
ARG 构建参数 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数
VOLUME 定义外部可以挂载的数据卷 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”]
EXPOSE 暴露端口 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR 工作目录 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径
USER 指定执行用户 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户
HEALTHCHECK 健康检查 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制
ONBUILD 触发器 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大
STOPSIGNAL 发送信号量到宿主机 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。
SHELL 指定执行脚本的shell 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell

  2.配置不同环境的服务器

  在父pom中设置不同环境服务器

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <profiles>
        <profile>
            <!--不同环境Profile的唯一id-->
            <id>dev</id>
            <properties>
                <!--profiles.active是自定义的字段(名字随便起),自定义字段可以有多个-->
                <profiles.active>dev</profiles.active>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <profiles.active>prod</profiles.active>
                <docker-url>http://生产服务器ip:2375</docker-url>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <profiles.active>test</profiles.active>
                <docker-url>http://测试服务器ip:2375</docker-url>
            </properties>
            <!--设置默认为测试环境-->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
    </profiles>
 </project>

  在子pom.xml中进行详细的配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>test</artifactId>
        <groupId>com.xxx</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>prosper-provider-user</artifactId>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <prosper-common.version>1.1.4-SNAPSHOT</prosper-common.version>
        <!--nexus3 hosted 仓库地址-->
        <registry-url>nexus服务器地址:8083</registry-url>
    </properties>

    <dependencies>
    </dependencies>
    <build>
        <finalName>${project.artifactId}-${project.parent.version}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.2</version>
                <configuration>
                    <dockerHost>${docker-url}</dockerHost>
                    <imageName>${registry-url}/${project.artifactId}:${project.version}</imageName>
                    <!--nexus3 hosted 仓库地址-->
                    <registryUrl>${registry-url}</registryUrl>
                    <!-- 在生成图像后将其推入的标志。默认为false -->
                    <pushImage>true</pushImage>
                    <imageTags>
                        <!-- 指定镜像标签,可以排至多个标签 -->
                        <imageTag>${project.version}</imageTag>
                    </imageTags>
                    <!--是否强制覆盖已有镜像-->
                    <forceTags>true</forceTags>
                    <!--方式一:1、指定Dockerfile文件所在目录,通过文件执行打包上传nexus私服-->
                    <dockerDirectory>src/main/resources</dockerDirectory>
                    <!-- 指定docker镜像打包参数,即dockerfile中使用的参数,通过${参数名}取值 -->
                    <buildArgs>
                        <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <!--指定需要复制的根目录,${project.build.directory}表示target目录-->
                            <directory>${project.build.directory}</directory>
                            <!--用于指定需要复制的文件,${project.build.finalName}.jar表示打包后的jar包文件-->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                    <!--登录nexus私库的用户,具体可看第三步maven settings文件的配置-->
                    <serverId>docker-local</serverId>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

  3.修改maven settings.xml文件的配置

  添加service和pluginGroups

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
		  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">

	<!-- 本地仓库地址 -->
	<localRepository>D:\project\maven\repository</localRepository>
	
    <!--当插件的组织Id(groupId)没有显式提供时,供搜寻插件组织Id(groupId)的列表。该元素包含一个pluginGroup元素列表,每个子元素包含了一个组织Id(groupId)。当我们使用某个插件,并且没有在命令行为其提供组织Id(groupId)的时候,Maven就会使用该列表。默认情况下该列表包含了org.apache.maven.plugins和org.codehaus.mojo -->
	<pluginGroups>
		<pluginGroup>com.spotify</pluginGroup>
	</pluginGroups>

	<proxies>
	</proxies>
	<servers>
		<server>
		
    		<!--这是server的id(注意不是用户登陆的id),该id与distributionManagement中repository元素的id相匹配。-->
			<id>docker-local</id>
			 <!--鉴权用户名。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。 -->
			<username>用户名</username>
			<!--鉴权密码 。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。密码加密功能已被添加到2.1.0 +。详情请访问密码加密页面-->
		    <password>密码</password>
	    </server>
	</servers>
	<mirrors>
		<!--阿里云镜像 -->
		<!--     <mirror>
            <id>alimaven</id>
            <mirrorOf>central</mirrorOf>
              <name>aliyun maven</name>
              <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          </mirror> -->
	</mirrors>
	<profiles>
		<!--版本设置 -->
		<profile>
			<id>jdk-11</id>
			<activation>
				<activeByDefault>true</activeByDefault>
				<jdk>11</jdk>
			</activation>
			<properties>
				<maven.compiler.source>11</maven.compiler.source>
				<maven.compiler.target>11</maven.compiler.target>
				<maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>
			</properties>
		</profile>
	</profiles>
</settings>

  4.运行命令

#不指定环境参数 默认是test
mvn clean package docker:build
#用-P指定环境参数
mvn clean package docker:build -Pprod

  在指定地址和的服务器上查看镜像是否存在

docker images

  在nexus的仓库中查看是否已经存在相应的镜像
jenkins打包构建springboot项目为docker镜像并上传nexus私服_第6张图片
ensp;在服务器上写容器启动命令

docker run -d --name 容器名 -p 端口号:端口号 --network=host  -e SPRING_CLOUD_NACOS_CONFIG_NAMESPACE='xxx' -e SPRING_PROFILES_ACTIVE='xxx' -v /home/admin/logs:/logs --restart=always nexus服务器ip:端口号/镜像名称:镜像版本号

容器启动命令常用参数
    ● --name:为容器指定一个名称
    ● -d:后台运行容器并返回容器ID,也即启动守护式容器
    ● -i:以交互模式(interactive)运行容器,通常与-t同时使用
    ● -t:为容器重新分配一个伪输入终端(tty),通常与-i同时使用。也即启动交互式容器(前台有伪终端,等待交互)
    ● -e:为容器添加环境变量
    ● -P:随机端口映射。将容器内暴露的所有端口映射到宿主机随机端口
    ● -p:指定端口映射
    ● --network:指定docker容器的网络
    ● --restart=always:docker服务启动时容器自启动
  容器启动后查看正在运行的容器

docker ps 

常用参数:
 ● -a:列出当前所有正在运行的容器+历史上运行过的容器
 ● -l:显示最近创建的容器
 ● -n:显示最近n个创建的容器
 ● -q:静默模式,只显示容器编号

三. jenkins配置

  1.新建maven项目

jenkins打包构建springboot项目为docker镜像并上传nexus私服_第7张图片

  2.添加参数构建项目

jenkins打包构建springboot项目为docker镜像并上传nexus私服_第8张图片

  3.配置git,从git仓库拉取选定分支的代码

jenkins打包构建springboot项目为docker镜像并上传nexus私服_第9张图片

  4.配置maven

jenkins打包构建springboot项目为docker镜像并上传nexus私服_第10张图片

  5.配置maven打包docker镜像的命令

jenkins打包构建springboot项目为docker镜像并上传nexus私服_第11张图片

  5.构建后在指定的服务器上运行shell脚本

jenkins打包构建springboot项目为docker镜像并上传nexus私服_第12张图片
 shell命令内容

#!/bin/bash
echo admin | sudo -S docker stop 容器名字
# 删除旧的容器
echo admin | sudo -S docker rm -f 容器名字
# 删除旧版镜像
echo admin | sudo -S docker rmi nexus私库ip:端口号/镜像名称:${old_version}
#删除所有悬空镜像
echo admin | sudo -S docker rmi $(echo admin | sudo -S docker images -f "dangling=true" -q)
# 启动镜像
echo admin | sudo -S docker run -d --name 容器名字 -p 6600:6600 --network=host -v /home/admin/logs:/logs --restart=always nexus私库ip:端口号/镜像名称:${new_version}

  保存配置

  6.构建任务

jenkins打包构建springboot项目为docker镜像并上传nexus私服_第13张图片

  6.构建任务

jenkins打包构建springboot项目为docker镜像并上传nexus私服_第14张图片
构建成功后,可在服务器上查看镜像和容器的情况

你可能感兴趣的:(linux,docker,jenkins,spring,boot)