【devops】八、集成Harbor(下)

简介: 【devops】八、集成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


修改前

c24112c842f445f880417c5ab51769b4.png

修改后

a16bd58cca7c46aa8fc6750461100462.png

  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.yml
version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins
    container_name: jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./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命令测试

327eedba3d3f4bc1b65a2c9f362dd1e2.png


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

5250423b3fbd4ccea151fc749eced502.png

目的:使用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

8ddc9902ea8d4a79a8beb391c0a8a8bc.png

2、gitlab上创建tag标签

a78157c9f9f24dd8a46aab6fa8f318c7.png

3、修改mytest任务配置

① 删除构建后操作:

42adb2d4fdb646cb982dcc6b4fe9b1c7.png

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

e40b5280b7634525b001e9fba255a905.png

39acdc8eb8344abdb446b24414cb3858.png

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

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

e35a26379a6c4950966523e43ffc8160.png

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

25bc0e64ed0a4c1c9cd58740718d6ae5.png

执行报错:

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文件在哪,然后把它删掉,再次构建就能成功了。

59f556ed5f994ac4a91b79a622ce07c9.png

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

33db3f68c6f94e1b957229ef3be0d156.png

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 目标服务器上编写部署脚本

e8054fd3b18c4c0e9a09c34c4979f73e.png

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


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

  • Jenkins通知目标服务器信息

① 镜像信息:harbor地址/harbor仓库/镜像名:镜像版本

② 端口号占用情况


逻辑如图:

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

f8e953c8766b460f9cd61972d4a93832.png

部署项目需要通过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      # 表示执行命令中的第六个参数,宿主机端口   端口号 8082
imageName=$harbor_addr/$harbor_repo/$project:$version
echo $imageName
containerId=`docker ps -a | grep ${project} | awk '{print $1}'`  # 检查目标服务器是否存在正在运行的、与拉取镜像同名的容器,拿到这个容器对应的容器ID,后面需要删除
echo $containerId
if [ "$containerId" != "" ] ; then     #删除上一步查到的正在运行的容器,如果容器ID不为空,说明有正在运行的容器,则先停止,再删除
    docker stop $containerId
    docker rm $containerId
    echo "Delete Container Success"
fi
tag=`docker images | grep ${project} | awk '{print $2}'`    # 检查目标服务器是否存在同名的镜像,拿到这个镜像对应的容器tag版本,后面需要删除
echo $tag
if [[ "$tag" =~ "$version" ]] ; then     #如果上一步查到的镜像版本与要拉取的版本一致,则删除这个镜像
    docker rmi -f $imageName
    echo "Delete Image Success"
fi
docker login -u admin -p Harbor12345 $harbor_addr
docker pull $imageName
docker run -d -p $host_port:$containerport --name $project $imageName
echo "Start Container Success"
echo $project


  1. 设置脚本文件deploy.sh权限为可执行
chmod a+x deploy.sh    #给所有用户给予deploy.sh文件可执行权限


3、将deploy.sh文件移动到/usr/bin目录下,这样就可以在任何位置执行

c3df6472509141a7a6b9f69c20e4cea8.png

baec1ca88c7c4d1589c7bc9e95c0580a.png

4、测试脚本文件

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

a4159069376944fba658e6208fc3d1bb.png

8.3.7 配置构建后操作

到目前为止,目标服务器中的脚本文件已经编辑完成,下面就要让Jenkins通知目标服务器执行这个脚本文件。

我们要到Jenkins中配置构建后操作

b17ecc8d0b8a43dca069e5c9e1793936.png


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

995680c9463d4fe984c8557497bfa705.png

488eb132835f4c549f63416d4686d453.png

201e31a6b1084cad94206e90fca3f526.png

构建镜像:

f3245d8faa7847e38534c22b1fe02a8a.png

23d4e2c7e71e491182913c34b611d278.png

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

相关文章
|
9月前
|
Devops jenkins Java
【devops】八、集成Harbor(上)
【devops】八、集成Harbor(上)
|
13天前
|
监控 Devops 测试技术
DevOps实践:持续集成与持续部署(CI/CD)在现代软件开发中的作用
【6月更文挑战第24天】本文深入探讨了持续集成(Continuous Integration,简称CI)和持续部署(Continuous Deployment,简称CD)在现代软件开发生命周期中的核心作用。通过阐述CI/CD的概念、优势以及实施策略,文章旨在为读者提供一套完整的理论框架和实践指南,以促进软件开发流程的高效性和产品质量的提升。
|
20天前
|
运维 监控 Devops
DevOps实践:持续集成与持续部署(CI/CD)的精髓
【6月更文挑战第17天】本文将深入探讨DevOps文化中的核心实践——持续集成(CI)和持续部署(CD)。我们将从理论出发,逐步过渡到实际操作,介绍如何搭建一个高效的CI/CD流程。文章将涵盖工具选择、流程设计、自动化测试以及监控和反馈机制的建立。通过具体案例分析,揭示成功实施CI/CD的关键因素,并探讨如何在组织内推广这一实践以促进开发和运维之间的协作。
|
2月前
|
Devops 开发工具 数据安全/隐私保护
Docker Swarm总结+CI/CD Devops、gitlab、sonarqube以及harbor的安装集成配置(3/5)
Docker Swarm总结+CI/CD Devops、gitlab、sonarqube以及harbor的安装集成配置(3/5)
177 0
|
4天前
|
监控 Devops 测试技术
利用DevOps提升开发效率:技术实践与策略
【7月更文挑战第4天】DevOps通过自动化、CI/CD、协作与沟通等手段,显著提升了软件开发的效率和质量。随着云计算、容器化、自动化测试等技术的不断发展,DevOps的实践将更加深入和广泛。未来,更多的企业将采用DevOps文化,构建高效、灵活、可靠的软件开发和运维体系,以应对快速变化的市场需求。 总之,利用DevOps提升开发效率是软件开发领域的重要趋势。通过实施上述实践策略,企业可以加速产品迭代,提高市场竞争力,实现可持续发展。
|
25天前
|
运维 监控 Devops
DevOps文化下的自动化运维实践
本文将探讨在DevOps文化背景下,自动化运维的重要性及其实现方式。通过分析自动化运维的优势和挑战,文章提供了具体的实施策略和案例,旨在帮助读者理解如何在DevOps实践中融入自动化运维,以提高软件开发和部署的效率与质量。
|
8天前
|
运维 监控 Devops
DevOps实践:构建高效运维流程
【6月更文挑战第29天】在现代软件开发周期中,DevOps已成为推动开发和运维团队紧密合作的重要哲学。本文将探讨如何通过DevOps实践来构建一个更高效的运维流程,从而提升软件交付速度、提高产品质量,并确保系统的稳定性和安全性。我们将从持续集成、自动化测试、配置管理、容器化部署、监控与告警等关键方面入手,深入分析DevOps实施过程中的关键环节及其对运维工作的影响。
25 3
|
17天前
|
运维 Devops 测试技术
DevOps:文化、工具与实践的深度融合
【6月更文挑战第21天】DevOps融合文化、工具与实践,促进开发与运维协作,加速软件交付。核心包括共享文化、自动化工具(如Git、Jenkins)与流程优化(敏捷、自动化、微服务)。DevOps助力团队协作,提高效率,降低运维成本,驱动企业持续创新与成长。
|
17天前
|
运维 监控 Devops
DevOps实践:从理论到现实的转变
【6月更文挑战第20天】在数字化浪潮的推动下,DevOps作为一种文化和实践,正逐渐成为企业追求敏捷、高效运维不可或缺的一环。本文将深入探讨DevOps的核心理念、实践策略以及面临的挑战,并结合真实案例分析其在实际工作中的应用效果。通过阐述DevOps实施过程中的关键因素,文章旨在为读者提供一套完整的DevOps落地指南,以助力企业实现持续集成与持续交付的目标。
23 2
|
2月前
|
运维 JavaScript Devops
DevOps实践:通过云效实现hexo自动构建部署发布
DevOps是一种融合开发、技术运营和质量保证的流程,旨在增强跨部门沟通与协作。通过自动化软件交付和架构变更,DevOps加速了构建、测试和发布软件的过程。本文作者分享了如何使用阿里云效平台实现个人Hexo博客的自动化部署,从而实现持续集成和持续部署(CI/CD)。在应用DevOps之前,作者需手动上传和部署文件;应用后,只需提交Markdown文件,其余步骤由DevOps平台自动完成。通过云效平台的代码管理和流水线功能,实现了从代码提交到自动发布的无缝衔接。
65 2
DevOps实践:通过云效实现hexo自动构建部署发布