目录

  • 说明
  • 八、集成Harbor
    • 8.1 Harbor介绍
    • 8.2 Harbor安装——原生方式部署
    • 8.3 Harbor使用方式
      • 8.3.1 添加用户构建项目
      • 8.3.2 发布镜像到Harbor
      • 8.3.3 指定目标服务器从Harbor拉取镜像
      • 8.3.4 Jenkins容器使用宿主机Docker
      • 8.3.5 Jenkins构建自定义镜像推送到harbor仓库
      • 8.3.6 目标服务器上编写部署脚本
      • 8.3.7 配置构建后操作

说明

在Jenkins服务器上部署Harbor仓库,如果电脑内存允许,可以新加一台服务器部署Harbor。

八、集成Harbor

8.1 Harbor介绍

前面在部署项目时,我们主要采用Jenkins推送jar包到指定服务器,再通过脚本命令让目标服务器对当前jar进行部署,这种方式在项目较多时,每个目标服务器都需要将jar包制作成自定义镜像再通过docker进行启动,重复操作比较多,会降低项目部署时间。

我们可以通过Harbor作为私有的Docker镜像仓库。让Jenkins统一将项目打包并制作成Docker镜像发布到Harbor仓库中,只需要通知目标服务器,让目标服务器统一去Harbor仓库上拉取镜像并在本地部署即可。

Docker官方提供了Registry镜像仓库,但是Registry的功能相对简陋。Harbor是VMware公司提供的一款镜像仓库,提供了权限控制、分布式发布、强大的安全扫描与审查机制等功能。

8.2 Harbor安装——原生方式部署

这里采用原生的方式安装Harbor。

  1. 下载Harbor安装包:
    https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz

  2. 将安装包拖拽到Linux系统中并解压:
    tar -zxvf harbor-offline-installer-v2.3.4.tgz -C /usr/local/
    注:-C 选项的作用是:指定需要解压到的目录。

  3. 修改Harbor配置文件:

① 首先复制一份harbor.yml配置

# 进入目录
cd /usr/local/harbor
# 复制一份yml文件,并编辑yml文件
cp harbor.yml.tmpl harbor.yml
vim harbor.yml

② 编辑harbor.yml配置文件

  1. 启动Harbor
cd /usr/local/harbor
./install.sh

如果想要停止harbor容器实例,命令如下

docker-compose down harbor
使用docker ps 查看容器实例,就发现harbor容器已经关闭

查看日志:

  1. 登录Harbor
    密码可以在/usr/local/harbor/harbor.yml文件中看

首页信息:

8.3 Harbor使用方式

Harbor作为镜像仓库,主要的交互方式就是将镜像上传到Harbor上,以及从Harbor上下载指定镜像。
在传输镜像前,可以先使用Harbor提供的权限管理,将项目设置为私有项目,并对不同用户设置不同角色,从而更方便管理镜像。
这里我使用的是公开的仓库。

8.3.1 添加用户构建项目

  1. 构建项目(设置为私有的话,后面从harbor上拉取镜像需要登录)
    我这里直接使用公开仓库了(记得勾选公开)

私有仓库创建步骤:

创建用户:

给项目追加用户:

切换测试用户:

8.3.2 发布镜像到Harbor

  1. 修改镜像名称
    名称要求:harbor地址/项目名/镜像名:版本
# 改名命令
docker tag [镜像id] 镜像仓库地址/项目名/镜像名:版本

这里我把mytest:v1.0.0镜像改名为:192.168.2.211:80/repo/mytest:v1.0.0

  1. 修改daemon.json文件,支持从Docker仓库拉取镜像,并重启Docker
vim /etc/dokcer/daemon.json# 把自己的harbor仓库IP地址内容加进去,注意要在上一行结束的地方加逗号
"insecure-registries": ["192.168.2.211:80"]# 重启docker
systemctl restart docker

  1. 登录harbor仓库,推送镜像,到harbor仓库查看
docker login -u 用户名 -p 密码 Harbor地址# 这里登录我的仓库,并推送镜像
docker login -u admin -p Harbor12345 192.168.2.211:80
docker push 192.168.2.211:80/repo/mytest:v1.0.0


8.3.3 指定目标服务器从Harbor拉取镜像

跟传统方式一样,不过需要在目标服务器上先配置/etc/docker/daemon.json文件,再重启docker

{"registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com"],"insecure-registries": ["192.168.2.211:80"]
}# 重启docker
systemctl restart docker#如果镜像仓库是私有的,需要先登录,执行docker login命令。由于这里是公开的仓库,所以不用登录
docker login -u 用户名 -p 密码 harbor仓库地址

8.3.4 Jenkins容器使用宿主机Docker

构建镜像和发布镜像到harbor都需要使用到docker命令。而在Jenkins容器内部安装Docker成本比较高,官方推荐直接采用宿主机带的Docker。

首先要修改/var/run/docker.sock的所属组和权限,让其他人也拥有读写的权限;然后通过数据卷的方式,把相应的文件同步到Jenkins容器内部。从而达到在Jenkins内部可以使用docker命令的目的。

  1. 设置宿主机docker.sock权限:
# 修改docker.sock所属组为root
sudo chown root:root /var/run/docker.sock
# 增加其他用户的读写权限
sudo chmod o+rw /var/run/docker.sock

修改前

修改后

  1. 添加数据卷
    由于我安装Jenkins时使用的是docker run命令安装的,这里修改执行命令后再次执行
cd /usr/local/docker/jenkins_docker/#修改命令并运行
docker run -di --name jenkins \
-p 8080:8080 -p 50000:50000 -u root  \
-v ./data:/var/jenkins_home \
-v /usr/bin/docker:/usr/bin/docker \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/docker/daemon.json:/etc/docker/daemon.json \
--restart always \
jenkins/jenkins:2.361.2# 配置国内源安装插件
cd /usr/local/docker/jenkins_docker/data/updates
wget https://mirrors.aliyun.com/jenkins/updates/update-center.json
  • 如果使用docker-compose.yml文件跑起来的,这里可以修改docker-compose.yml文件后重新docker-compose up -d
    修改Jenkins容器的docker-compose.yml文件内容,追加数据卷(最后三行)
cd /usr/local/docker/jenkins_docker/
vim docker-compose.ymlversion: "3.1"
services:jenkins:image: jenkins/jenkinscontainer_name: jenkinsports:- 8080:8080- 50000:50000volumes:- ./data/:/var/jenkins_home/- /usr/bin/docker:/usr/bin/docker- /var/run/docker.sock:/var/run/docker.sock- /etc/docker/daemon.json:/etc/docker/daemon.json#重新启动
docker-compose up -d
  1. 进入Jenkins容器内部查看
docker exec -it jenkins bash
在容器内部执行docker命令测试

8.3.5 Jenkins构建自定义镜像推送到harbor仓库

目的:使用Jenkins制作自定义镜像并且推送到harbor仓库上,再让Jenkins通知目标服务去harbor仓库上拉取镜像。
制作自定义镜像只需要Dockerfile文件,不需要docker-compose.yml文件。
使用docker build 运行Dockerfile文件中的命令构建自定义镜像,然后推送到Harbor仓库,再让Jenkins通知目标服务去Harbor仓库上拉取镜像,运行。

  • Jenkins需要通知目标服务器的信息:
  1. 告知目标服务器拉取哪个镜像
  2. 判断当前服务器是否正在运行容器,如果正在运行需要删除
  3. 如果目标服务器已经存在当前镜像,需要删除
  4. 让目标服务器拉取harbor上的镜像
  5. 将拉取下来的镜像运行成容器

如果在Jenkins来执行这一系列判断条件,成本较高。所以在目标服务器上建一个脚本文件,让Jenkins通知目标服务器来执行这个脚本文件就可以了。

  1. 修改gitla上的java内容,标记一下v3.0.0

  2. gitlab上创建tag标签

  3. 修改mytest任务配置
    ① 删除构建后操作:

② 在构建操作中,检测完代码后再追加一个步骤“执行shell”


此处默认的路径是/usr/local/docker/jenkins_docker/data/workspace/mytest。我的Dockerfile文件就在/usr/local/docker/jenkins_docker/data/workspace/mytest下,所以第二行指定 . 就可以了,表示当前目录

③由于Jenkins使用的是宿主机的docker,所以构建成功后可以在宿主机上查看images,发现多了一个v3.0.0版本的mytest

④ 现在通过docker build和Dockerfile文件在Jenkins内已经构建好镜像了,我们将Jenkins构建好的自定义镜像推送到harbor仓库,就需要在shell命令中追加登录、打包更名、推送的命令

执行报错:

mv: cannot move 'target/maven-archiver' to './maven-archiver': File exists
Build step 'Execute shell' marked build as failure
Finished: FAILURE

原因:上次构建在/usr/local/docker/jenkins_docker/data/workspace/mytest目录下已经产生了maven-archiver 文件,所以再次构建,就无法执行移动的操作。我们在构建前需要将 /usr/local/docker/jenkins_docker/data/workspace/mytest/maven-archiver 删掉
解决:报错说无法把target/maven-archiver’移动到 ‘./maven-archiver’,因为./maven-archiver已经存在了,所以需要把./下的maven-archiver文件删掉。先用find命令找出target/maven-archiver文件在哪,然后把它删掉,再次构建就能成功了。

⑤ 查看harbor仓库是否有新推送的v3.0.0版本的镜像

shell脚本内容:

# 构建自定义镜像到Jenkins容器内部
mv target/* ./     #  “./”  表示Dockerfile所在的路径;这步是把/usr/local/docker/jenkins_docker/data/workspace/mytest/target/下的内容都移动到/usr/local/docker/jenkins_docker/data/workspace/mytest/下,也就是Dockerfile所在路径
docker build -t mytest:$tag .     #注意“.”,一定要加dockerfile路径
# 将Jenkins构建好的自定义镜像推送到harbor仓库
docker login -u admin -p Harbor12345 192.168.2.211:80
docker tag mytest:$tag 192.168.2.211:80/repo/mytest:$tag
docker push 192.168.2.211:80/repo/mytest:$tag

8.3.6 目标服务器上编写部署脚本

  • Jenkins需要通知目标服务器的信息,并在目标服务器执行相应命令:
  1. 告知目标服务器拉取哪个镜像
  2. 判断当前服务器是否正在运行容器,如果正在运行需要删除
  3. 如果目标服务器已经存在当前镜像,需要删除
  4. 让目标服务器拉取harbor上的镜像
  5. 将拉取下来的镜像运行成容器

如果在Jenkins来执行这一系列判断条件,成本较高。所以可以在目标服务器上建一个脚本文件,让Jenkins把镜像信息和端口号情况告诉目标服务器,目标服务器接收到后再来执行这个脚本文件就可以了。

  • Jenkins通知目标服务器信息
    ① 镜像信息:harbor地址/harbor仓库/镜像名:镜像版本
    ② 端口号占用情况

逻辑如图:
Jenkins将镜像构建完成、推送到harbor仓库后,需要将镜像信息以及端口号占用情况告知目标服务器,目标服务器接受到之后,执行脚本文件。

部署项目需要通过Publish Over SSH插件,让目标服务器执行命令。为了方便一次性实现拉取镜像和启动的命令,推荐采用脚本文件的方式。
添加脚本文件到目标服务器,再通过Publish Over SSH插件让目标服务器执行脚本即可。

  1. 编写脚本文件,添加到目标服务器
harbor_addr=$1    # 表示执行命令中的第一个参数,harbor仓库地址   192.168.2.211:80
harbor_repo=$2    # 表示执行命令中的第二个参数,harbor仓库  repo
project=$3        # 表示执行命令中的第三个参数,镜像仓库名   mytest
version=$4        # 表示执行命令中的第四个参数,镜像版本/tag标签   v3.0.0
container_port=$5           # 表示执行命令中的第五个参数,容器内端口   端口号   8080
host_port=$6      # 表示执行命令中的第六个参数,宿主机端口   端口号 8082imageName=$harbor_addr/$harbor_repo/$project:$version
echo $imageNamecontainerId=`docker ps -a | grep ${project} | awk '{print $1}'`  # 检查目标服务器是否存在正在运行的、与拉取镜像同名的容器,拿到这个容器对应的容器ID,后面需要删除
echo $containerIdif [ "$containerId" != "" ] ; then     #删除上一步查到的正在运行的容器,如果容器ID不为空,说明有正在运行的容器,则先停止,再删除docker stop $containerIddocker rm $containerIdecho "Delete Container Success"
fitag=`docker images | grep ${project} | awk '{print $2}'`    # 检查目标服务器是否存在同名的镜像,拿到这个镜像对应的容器tag版本,后面需要删除
echo $tagif [[ "$tag" =~ "$version" ]] ; then     #如果上一步查到的镜像版本与要拉取的版本一致,则删除这个镜像docker rmi -f $imageNameecho "Delete Image Success"
fidocker login -u admin -p Harbor12345 $harbor_addrdocker pull $imageNamedocker run -d -p $host_port:$containerport --name $project $imageNameecho "Start Container Success"
echo $project
  1. 设置脚本文件deploy.sh权限为可执行
chmod a+x deploy.sh    #给所有用户给予deploy.sh文件可执行权限
  1. deploy.sh文件移动到/usr/bin目录下,这样就可以在任何位置执行

  2. 测试脚本文件

sh deploy.sh 192.168.2.211:80 repo mytest v3.0.0 8080 8082

8.3.7 配置构建后操作

到目前为止,目标服务器中的脚本文件已经编辑完成,下面就要让Jenkins通知目标服务器执行这个脚本文件。
我们要到Jenkins中配置构建后操作

增加container_porthost_port参数,这样就可以直接引用了($container_port $host_port)


构建镜像:

去目标服务器中检查容器是否运行起来了(docker ps),然后用IP+端口号登录网页查看是否能访问即可

【devops】八、集成Harbor相关推荐

  1. CMDB与DevOps的集成

    公众号回复:干货,领取价值58元/套IT管理体系文档 公众号回复:ITIL教材,领取最新ITIL4中文教材 更多专业文档请访问 www.itilzj.com CMDB 集成 在 DevOps 的实践过 ...

  2. Monocular 集成harbor helm 仓库

    harbor 已经支持了helm 仓库(使用chartmuseum),Monocular 是一个不错的helm 仓库可视化工具  测试Monocular集成harbor 私服功能 使用docker-c ...

  3. AIR32F103(八) 集成Helix MP3解码库播放MP3

    目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...

  4. DevOps八荣八耻

    DevOps八荣八耻 1.以可配置为荣,以硬编码为耻 2.以系统互备为荣,以系统单点为耻 3.以随时可重启为荣,以不能迁移为耻 4.以整体交付为荣,以部分交付为耻 5.以无状态为荣,为有状态为耻 6. ...

  5. 【云原生】DevOps(五):集成Harbor

    本文目录: 一.Harbor介绍 二. Harbor安装 三. Harbor使用方式 1. 添加用户构建项目 2. 发布镜像到Harbor 3. 从Harbor拉取镜像ls 4. Jenkins容器使 ...

  6. 关于实施DevOps持续集成的整理

    第一部分:实施DevOps的八个常见步骤 https://www.tuicool.com/articles/QbueymE Gartner的研究主管George Spafford说:"由于缺 ...

  7. 使用Azure DevOps持续集成GitHub项目

    点击蓝字 关注我 微软的Azure DevOps是一款软件开发管理工具,整合了需求.代码.编译.测试.发布等所有功能于一身.今天我们就来看看如何用Azure DevOps对自己GitHub上的项目做持 ...

  8. 【测试开发】的Devops持续集成部署体系之Jenkins持续集成和持续部署基础应用

    目录 [一]:Jenkins 持续集成安装及使用简介 一.前言 二.初始化 Jenkins 插件和管理员用户 2.1 进入如下页面,输入上面出现的口令 2.2 进入选择安装插件的页面后,可以选择安装社 ...

  9. k8s 配置 Secret 集成Harbor

    本篇主要 记录一下 在 k8s 中如果想要 从 harbor拉取镜像 该怎么操作,以及介绍了一下 k8s 中 Secret 是什么 1.Secret 是什么 1.1 Secret 概述 Secret ...

最新文章

  1. Python常用函数与技巧总结(一)
  2. 2.c语言编译预处理,c语言第03章-编译预处理2.ppt
  3. 算法谜题 php,JavaScript实现N皇后问题算法谜题解答_javascript技巧
  4. case when 多条件_3年前的设计如今被iPhone强推 PITAKA磁吸生态设计的前瞻性到底有多可怕?...
  5. java url authority,Java如何解析url,包括自定义schema的url
  6. 设置java环境变量生效 centos_解决CentOS java环境不生效的问题
  7. Dex文件格式扫描器:特征API的检测和扫描-小工具一枚(转载)
  8. springboot项目打war包发布到外置tomcat
  9. 俄罗斯黑客被指攻击本国的工业组织机构
  10. JBOSS最大连接数配置和jvm内存配置
  11. (占坑)NOIP2018复赛解析
  12. icem二维非结构网格划分_“白皮书”系列No.26——科研小工具之ICEM
  13. 分享几个简单易做的Java小程序,一起动手来试试吧
  14. 知名公司GitHub官网
  15. Server 2008系统安装驱动提示“无法验驱动程序数字签名”怎么办?
  16. wine: /home/cpr/.wine is not owned by you
  17. 【Python】模块(Module)、包(Package)以及相对导入(relative import)和绝对导入(absolute import)
  18. 全国程序员12月工资新鲜出炉,又降了!?
  19. Spring的UriComponents
  20. face_recognition人脸检测

热门文章

  1. 高质量实时渲染课程笔记(三)— 实时阴影渲染1(Shadow Mapping、PCF、PCSS)
  2. Python-OpenCV图像处理(四):修改相机参数并保存高分辨率图片
  3. Mac OS下fis3 安装教程
  4. P1296 奶牛的耳语
  5. iOS内购代码(苹果支付ApplePay)
  6. WPF真入门教程23--MVVM简单介绍
  7. 基于opencv 的 fftshift, ifftshift 函数的实现
  8. 关于pdfobject.js在不同浏览器显示问题
  9. FreeBSD12.1管理用户和组
  10. oracle awr监控报告,一个Oracle小白的AWR报告分析(一)