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

news/2024/5/4 13:37:58/文章来源:https://blog.csdn.net/lijie1051/article/details/128345065

个人亲自录制全套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: Dockerfileimage: 'lij/jenkins:2.346.3-2-lts-centos7'restart: alwayscontainer_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.luyixian.cn/news_show_236473.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Halcon图像拼接

图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要。 如按下图是将两张楼房图片拼接成一个图像。…

微服务框架 SpringCloud微服务架构 多级缓存 46 JVM 进程缓存 46.1 导入商品案例【MySQL环境准备】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存46 JVM 进程缓存46.1 导入商品案例【MySQL环境准备】46.1.1 导入商品管理案例46 JVM 进程缓存 用于在T…

Jmeter(十七):利用jmeter插件收集性能测试结果汇总报告和聚合报告,利用PerfMon插件收集监控服务器资源指标

利用jmeter插件收集性能测试结果 汇总报告(Summary Report ) 用来收集性能测试过程中的请求以及事务各项指标。通过监听器--汇总报告 可以添加该元件。界面如下图所示 汇总报告界面介绍: 所有数据写入一个文件:保存测试结果到本地…

STM32F4 | 定时器中断实验

文章目录一、STM32F429 通用定时器简介二、硬件设计三、软件设计四、实验现象五、STM32CubeMX 配置定时器更新中断功能这一章介绍如何使用 STM32F429 的通用定时器, STM32F429 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 …

零钱通项目(面向过程)

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

3.1 卷积神经网络基础

文章目录计算机视觉的发展历程卷积神经网络卷积(Convolution)卷积计算填充(padding)步幅(stride)感受野(Receptive Field)多输入通道、多输出通道和批量操作飞桨卷积API介绍卷积算子…

计算机毕设Python+Vue校园跳蚤平台(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

安卓某通讯协议环境算法浅谈

所有的tlv组包都在 oicq.wlogin_sdk.tlv_type加密算法可以hook oicq.wlogin_sdk.tools Tlv144 是由5个tlv组成 然后用TGTkey进行 TEA加密 tlv_109 AndroidIDtlv_52d 系统内核信息tlv_124 平台网络信息tlv_128 手机设备信息tlv_16e 手机品牌TLV544 是设备id&#xff0…

Kaggle竞赛——Titanic泰坦尼克之灾(0.76315==>0.79186)

Kaggle竞赛网址:https://www.kaggle.com/c/titanic 上一章:Kaggle竞赛——Titanic泰坦尼克之灾(保姆级基础版) 本次Kaggle泰坦尼克之灾分析过程大致分为: 第1步:了解数据(上一章) …

共同转债,新化转债上市价格预测

共同转债基本信息转债名称:共同转债,评级:A,发行规模:3.8亿元。正股名称:共同药业,今日收盘价:32.66,转股价格:27.14。当前转股价值 转债面值 / 转股价格 * …

浏览器兼容模式如何设置?只需要跟着下面的步骤设置

许多考生在报考教师资格证或者其他的考试报名,会遇到浏览器兼容设置的问题。与其到时急急忙忙来设置浏览器的兼容模式,不如提前设置好,免了后顾之忧。浏览器兼容模式怎么设置?一起来看看关于浏览器兼容模式的含义以及设置方式吧&a…

深圳大学数学文化赏析MOOC第一次作业答案(满分)

一、单选题 (共 40.00 分) 1. 关于归纳推理,以下说法错误的是 A. 归纳推理是从特殊到一般的推理。 B. 归纳推理属于发散性思维。 C. 归纳推理的结论一定是正确的。 D. 归纳推理具有创新性。 满分:2.00 分 得分:2.00 分 你的答案&a…

Centos7迁移Anolis OS7系统

2020年12月08日CentOS官方宣布CentOS项目将停止,并推出CentOS Stream项目,详见公告 CentOS未来将会从 RedHat Enterprise Linux(RHEL) 复刻版本的 CentOS Linux 转向 CentOS Stream。 对处于生命周期中的 CentOS 版本后续影响: • CentOS Lin…

客户管理系统如何提升体验

数字化时代,客户与企业交互的触点爆炸式增长,客户体验正从单一触点走向端到端旅程。众多的产品、海量的数据,导致客户对体验的要求越来越多......CRM客户管理系统是企业提升客户体验的有效工具,它不仅可以帮助您进一步了解客户&am…

Opencv(C++)笔记--形态学操作之开、闭操作、基本梯度计算、顶帽和黑帽操作

目录 1--开操作 2--闭操作 3--基本梯度计算 4--顶帽操作 5--黑帽操作 6--代码实例 1--开操作 ① 原理:先进行腐蚀操作,再进行膨胀操作; ② 作用:消除值高于邻近点的孤立点,达到去除图像中噪声的作用&#xff0…

【愚公系列】2022年12月 使用NSSM工具部署ELK三件套为Windows服务

文章目录前言一、使用NSSM工具部署ELK三件套为Windows服务1.安装ElasticSearch服务2.安装Kibana服务3.安装Logstash服务4.验证ELK服务前言 nssm是一个服务封装程序,它可以将普通exe程序封装成服务,实现开机自启动,同类型的工具还有微软自己的…

二进制转化成十进制进行输出

给定两个十进制整数 : AAA,BBB 你需要把它们的二进制形式以十进制的运算法则相加输出结果。 例如: A3,B2A 3 , B 2A3,B2 的时候,AAA 的二进制表示是 : 111111 , BBB 的二进制表示是 101010 ,你需要输出答案为 : 212121 输入描述: 一行两…

左旋咪唑大单层/青蒿素长循环/酒石酸长春瑞滨热敏/棕榈酰五肽-4柔性/Anti-HER2免疫脂质体的研究

小编今天为大家分享了左旋咪唑大单层/青蒿素长循环/酒石酸长春瑞滨热敏/棕榈酰五肽-4柔性/Anti-HER2免疫脂质体的制备研究。 青蒿素长循环脂质体的制备: 青蒿素(artemisinin,ART)由于溶解度差,稳定性低,限制了其应用.因此,本研究采用长循环脂质体包裹青蒿素,增强其…

JVM 之 AdaptiveSizePolicy 参数

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

Go语言GOPATH是什么

一、GOPATH的概念 GOPATH 是 Go 语言中使用的一个环境变量,它使用绝对路径提供项目的工作目录(也称为工作区), 是存放 Golang 项目代码的文件路径, GOPATH 适合处理大量 Go语言源码、多个包组合而成的复杂工程。 工作目录是一个工程开发的相对…