【DevOps实战系列】第八章:详解Jenkins集成Docker私服Nexus3

news2025/1/15 23:31:52

个人亲自录制全套DevOps系列实战教程手把手教你玩转DevOps全栈技术

在这里插入图片描述

Jenkins集成Docker镜像仓库

docker私服已经搭建完毕,下边我们期望jenkins做的事是:

  • ①通过git拉取代码
  • ②通过maven构建生成jar包
  • ③构建含有jar包的镜像
  • ④推送到docker仓库
  • ⑤通知宿主从仓库拉取镜像并启动容器

有什么好处?避免将jar包拷贝到宿主机,而是直接将jar包打入镜像上传到私服。

为什么不是jenkins直接拉取并启动容器?从角色上看jenkins并不是docker服务,生产中多数是部署docker集群,所以拉取镜像并部署容器更应该由docker自身操作。

非要用jenkins拉取和部署可以吗?当然可以,但jenkins容器中一直只映射单个docker宿主机的docker.sock,如果是docker集群就不好解决了,比较麻烦。

Jenkins容器编排文件修改

注意:之前我们讲的都是jenkins构建完jar包后,传输到宿主机,由宿主机通过docker命令完成构建和启动容器,

此处我们期望jenkins能完成这些事,有几种方法:

  • 在jenkins中安装docker服务或安装docker cli并连接到宿主
  • 直接将宿主机的docker内核映射给jenkins容器,让jenkins能操作宿主机的docker【推荐】
# 很简单只需要将jenkins的docker-compose.yml修改一下即可
version: '3'
services:
  jenkins:
    build: 
      context: .
      dockerfile: Dockerfile
    image: 'lij/jenkins:2.346.3-2-lts-centos7'
    restart: always
    container_name: 'jenkins'
    hostname: 'jenkins'
    environment:
      - JAVA_OPTS="-Dhudson.model.DownloadService.noSignatureCheck=true"
    ports:
      - '9078:8080'
      - '50000:50000'
    networks:
      - 'exist-net-bloom'
    volumes:
      - '/docker/jenkins/home:/var/jenkins_home'
      - '/docker/jenkins/mvnrepo:/mvnrepo'   
      - '/etc/timezone:/etc/timezone:ro'
      - '/etc/localtime:/etc/localtime:ro'
      # 新增加内容
      - '/var/run/docker.sock:/var/run/docker.sock'
      - '/usr/bin/docker:/usr/bin/docker'
      - '/etc/docker/daemon.json:/etc/docker/daemon.json'
networks:
  exist-net-bloom:
    external:
      name: devops

解释:/var/run/docker.sock 是docker服务器后台进程执行docker客户端命令的服务,

不论是docker cli还是对外开放的api最终都是与/var/run/docker.sock进行交互,所以把他映射到jenkins内部,jenkins就可以内部操作宿主机了。

另外还需映射docker命令(即客户端命令)和已经配置好的配置文件。

问题:更新配置后执行docker info报权限问题
在这里插入图片描述
分析:这应该是执行docker.sock的权限问题,我们进入宿主机查看docker.sock的权限
在这里插入图片描述

解决:这里有几种方式

  • 以root用户登录jenkins,我实际我们用的是jenkins用户,这样容器导致用户权限过大,不推荐
# 修改方法只需在docker-compose.yml中增加以root登录即可
user: root
  • 将宿主机的docker.sock文件的权限改为可以让jenkins的账号ID=1000的用户使用即可【推荐】
  • 这里我们粗暴些,直接777权限
# 第一种:授权777权限
chmod 777 /var/run/docker.sock

# 第二种:授权other组可读写
chmod o+rw /var/run/docker.sock

修改jenkins的job配置

当maven构建后,直接在jenkins工作目录构建镜像并推送镜像到私服

[此处我们以Nexus作为私服演示,对于大型项目harbor优势较大,成本相对也较高,比如内置数据库PostgreSQL,

而我们一般会使用公共数据库,所以至少要有一个PostgreSQL实例,等等,而Nexus就就相对简单些,也能和Maven仓库复用,成本较低]

注意:jenkins中运行shell脚本的目录是jenkins_home/workspace/jobName目录

# 注意:因为我们要构建镜像而不需要直接启动容器,所以只需要Dockerfile文件,而暂时不需要使用docker-compose.yml
# 1.构建镜像的命令,我们使用docker build,通过-t指定镜像标签,最后指定Dockerfile的目录,我们使用当前目录即可
docker build -t 10.10.1.199:9082/busybox:v-${branch} .

# 注意:jenkins中运行shell脚本当前目录是[workspace/jobName]目录
set -e \
&& mv target/*.jar docker/ \  # 拷贝jar包到docker目录
&& cd docker \
&& docker build -t demo:v-$branch . \  # 构建镜像,使用分支名作为版本号
&& docker tag demo:v-$branch 10.10.1.199:9082/demo:v-$branch \  #给镜像打标签,准备推送私服
&& docker login -u admin -p jie123456 10.10.1.199:9082 \ #登录私服hosted仓库
&& docker push 10.10.1.199:9082/demo:v-$branch \#推送镜像
#避免构建同一个镜像产生悬空镜像,假设已经执行了当前jenkins job,那么再次执行时,本地一定是拉取了镜像,所以直接构建会产生悬空镜像
&& docker image prune -f 

在这里插入图片描述
问题:点击构建会报错,如下:
在这里插入图片描述
原因:就是镜像名称定义的不规范,因为我们使用的git分支名,而分支默认都是orgin/开头,而放到镜像中斜杠就不合适了,所以我们在git参数构建时,将[orgin/]过滤掉,配置如下:使用正则orgin/(.*)即可
在这里插入图片描述
再次构建,就没问题了。

宿主机拉取镜像并部署容器

解决目标:既然是jenkins通知宿主机,那么就可能是多个jenkins的job都有这种通知操作,

所以我们不能写死拉取镜像的信息,而是通过jenkins的通知将这些参数传递过来,比如拉取镜像的地址、镜像标识等,并且要处理镜像重复等问题。

思路:怎么让jenkins给宿主传参数呢?说的比较抽象,其实我们之前已经做过了,就是ssh。

jenkins的job做完构建镜像并推送后,就可以执行ssh连接宿主,然后执行脚本,而jenkins的job中可以设置变量,在执行宿主机脚本是可以直接引用过来,而这次脚本比较多,我们就不再jenkins中罗列了,而是直接写入到shell脚本,让jenkins直接调用。

脚本内容:在宿主机目录创建shell脚本, vi /share/jenkins/demo/script/publish.sh

注意:脚本权限问题,我是root创建,并且jenkins中ssh也是使用的root所以没问题,大家根据自己情况去酌情处理。

# 定义变量
repositoryUrl=$1
jobName=$2
imageVersion=$3
remoteImageName=$repositoryUrl/$jobName:$imageVersion #远程私服仓库的完整镜像名称
echo "remoteImageName is "$remoteImageName

### 检查是否存在同名镜像运行的容器,如果存在则需要先删除,然后再删除镜像,然后再拉取新镜像,最后以新镜像启动容器

#获取已启动的容器ID
containerId=$(docker ps -a | grep -w "$remoteImageName" | awk '{print $1}')
if [ "$containerId" ! = "" ]; then
docker stop $containerId && docker rm $containerId
fi

#如果镜像存在同样先删除
imageId=$(docker images | grep -w "$repositoryUrl/$jobName" | grep -w "$imageVersion" | awk '{print $3}')
if [ "$imageId" ! = "" ]; then
docker rmi -f $imageId
fi

#从私服拉取镜像:如果不允许匿名,则需要先登录,因为我已经设置允许匿名,所以可以不登录直接拉取
docker login -u admin -p 123456 $repositoryUrl
docker pull $remoteImageName

#启动容器:我们之前启动都是拿docker-compose.yml,但此时因为在宿主机,并没有这么一个docker-compose.yml文件,
#所以我们可以直接使用docker run运行容器
docker run -d \
-p 9099:8080 \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
--network devops \
--privileged=true \
--name $jobName $remoteImageName

解释:其实我们jenkins容器已经拿到宿主机的docker执行权了,那这个文件不传到宿主机执行,在本地容器执行也是可以的,但由于角色不同,该脚本由docker服务器执行更合适,并且如果是docker集群那么容器执行会很麻烦。

优化:简单起见,或者说为了隔离、可扩展,我们把这个脚本文件放到springboot中,让jenkins帮我们远程拷贝到宿主机的固定目录,然后执行

在这里插入图片描述
参数配置: 我们脚本里引用了那么几个参数,哪里来的?

jenkins我们知道可以参数化构建,比如我们用的git参数,当然他也可以指定普通参数,如下,我们在job中增加这些参数:

[当然也可以直接写到脚本执行的后边,我这里就只配一个示意一下,其他参数直接传递]
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

五问补盲(三) | 补盲激光雷达,敢不敢直面新的安全威胁?

作者 | 爱LiDAR的小飞哥 编辑 | 王博在激光雷达上车的热潮中,各家都在技术参数上进行着“你死我活”的拼杀。 那么,参数代表一切吗?举个例子,测距200米的激光雷达一定比测距150米的更好吗? 可以肯定地说,非…

JVM 之 AdaptiveSizePolicy 参数

AdaptiveSizePolicy 简介 AdaptiveSizePolicy(自适应大小策略) : JDK 1.8 默认使用 UseParallelGC 垃圾回收器,该垃圾回收器默认启动了 AdaptiveSizePolicy,会根据GC的情况自动计算计算 Eden、From 和 To 区的大小。 配置: 开启…

vue生命周期

vue的生命周期就是vue实例从创建到销毁的全过程,就是从开始创建、初始化数据、编译模版、挂载Dom、更新渲染、卸载等⼀系列过程,在这个过程中存在生命周期的钩子函数,我们可以在对应阶段添加实现自己的代码。 钩子函数(共8个&…

智慧物流|Springboot+Vue+Nodejs实现智慧物流系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

Java如何读取输入

文章目录0.写在前面1.介绍2.举例3.写在最后0.写在前面 Java语言可以接收从键盘的输入,一般用来在调试的时候会用到,实际开发一般不用。 所以在此记录比较简单。 1.介绍 读取流程: 1.导入需要的工具包 2.构造一个“标准输入流”System.in关…

软件测试基础理论体系学习10-什么是本地化测试?本地化测试有哪些问题?本地化测试的重点是什么?

10-什么是本地化测试?本地化测试有哪些问题?本地化测试的重点是什么?1 本地化测试概述1.1软件本地化概念1.2 软件本地化工程1.3 软件本地化的重要性2 本地化测试翻译问题2.1 软件本地化不等于软件翻译2.2 软件本地化语言翻译技术2.2.1 翻译记…

K8s Service 负载均衡底层分析

当我们创建完 Pod 后,Pod 的 IP 与 Service IP 会自动分配,而 Pod IP 仅 K8s 集群内部访问,那 K8s 集群外部客户端又是如何访问 Pod 呢?看了官方相关文档,查询到是通过 Host 的 iptables(即 K8s 集群节点的…

服务器多用户共享Anaconda

实验室最近买了台服务器,这篇Blog用来记载一下给ubuntu 20.04的服务器安装一个共享的anaconda的步骤。 安装Anaconda 首先去anaconda的官网下载linux的安装包,推送到服务上。然后进行安装: sudo bash ./Anaconda3-2022.10-Linux-x86_64.sh…

99.(leaflet之家)leaflet军事标绘-分队战斗行动修改

地图之家总目录(订阅之前请先查看该博客) 地图之家:cesium+leaflet+echart+地图数据+地图工具等相关内容的介绍 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> …

Linux从入门到进阶学习(Ⅰ):Linux系统安装与配置

目录 1 Linux概述 2 虚拟机安装 3 安装Centos系统 ​4 远程连接Linux系统 5 WSL环境 6 虚拟机快照 1 Linux概述 内核是操作系统的核心&#xff0c;Linux内核是免费开源的&#xff0c;由此产生了许多Linux发行版&#xff0c;包括&#xff1a;Ubuntu、CentOs等 2 虚拟机安…

零钱通项目(面向过程)

目录 项目需求 项目界面 思路 写代码 第一步 第二步 第三步 IDEA运行问题 日期问题 代码运行问题 第四步 第五步 第一种 第二种 第六步 第七步 完整代码 运行效果 项目需求 使用Java 开发 零钱通项目&#xff0c;可以完成收益入账&#xff0c;消费&#xff0…

SSH连接到GitHub的方法

前言 习惯了使用公司内的GitLab&#xff0c;已经有一段时间没有使用GitHub来维护自己的项目&#xff0c;近期需要新建个人项目在阿里云服务器上使用&#xff0c;竟然一时忘记了怎么用SSH连接GitHub。 因此本文记录一下SSH连接GitHub的方法&#xff0c;也方便后面自己参考。 整…

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.4 查询Tomcat【环境准备】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存48 多级缓存48.4 查询Tomcat【环境准备】48.4.1 多级缓存需求48 多级缓存 48.4 查询Tomcat【环境准备…

springMVC+mysql实现的Java web医院分诊挂号管理系统源码附带论文及视频指导运行教程

今天给大家演示的是一款由springMVCmysql实现的Java web医院分诊挂号管理系统&#xff0c;主要实现了患者管理、科室管理、挂号管理等业务功能&#xff0c;此外系统还有角色权限管理&#xff0c;用户管理、菜单管理、定时任务管理等功能&#xff0c;这些功能对于想要二次开发的…

数据结构---各类排序算法详解

Lesson6–排序 文章目录Lesson6--排序一、.排序的概念及其应用1.1排序的概念1.2常见的排序算法二、.常见排序算法的实现2.1插入排序2.1.1插入排序的基本思想&#xff1a;2.1.2直接插入排序&#xff1a;2.1.3 直接插入排序代码实现2.1.4希尔排序&#xff08;缩小增量排序&#x…

入门学习SpringSecurity,这一篇就够了

入门学习SpringSecurity&#xff0c;这一篇就够了1.SpringSecurity环境搭建2.认识SpringSecurity3.配置SpringSecurity4.注销5.权限控制展示内容6.记住我实现7.定制登录页在 Web 开发中&#xff0c;安全一直是非常重要的一个方面。安全虽然属于应用的非功能性需求&#xff0c;但…

处理.Dwg文件用哪种技术方案?ObjectARX,RealDWG还是Teigha(ODA)?

如果你计划开发一款程序处理.dwg文件中的数据。那么你有三种技术方案实现----AutoCAD(ObjectARX/http://Acad.NET)、 RealDWG或Teigha. 试图编写自己的dwg解析引擎是不可行的&#xff0c;dwg的加密格式使任务极其艰巨。再考虑到引擎后续版本的维护以及兼容性、稳定性&#xff…

NPC/ANPC三电平调制方法和中点平衡算法

一调制算法和中点平衡方法概要 1.调制算法 【1】三电平空间矢量调制算法 &#xff08;1&#xff09;常规90度xy坐标系 &#xff08;2&#xff09;改进60度gh坐标系 【2】载波调制算法 &#xff08;1&#xff09;载波同相 &#xff08;2&#xff09;载波反相 2.中点平衡…

PLC点云滤波

在获取点云数据时&#xff0c;由于设备精度、操作者经验、环境因素等带来的影响&#xff0c;以及电磁波衍射特性、被测物体表面性质变化和数据拼接配准操作过程的影响&#xff0c;点云数据中将不可避免地出现一些噪声点。实际应用中除了这些测量随机误差产生的噪声点之外&#…

Batch Norm 与 Layer Norm

这里写自定义目录标题1 为何要对输入数据做 Normalization2 Batch Normalization3 Layer Normalization4 实际应用参考1 为何要对输入数据做 Normalization 可以比较好的抑制梯度消失和梯度爆炸的情况 归一化技术就是让每一层的分布稳定下来&#xff0c;让后面的层能在前面层…