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

news2024/11/29 14:53:16

前提: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”
在这里插入图片描述

2.添加http访问

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

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

在这里插入图片描述
  开放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即登录成功
在这里插入图片描述

  上传镜像

    可以尝试将自己服务器上的镜像上传的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网页查看上传镜像:
在这里插入图片描述

  仓库类型说明:

    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下)
在这里插入图片描述
    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的仓库中查看是否已经存在相应的镜像
在这里插入图片描述
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项目

在这里插入图片描述

  2.添加参数构建项目

在这里插入图片描述

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

在这里插入图片描述

  4.配置maven

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
 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.构建任务

在这里插入图片描述

  6.构建任务

在这里插入图片描述
构建成功后,可在服务器上查看镜像和容器的情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/273641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)

JVM&#xff08;Java虚拟机&#xff09; JVM 内存模型 结构图 jdk1.8 结构图&#xff08;极简&#xff09; jdk1.8 结构图&#xff08;简单&#xff09; JVM&#xff08;Java虚拟机&#xff09;&#xff1a; 是一个抽象的计算模型。如同一台真实的机器&#xff0c;它有自己…

使用比console.log更优质的前端调试方案

程序调试是程序开发必不可少的一环&#xff0c;刚开始接触前端调试时&#xff0c;最常用的就是 console.log 打印变量进行调试&#xff0c;本文会分享一些笔者学习到的前端调试方法&#xff0c;减少对 console.log 调试方式的依赖&#xff0c;选择更优质的前端调试方案。 本文中…

Android开发进阶——RxJava核心架构分析

简介 RxJava是对响应式扩展&#xff08; Reactive Extensions&#xff0c;称之为 ReactiveX &#xff09;规范的Java 实现&#xff0c;该规范还有其他语言实现&#xff1a;RxJS、Rx.Net、RxScala、RxSwift等等&#xff08;也即&#xff0c;ReactiveX 定义了规范&#xff0c;其他…

pip安装时报错 ascii‘ codec can‘t decode byte 0xe2 in position...

在使用pip安装包的时候报错ascii’ codec can’t decode byte 0xe2 in position… 报错信息 UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe2 in position 1429: ordinal not in range(128) 以前好像见过类似的情况&#xff0c;所以搜了一下怎么修改python默认…

聊聊ChatGPT

最近ChatGPT火出圈。 在过去三个月里&#xff0c;眼见着它的热度火箭一般蹿升&#xff0c;据瑞银上周三发布的报告显示&#xff0c;GPT已经超过了Tiktok&#xff0c;成为人类有史以来最快突破1亿月活跃用户的互联网产品。Tiktok当初用了9个月&#xff0c;而GPT只用了2个月。 …

Spring使用了哪些设计模式?

目录Spring中涉及的设计模式总结1.简单工厂(非23种设计模式中的一种)2.工厂方法3.单例模式4.适配器模式5.装饰器模式6.代理模式7.观察者模式8.策略模式9.模版方法模式Spring中涉及的设计模式总结 1.简单工厂(非23种设计模式中的一种) 实现方式&#xff1a; BeanFactory。Spri…

go-grpc的使用和学习

文章目录基础知识&#xff1a;操作流程安装proto文件配置grpc&#xff1a; 正常客户端发送数据(以字节流的方式)&#xff0c;服务器接受并解析&#xff0c;根据约定知道要执行什么&#xff0c;然后把结果返回给客户 rpc将上述过程封装&#xff0c;使其操作更加优化&#xff0c;…

Vue 3 中的极致防抖/节流(含常见方式防抖/节流)

各位朋友你们好呀。今天是立春&#xff0c;明天就是正月十五元宵节了&#xff0c;这种立春 元宵相隔的时候&#xff0c;可是很难遇到的&#xff0c;百年中就只有几次。在这提前祝大家元宵快乐。 今天给大家带来的是Vue 3 中的极致防抖/节流&#xff08;含常见方式防抖/节流&a…

ChatGPT给程序员人手一个,这很朋克

目录ChatGPT、程序员、朋克为什么程序员需要ChatGPT&#xff0c;为什么这很朋克总结ChatGPT、程序员、朋克 本文由ChatGPT编写。 ChatGPT是由OpenAI开发的大型语言模型。它的核心功能是生成人类语言文本&#xff0c;因此有多种应用场景&#xff0c;如文本生成、对话生成、文本…

「VUE架构」Vue2与Vue3的区别

文章目录前言一、性能比Vue2快1.2~2倍1.1 diff算法优化1.2 事件侦听缓存1.3 减少创建组件实例的开销二、 按需编译&#xff0c;体积比Vue2更小三、 Compostion API四、 支持TS五、 自定义渲染API六、更先进的组件七、 更快的开发体验前言 VUE是一套用于构建用户界面的渐进式框…

Nginx常用功能举例解析

Nginx提供的基本功能服务从大体上归纳为"基本HTTP服务"、“高级HTTP服务”和"邮件服务"等三大类。基本HTTP服务Nginx可以提供基本HTTP服务&#xff0c;可以作为HTTP代理服务器和反向代理服务器&#xff0c;支持通过缓存加速访问&#xff0c;可以完成简单的…

【FPGA】Verilog:组合逻辑电路应用 | 数码管 | 8421BCD编码 | 转换七段数码管段码

前言&#xff1a;本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例&#xff1a;数码管的使用 功能特性&#xff1a; 采用 Xilinx Artix-7 XC7A35T芯片 配置方式&#xff1a;USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度 存储器&#xff1a;2M…

Vue-VueRouter

前言 Vue Router 是 Vue.js (opens new window)官方的路由管理器。它和 Vue.js 的核心深度集成&#xff0c;让构建单页面应用变得易如反掌。包含的功能有&#xff1a; 嵌套的路由/视图表模块化的、基于组件的路由配置路由参数、查询、通配符基于 Vue.js 过渡系统的视图过渡效果…

SPSS聚类分析(含k-均值聚类,系统聚类和二阶聚类)

本篇博客主要是根据1、聚类的基本知识点_哔哩哔哩_bilibili系列视频进行的学习记录一、SPSS聚类分析的基本知识点1、什么是聚类分析?聚类分析(Cluster analysis)又叫做群集分析,通过一些属性将对象或变量分成不同的组别&#xff0c;在同一类下的对象或变量在这些属性上具有一些…

最全面的SpringBoot教程(四)——数据库连接

前言 本文为 最全面的SpringBoot教程&#xff08;四&#xff09;——数据库连接 相关知识&#xff0c;下边将对JDBC连接配置&#xff0c;与使用Druid数据源&#xff0c;从添加依赖到修改配置项再到测试进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &…

C语言深度解剖-关键字(5)

目录 if else 组合 if else 的基本用法 注释 深入理解bool float(double)与浮点数的比较 写在最后&#xff1a; if else 组合 if else 的基本用法 #include <stdio.h>int main() {int flag 1;if (flag 1){printf("flag %d\n", flag);}else if (flag…

crmeb pro多门店版二次开发

重启一下swool 新创建的数据库表 ALTER TABLE eb_store_cart ADD price DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT 单独改价 AFTER status;ALTER TABLE eb_store_order ADD car_no VARCHAR(255) NOT NULL DEFAULT COMMENT 车牌号 AFTER erp_order_id, ADD frame_no VARCHA…

2023软考系统集成项目管理工程师易混淆知识点~(7)

将2023上半年软考《系统集成项目管理工程师》易混淆知识点&#xff0c;分享给大家&#xff0c;快来跟着一起打卡学习吧&#xff01;概念辨析 1:项目、运营概念:(1)项目:项目是为达到特定目的&#xff0c;使用一定资源&#xff0c;在确定的期间内&#xff0c;为特定发起人而提供…

Linux perf的使用(一)

文章目录前言一、perf简介二、perf子命令简介三、perf工作模式3.1 计数3.2 采样参考资料前言 系统级性能优化通常包括两个阶段&#xff1a;性能剖析&#xff08;performance profiling&#xff09;和代码优化。 &#xff08;1&#xff09;性能剖析的目标是寻找性能瓶颈&#x…

python(13)--字典(Dict)

一、字典的基本操作 1.定义字典 字典也是一个列表型的数据结构&#xff0c;字典的数据是用“{ }”装的&#xff08;列表&#xff1a;[ ]&#xff0c;元组&#xff1a;( )&#xff09;&#xff0c;字典的元素是一一对应的关系“key-value”。 格式&#xff1a; Dictname{ key1…