Docker部署项目

相关系列文章:
1、Docker+Harbor私有仓库快速搭建
2、Docker+Jenkins+Harbor
3、Docker安装Mysql、Redis、nginx、nacos等环境

1、jenkins构建前端并上传服务器

在这篇文章中(Docker+Jenkins+Harbor)未完成前端的远程部署,这里对前端vue工程进行编译打包并上传远程服务器。

1-1 jenkins安装nodejs和nodejs插件

在这里插入图片描述
在这里插入图片描述

1-2 前端编译流水线语法

在这里插入图片描述

stage('编译前端工程') {steps {dir("${env.WORKSPACE}/infra-portal"){nodejs('Nodejs14') {sh '''npm -vnpm config set registry https://registry.npm.taobao.orgnpm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sassrm -rf dist/npm install && npm run build'''sh "tar -zcvf dist-${env.TAG}.tar.gz dist/*"echo '打包完成'}}}
}

1-3 jenkins免密登陆配置

jenkins服务器执行ssh-keygen -t rsa生成密钥对,遇到卡顿地方直接回车即可

ssh-keygen -t rsa

在这里插入图片描述
远程服务器(需要免密登陆的服务器)在/root/.ssh路径下会生成authorized_keys文件
执行下面代码将jenkins服务器生成的id_rsa.pub(公钥)内容复制到authorized_keys文件下:

# 复制到远程服务器
ssh-copy-id root@192.168.88.9
# 重启远程服务器的SSH
systemctl restart sshd
# 设置权限
chmod 700 /root/.ssh
chmod 644 authorized_keys
chmod 644 known_hosts
# 验证,不需要密码登陆
ssh 192.168.88.9

ps: 根据网上其他人的文章到这一步也就完成,但我这边不成功,还是需要密码才能登陆,我这边重启了服务器才成功

1-4 jenkins配置全局凭证并远程部署

添加SSH凭证,配置前面1-3生成的id_rsa私钥内容
username:远程服务器名
Private Key: 私钥文件(id_rsa)
在这里插入图片描述

# 流水线语法,credentialsId为创建的凭证随机生成的ID,也可以自定义生成ID
stage('上传远程服务器') {steps {dir("${env.WORKSPACE}/infra-portal"){withCredentials([sshUserPrivateKey(credentialsId: '48a060e5-74f0-4193-90d7-a8b6a7fdbab3', keyFileVariable: 'identity', usernameVariable: 'root')]) {sh 'ssh -T -o StrictHostKeyChecking=no root@192.168.88.9'sh 'scp -P 22 -o StrictHostKeyChecking=no dist-v1.0.0.tar.gz root@192.168.88.9:/home/'echo '上传成功'}}}}

ps: 若主机可以免登陆但容器内不行,构建时报错:Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
远程连接失败需要密码可尝试以下步骤:

# 远程连接失败可能是由于容器内.ssh文件夹没有相关密钥,<container_name>为容器名,复制密钥到容器内
docker cp /root/.ssh <container_name>:/root/.ssh
# 以root进入jenkins容器下
docker exec -u root -it <container_name> bash
# 复制 Root 用户的 .ssh 目录到 Jenkins 用户的 home 目录
cp -r /root/.ssh /var/jenkins_home/
# 更改文件的所有者为 Jenkins 用户
chown -R jenkins:jenkins /var/jenkins_home/.ssh

在这里插入图片描述

1-5 Jenkinsfile完整代码

 //harbor地址
def harbor_url="192.168.88.20:9002"
//镜像库的名称
def harbor_project="infra"
//Harbor的凭证
def harbor_auth = "9ed86288-cf38-4533-86ca-792b934452f9"
// 远程连接凭证
def remote_auth = "48a060e5-74f0-4193-90d7-a8b6a7fdbab3"
// 远程服务器
def remote_addr = "root@192.168.88.9"// 镜像
def authImage = "${harbor_url}/${harbor_project}/infra-auth:${env.TAG}"
def businessImage = "${harbor_url}/${harbor_project}/infra-business:${env.TAG}"
def gatewayImage = "${harbor_url}/${harbor_project}/infra-gateway:${env.TAG}"
def vue_dist = "dist-${env.TAG}.tar.gz"
pipeline {agent anytools {// jenkins全局工具配置配置的maven和jdkmaven 'apache-maven-3.9.2'jdk 'jdk1.8.0_291'}stages {stage('拉取代码') {steps {echo '相关环境变量'sh "printenv"echo '-------------------------------------'git 'https://gitee.com/dalao708/infra.git'echo '拉取成功'}}stage('编译前端工程') {steps {dir("${env.WORKSPACE}/infra-portal"){nodejs('Nodejs14') {sh '''npm -vnpm config set registry https://registry.npm.taobao.orgnpm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sassrm -rf dist/npm install && npm run build'''sh "tar -zcvf ${vue_dist} dist/*"echo '打包完成'}}}}stage('上传远程服务器') {steps {dir("${env.WORKSPACE}/infra-portal"){withCredentials([sshUserPrivateKey(credentialsId: "${remote_auth}", keyFileVariable: 'identity', usernameVariable: 'root')]) {sh "ssh -T -o StrictHostKeyChecking=no ${remote_addr}"sh "scp -P 22 -o StrictHostKeyChecking=no ${vue_dist} ${remote_addr}:/home/nginx/www/infra/"sh "rm -rf ${vue_dist}"echo '上传成功'}}}}stage('清理maven库') {steps {dir("${env.WORKSPACE}"){sh "rm -rf /var/jenkins_home/.m2/repository/com/infra/server/*"echo '清理maven库完成'}}}stage('构建基础工程') {steps {dir("${env.WORKSPACE}/infra-server"){sh "mvn -Dmaven.test.skip=true clean install"//编译,安装公共工程sh "mvn -f infra-support -Dmaven.test.skip=true clean install"echo '构建基础工程'}}}stage('编译&构建镜像') {steps {dir("${env.WORKSPACE}/infra-server"){sh "mvn -f infra-auth -Dmaven.test.skip=true clean package dockerfile:build"sh "mvn -f infra-business -Dmaven.test.skip=true clean package dockerfile:build"sh "mvn -f infra-gateway -Dmaven.test.skip=true clean package dockerfile:build"echo '编译&构建镜像完成'sh "docker tag infra-auth ${authImage}"sh "docker tag infra-business ${businessImage}"sh "docker tag infra-gateway ${gatewayImage}"echo '镜像打标签完成'}}}stage('上传Harbor') {steps {withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {//登录到Harborsh "docker login -u ${username} -p ${password} ${harbor_url}"//镜像上传sh "docker push ${authImage}"sh "docker push ${businessImage}"sh "docker push ${gatewayImage}"sh "echo 镜像上传成功"//删除本地镜像sh "docker rmi -f ${authImage}"sh "docker rmi -f ${businessImage}"sh "docker rmi -f ${gatewayImage}"sh "docker rmi -f infra-auth"sh "docker rmi -f infra-business"sh "docker rmi -f infra-gateway"sh "echo 删除本地镜像成功"}}}}
}

2、部署项目

2-1 测试是否能正常从harbor拉取镜像

docker pull 192.168.88.20:9002/infra/infra-gateway:v1.0

报错:Error response from daemon: Get “https://192.168.88.20:9002/v2/”: http: server gave HTTP response to HTTPS client
解决:

vim /etc/docker/daemon.json
# 内容如下,保存并退出
{"insecure-registries": ["192.168.88.20:9002"]
}
# 重新加载daemon
systemctl daemon-reload
# 重启docker
systemctl restart docker

报错:Error response from daemon: unauthorized: unauthorized to access repository: infra/infra-gateway, action: pull: unauthorized to access repository: infra/infra-gateway, action: pull
解决:

# 登陆再拉取
docker login 192.168.88.20:9002 -u admin -p Harbor12345

2-2 编写docker-compose.yaml

# 前面安装mysql集群时候已经安装了docker swarm集群
# node1上创建docker-compose.yaml文件
mkdir /opt/infra
cd /opt/infra
vim docker-compose.yaml
version: '3.8'
services:infra-gateway:image: 192.168.88.20:9002/infra/infra-gateway:v1.0.0 # 拉取Harbor中拉取镜像environment:- SPRING_PROFILES_ACTIVE=prodports:- "9000:9000"deploy:replicas: 1   # 部署1个副本endpoint_mode: vip   # 使用默认的vip方式进行服务访问volumes:- gateway-data:/app/datainfra-auth:image: 192.168.88.20:9002/infra/infra-auth:v1.0.0environment:- SPRING_PROFILES_ACTIVE=prodports:- "9001:9001"deploy:replicas: 1  endpoint_mode: vip   volumes:- auth-data:/app/datainfra-business:image: 192.168.88.20:9002/infra/infra-business:v1.0.0environment:- SPRING_PROFILES_ACTIVE=prodports:- "9002:9002"deploy:replicas: 1   endpoint_mode: vip   volumes:- business-data:/app/datavolumes:gateway-data:auth-data:business-data:

2-3 启动&停止

docker compose up -d

其他命令:

# 检查docker-compose.yaml文件的命令是否正确
docker compose config -q
# 停止服务
docker compose down -v

在这里插入图片描述
在这里插入图片描述

2-4 其他

  1. 前端vue项目工程只需要构建完放到服务器上,nginx做映射即可,其实也可以直接通过jenkins做完这一切,上传到服务器后直接解压到指定目录
  2. 部署过程中可能会遇到很多问题,如虚拟机的设置的内存或者硬盘不足导致服务启动失败,需要检查看看。项目本身问题,如整合了redis集群,项目本地是单机的,需要检查一下redisConfig类是否有做动态切换等
  3. 构建镜像后运行时报找不到app.jar,找不到主类等,则项目中参考以下配置一下:
<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.4.1</version><executions><execution><phase>package</phase><goals><goal>repackage</goal></goals></execution></executions><configuration><includeSystemScope>true</includeSystemScope><mainClass>com.infra.server.AuthRun</mainClass></configuration></plugin>

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

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

相关文章

虚拟内存相关笔记

虚拟内存是计算机系统内存管理的一个功能&#xff0c;它允许程序认为它们有比实际物理内存更多的可用内存。它使用硬盘来模拟额外的RAM。当物理内存不足时&#xff0c;操作系统将利用磁盘空间作为虚拟内存来存储数据。这种机制提高了资源的利用率并允许更大、更复杂的应用程序的…

BLDC无感方波控制

BLDC无感控制 反电动势过零检测反电动势检测方法比较器模式采样过零信号闭环的建立 BLDC 方波启动技术转子预定位电机的外同步加速电机运行状态的转换 程序部分 反电动势过零检测 它的主要核心就是通过检测定子绕组的反电动势过零点来判断转子当前的位置。 三相六状态 120通电…

IDEA 报 Cannot resolve symbol ‘HttpServletResponse‘ 解决

springboot2版本换成springboot3之后&#xff0c;代码这里突然报红了&#xff0c; 首先要淡定&#xff0c;把原先Import的引入删掉&#xff0c;重新引入试试呢&#xff0c;是不是很简单哈哈。 原来&#xff0c;springboot3的路径是&#xff1a; import jakarta.servlet.http…

4.2 实现基于栈的表达式求值计算器(难度4/10)

本作业主要考察&#xff1a;解释器模式的实现思想/栈结构在表达式求值方面的绝对优势 C数据结构与算法夯实基础作业列表 通过栈的应用&#xff0c;理解特定领域设计的关键作用&#xff0c;给大家眼前一亮的感觉。深刻理解计算机语言和人类语言完美结合的杰作。是作业中的上等…

Docker进阶:mysql 主从复制、redis集群3主3从【扩缩容案例】

Docker进阶&#xff1a;mysql 主从复制、redis集群3主3从【扩缩容案例】 一、Docker常规软件安装1.1 docker 安装 tomcat&#xff08;默认最新版&#xff09;1.2 docker 指定安装 tomcat8.01.3 docker 安装 mysql 5.7&#xff08;数据卷配置&#xff09;1.4 演示--删除mysql容器…

嵌入式学习之进程

1.进程间通信概述 UNIX系统IPC是各种进程通信方式的统称。 2.管道通信原理 特点&#xff1a; 1.它是半双工的&#xff08;即数据只能在一个方向上流动&#xff09;&#xff0c;具有固定的读端和写端。 2.它只能用于具有亲缘关系的进程之间通信&#xff08;也是父子进程或者…

uniapp 微信小程序仿抖音评论区功能,支持展开收起

最近需要写一个评论区功能&#xff0c;所以打算仿照抖音做一个评论功能&#xff0c;支持展开和收起&#xff0c; 首先我们需要对功能做一个拆解&#xff0c;评论区功能&#xff0c;两个模块&#xff0c;一个是发表评论模块&#xff0c;一个是评论展示区。接下来对这两个模块进行…

一探究竟:为什么需要 JVM?它处在什么位置?

小熊学Java全能学习面试指南&#xff1a;https://www.javaxiaobear.cn/ JVM我们并不陌生&#xff0c;现在我们就正式进入 JVM 的学习&#xff0c;如果你是一名软件开发工程师&#xff0c;在日常工作中除了 Java 这个关键词外&#xff0c;还有一个名词也一定经常被提及&#xf…

开开心心带你学习MySQL数据库之第三篇上

学校的项目组有必要加入吗? 看你的初心. ~~如果初心是通过这个经历能够提高自己的技术水平 ~~是可以考虑的 ~~如果初心是通过这个经历提高自己找工作的概率 ~~这个是不靠谱的,啥用没有 ~~如果初心是通过这个体验更美好的大学生活 ~~靠谱的 秋招,应届生,找工作是非常容易的!!! …

Java切换到Kotlin,Crash率上升了?

前言 最近对一个Java写的老项目进行了部分重构&#xff0c;测试过程中波澜不惊&#xff0c;顺利上线后几天通过APM平台查看发现Crash率上升了&#xff0c;查看堆栈定位到NPE类型的Crash&#xff0c;大部分发生在Java调用Kotlin的函数里&#xff0c;本篇将会分析具体的场景以及…

【小作文】【信】

【邀请信】【22&#xff0c;1邀请教授参加比赛】 【投诉信】【12,2投诉产品质量问题】

【AWS实验】 配置中转网关及对等连接

文章目录 实验概览目标实验环境任务 1&#xff1a;查看网络拓扑并创建基准任务 2&#xff1a;创建中转网关任务 3&#xff1a;创建中转网关挂载任务 4&#xff1a;创建中转网关路由表任务 4.1&#xff1a;创建路由表关联任务 4.2&#xff1a;创建路由传播 任务 5&#xff1a;更…

SpringWeb(SpringMVC)

目录 SpringWeb介绍 搭建 SpringWeb SpringWeb介绍 Spring Web是一个基于 Servlet API 构建的原始 web 框架&#xff0c;用于构建基于MVC模式的Web应用程序。在 web 层框架历经 Strust1&#xff0c;WebWork&#xff0c;Strust2 等诸多产品的历代更选 之后&#xff0c;目前业界普…

fastadmin think-queue supervisor配置

起因是微信支付回调需要同时做发货处理&#xff0c;但是发货接口不能影响,需要队列进行异步处理1. 1.fastadmin 后台购买queue插件(基于think-queue消息队列) 2.代码 2.1 添加文件&#xff1a;application---->extra--->queue.php 内容&#xff1a;我这里用的数据库做…

Git的基本使用笔记——狂神说

版本控制 版本迭代&#xff0c; 版本控制( Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史&#xff0c;方便查看更改历史记录&#xff0c;备份以便恢复以前的版本的软件工程技术。 实现跨区域多人协同开发 追踪和记载一个或者多个文件的…

合宙Air724UG LuatOS-Air LVGL API控件--日历 (Calendar)

日历 (Calendar) LVGL 提供了一个用来选择和显示当前日期的日历控件。 示例代码 – 高亮显示的日期 highlightDate lvgl.calendar_date_t() – 日历点击的回调函数 – 将点击日期设置高亮 function event_handler(obj, event) if event lvgl.EVENT_VALUE_CHANGED then da…

(15)线程的实例认识:同步,异步,并发,并发回调,事件,异步线程,UI线程

参看&#xff1a;https://www.bilibili.com/video/BV1xA411671D/?spm_id_from333.880.my_history.page.click&vd_source2a0404a7c8f40ef37a32eed32030aa18 下面是net framework版本 一、文件构成 1、界面如下。 (1)同步与异步有什么区别&#xff1f; …

单片机TVS/ESD二极管防护

TVS 瞬态电压抑制二极管Transient Voltage Suppressor ESD 静电释放二极管 Electro-Static discharge 这两种本质上都是二极管。都是利用了二极管正向导通、反向截止的特性。二极管在反向截止截止条件下&#xff0c;如果电压继续增大&#xff0c;将会引发雪崩&#xff0c;使得…

聚合多个电商API接口平台

API接口测试&#xff08;点击免费测试&#xff09; 随着数字化商业时代的到来&#xff0c;API接口已成为电商资源连接利器&#xff0c;也是全球传统互联网企业转型的基础。 2021年 Google Cloud 研究显示&#xff0c;全球互联网企业近3/4的企业持续投入数字化转型&#xff0c…

JVM类的加载过程

加载过程 JVM的类的加载过程分为五个阶段&#xff1a;加载、验证、准备、解析、初始化。 加载   加载阶段就是将编译好的的class文件通过字节流的方式从硬盘或者通过网络加载到JVM虚拟机当中来。&#xff08;我们平时在Idea中书写的代码就是放在磁盘中的&#xff0c;也可以通…