当前位置: 首页 > news >正文

docker安装jenkins, pipeline再调用宿主机的docker, 实现远程主机部署网站,以下以 springboot 为例

准备3台主机,(每台主机,都要安装好docker ,docker-compose)
主机一: 192.168.31.199
主机二: 192.168.31.200
主机三: 192.168.31.201

需要实现主要功能:

主机一安装jenkins拉取git仓库代码,生成docker镜像,在主机二中运行部署站点

主机三用来安装harbor仓库,保存docker镜像

主机一安装jenkins

docker run -u root -d -p 8080:8080 -p 50000:50000 -v ./jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker --restart=always --name=jenkins jenkins/jenkins:lts

主机三安装harbor

下载Harbor的压缩包(本课程版本为:v1.9.2
https://github.com/goharbor/harbor/releases
上传压缩包到linux,并解压
tar -xzf harbor-offline-installer-v1.9.2.tgz mkdir /opt/harbor mv harbor/* /opt/harbor cd /opt/harbor
修改Harbor的配置
vi harbor.yml
修改hostnameport
hostname: 192.168.66.102 port: 85
安装Harbor
./prepare ./install.sh
启动Harbor
docker-compose up -d 启动 docker-compose stop 停止 docker-compose restart 重新启动
访问Harbor
http://192.168.31.201:85
默认账户密码:admin/Harbor12345
pepiline 语法
Jenkinsfile
// 项目名称 String project_name = "demo-test" // harbor仓库地址 String harbor_url = "192.168.31.201:85" // harbor项目名称 String harbor_project_name = "test" // docker标签、版本号 String tag = "latest" // 开放端口 String port = "10086" pipeline { agent any tools { maven 'maven-3.8.9' // 确保这里的名称与 Jenkins 系统配置中的 Maven 名称一致 } stages { stage('pull') { steps { // 下载git代码 git branch: 'main', credentialsId: 'gogs', url: 'http://192.168.31.199:10880/gogs/demo-test.git' } } stage('build') { steps { // 执行maven打包完成后,并完成 docker打包生成镜像 sh 'mvn clean package dockerfile:build' } } stage('docker tag') { steps { // 生成的镜像打标签 sh "docker tag ${project_name}:${tag} 192.168.31.201:85/test/${project_name}:${tag}" } } stage('docker push') { steps { // 镜像上传到 harbor 仓库 withCredentials([usernamePassword(credentialsId: 'harbor', passwordVariable: 'password', usernameVariable: 'username')]) { // 登陆harbor仓库 sh "docker login -u harbor -p 300800aA 192.168.31.201:85" // 镜像上传 sh "docker push 192.168.31.201:85/test/${project_name}:${tag}" // sh "echo 上传成功" } } } stage('server 200 publish') { steps { // 方法一,需要安装 Publish Over SSH 插件 //sshPublisher(publishers: [sshPublisherDesc(configName: 'test-server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/opt/jenkins_shell/deploy.sh $harbor_url $harbor_project_name $project_name $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) // 方法二, 需要安装 SSH Agent 插件 sshagent(credentials: ['server-ip-200']) { sh """ ssh root@192.168.31.200 \' /opt/jenkins_shell/deploy.sh $harbor_url $harbor_project_name $project_name $tag $port \' """ } } } } }
Dockerfile
FROM openjdk:17 ARG JAR_FILE COPY ${JAR_FILE} app.jar EXPOSE 10086 ENTRYPOINT ["java","-jar","/app.jar"]
deploy.sh
#! /bin/sh #接收外部参数 harbor_url=$1 harbor_project_name=$2 project_name=$3 tag=$4 port=$5 imageName=$harbor_url/$harbor_project_name/$project_name:$tag echo "容器名称:$imageName" echo "harbor_url: $harbor_url" echo "harbor_project_name: $harbor_project_name" echo "project_name: $project_name" echo "tag: $tag" echo "port: $port" #查询容器是否存在,存在则删除 containerId=`docker ps -a | grep -w ${project_name}:${tag} | awk '{print $1}'` if [ "$containerId" != "" ] ; then #停掉容器 docker stop $containerId #删除容器 docker rm $containerId echo "成功删除容器" fi #查询镜像是否存在,存在则删除 imageId=`docker images | grep -w $project_name | awk '{print $3}'` if [ "$imageId" != "" ] ; then #删除镜像 docker rmi -f $imageId echo "成功删除镜像" fi # 登录Harbor docker login -u harbor -p 123456 $harbor_url # 下载镜像 docker pull $imageName # 启动容器 docker run -di -p $port:8080 $imageName echo "容器启动成功"
http://www.jsqmd.com/news/1379566/

相关文章:

  • 小白程序员必看:收藏这份AI Agent(智能体)入门指南,轻松入门大模型时代!
  • 从零开始构建SDK:核心设计、架构实现与工程实践全指南
  • 国企工程项目管理数字化趋势:2026年选型评估框架
  • C Primer Plus——第三章 数据和C
  • 前端静态资源优化全方案与性能提升实践
  • 从工程视角拆解 AI 销售陪练:角色扮演架构、RAG 与评分引擎的落地踩坑
  • Windows渗透测试载荷加载技术:进程注入与反射式DLL绕过防御
  • 为什么架构设计提倡无状态化
  • Git安装全攻略:从核心概念到实战配置,新手避坑指南
  • 游戏速通黑话解析:从“28秒罗丹”看极限资源管理与机制利用
  • 软件工厂:在 AI 时代,我们正在失去对代码的理解吗?
  • 仓库降本,从管好每一件资产开始
  • 使用免费,不花tokens的大模型
  • 异丙威农药残留胶体金快速检测卡
  • 如何实现闲鱼多店防关联管理自动化?接口直取+DOM穿透,双层突破平台反爬体系
  • Web测试实战手册:从功能到安全的全链路质量保障清单
  • 终极指南:如何用渔人的直感提升FF14钓鱼效率300% [特殊字符]
  • STM32 SPI驱动SD卡全攻略:从硬件连接到FatFs文件系统移植
  • VSCode与Git深度集成:现代开发工作流的核心实践指南
  • 常德本地防水维修科普:漏水原因、施工方案与选择建议 - 筑宅安
  • 史上最大规模图灵测试:150万人与AI的千万次对话揭示人机边界
  • 第19届成图大赛深度解析:国产软件与数字化设计全流程备赛指南
  • Xilinx FPGA 是 AMD 旗下的高性能可编程芯片品牌‌
  • 开源大模型本地部署实战:从环境搭建到生产级应用指南
  • Calibre繁简中文转换插件:5分钟搞定中文电子书格式统一终极指南
  • 15 字符串拼接及格式化
  • GetQzonehistory:你的QQ空间时光机,一键打包青春记忆
  • 拯救 C 语言 ABI:透明别名能否解决兼容性难题?
  • 爬虫技术如何成为渗透测试的入门基石:从数据采集到安全侦察的思维转型
  • DeepSpeed ZeRO-3保存检查点后OOM问题:原理、诊断与解决方案