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 -v
                     npm config set registry https://registry.npm.taobao.org
                     npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass
                     rm -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 any

    tools {
        // jenkins全局工具配置配置的maven和jdk
        maven '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 -v
                             npm config set registry https://registry.npm.taobao.org
                             npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass
                             rm -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')]) {
                   //登录到Harbor
                    sh "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=prod
    ports:
      - "9000:9000"
    deploy:
      replicas: 1   # 部署1个副本
      endpoint_mode: vip   # 使用默认的vip方式进行服务访问
    volumes:
      - gateway-data:/app/data

  infra-auth:
    image: 192.168.88.20:9002/infra/infra-auth:v1.0.0
    environment:
      - SPRING_PROFILES_ACTIVE=prod
    ports:
      - "9001:9001"
    deploy:
      replicas: 1  
      endpoint_mode: vip   
    volumes:
      - auth-data:/app/data

  infra-business:
    image: 192.168.88.20:9002/infra/infra-business:v1.0.0
    environment:
      - SPRING_PROFILES_ACTIVE=prod
    ports:
      - "9002:9002"
    deploy:
      replicas: 1   
      endpoint_mode: vip   
    volumes:
      - business-data:/app/data

volumes:
  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>

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

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

相关文章

学习ts(十)装饰器

定义 装饰器是一种特殊类型的声明&#xff0c;它能够被附加到类声明&#xff0c;方法&#xff0c;访问符&#xff0c;属性或参数上&#xff0c;是一种在不改变原类和使用继承的情况下&#xff0c;动态的扩展对象功能。 装饰器使用expression形式&#xff0c;其中expression必须…

【C++】—— C++11新特性之 “右值引用和移动语义”

前言&#xff1a; 本期&#xff0c;我们将要的介绍有关 C右值引用 的相关知识。对于本期知识内容&#xff0c;大家是必须要能够掌握的&#xff0c;在面试中是属于重点考察对象。 目录 &#xff08;一&#xff09;左值引用和右值引用 1、什么是左值&#xff1f;什么是左值引用…

政务大厅人员睡岗离岗玩手机识别算法

人员睡岗离岗玩手机识别算法通过pythonyolo系列网络框架算法模型&#xff0c;人员睡岗离岗玩手机识别算法利用图像识别和行为分析&#xff0c;识别出睡岗、离岗和玩手机等不符合规定的行为&#xff0c;并发出告警信号以提醒相关人员。Python是一种由Guido van Rossum开发的通用…

Linux————LNMT搭建

一、原理 搭建一个基于Linux系统的Web服务器&#xff0c;使用Nginx作为反向代理服务器&#xff0c;Tomcat作为应用服务器&#xff0c;MySQL作为数据库服务器。 Linux操作系统 基于Linux的操作系统 Nginx Nginx是一款高性能的Web服务器和反向代理服务器&#xff0…

基于Java+SpringBoot+Vue前后端分离图书管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

svn软连接和文件忽略

软连接 1)TortoiseSVN->Properties->New->Externals->New 2)填入软连接信息 Local path: 写下软连接后的文件夹的名字 URL: 想要软连接的牡蛎->TortoiseSVN->Repo-browser 复制下填入 文件忽略 以空格隔开就行

C++:list使用以及模拟实现

list使用以及模拟实现 list介绍list常用接口1.构造2.迭代器3.容量4.访问数据5.增删查改6.迭代器失效 list模拟实现1.迭代器的实现2.完整代码 list介绍 list是一个类模板&#xff0c;加<类型>实例化才是具体的类。list是可以在任意位置进行插入和删除的序列式容器。list的…

软考:中级软件设计师:网络类型与拓扑结构,网络规划与设计,ip地址与子网划分,特殊含义的IP地址

软考&#xff1a;中级软件设计师:网络类型与拓扑结构 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准…

LAMP 配置与应用

LAMP 架构的组成 LAM(M)P&#xff1a; L&#xff1a;linux A&#xff1a;apache (httpd) M&#xff1a;mysql, mariadb P&#xff1a;php, perl, python apache的功能&#xff1a; 第一&#xff1a;处理http的请求、构建响应报文等自身服务&#xff1b; 第二&#xff1a…

C语言之数组题

目录 1.使用函数实现数组操作 2.冒泡排序 3.三子棋 4.【一维数组】交换数组 5.扫雷 6.概念辨析tips 我又来了&#xff0c;今天是数组题&#xff0c;本人还在补军训真的热&#xff01;&#x1f197; 1.使用函数实现数组操作 2.冒泡排序 3.三子棋 4.【一维数组】交换数组 …

vscode使用anaconda自带的python环境在终端运行时报错

目录 具体报错内容官方翻译报错讲人话解决方法 具体报错内容 CommandNotFoundError: Your shell has not been properly configured to use conda activate. If your shell is Bash or a Bourne variant, enable conda for the current user with$ echo ". E:\Anaconda/e…

Nginx配置文件详解

Nginx配置文件详解 1、Nginx配置文件1.1主配置文件详解1.2子配置文件 2、全局配置部分2.1修改启动的工作进程数&#xff08;worker process) 优化2.2cpu与worker process绑定2.3 PID 路径修改2.4 修改工作进程的优先级2.5调试工作进程打开的文件的个数2.6关闭master-worker工作…

docker使用安装教程

docker使用安装教程 一、docker安装及下载二、使用教程2.1 镜像2.2 容器2.3 docker安装Redis 一、docker安装及下载 一、安装 安装执行命令&#xff1a;curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 二、启停常用命令 启动docker,执行命令&#xf…

自动化运维工具——ansible安装及模块介绍

目录 一、ansible——自动化运维工具 1.1 Ansible 自动运维工具特点 1.2 Ansible 运维工具原理 二、安装ansible 三、ansible命令模块 3.1 command模块 3.2 shell模块 3.3 cron模块 3.4 user模块 3.5 group 模块 3.6 copy模块 3.7 file模块 3.8 ping模…

videojs 实现自定义组件(视频画质/清晰度切换) React

前言 最近使用videojs作为视频处理第三方库&#xff0c;用来对接m3u8视频类型。这里总结一下自定义组件遇到的问题及实现&#xff0c;目前看了许多文章也不全&#xff0c;官方文档写的也不是很详细&#xff0c;自己摸索了一段时间陆陆续续完成了&#xff0c;这是实现后的效果.…

Cpp学习——编译链接

目录 ​编辑 一&#xff0c;两种环境 二&#xff0c;编译环境下四个部分的 1.预处理 2.编译 3.汇编 4.链接 三&#xff0c;执行环境 一&#xff0c;两种环境 在程序运行时会有两种环境。第一种便是编译环境&#xff0c;第二种则是执行环境。如下图&#xff1a; 在程序运…

ubuntu22.04.1-live的vm虚拟机扩展磁盘

1、虚拟机分配硬盘100G&#xff0c;进系统df -h根目录只有50G 2、查看所有块设备 lsblk 3、 查看卷信息vgdisplay 4、在原有基础上增加49G lvextend -L 49G /dev/ubuntu-vg/ubuntu-lv 5、调整大小 resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

TCP/IP五层模型、封装和分用

1.网络通信基础2.协议分层OSI七层协议模型TCP/IP五层/四层协议模型【重点】 3. 封装&分用 1.网络通信基础 IP地址&#xff1a;表示计算机的位置&#xff0c;分源IP和目标IP&#xff1b;举个例子&#xff1a;买快递&#xff0c;商家从上海发货&#xff0c;上海就是源IP&…

七层、四层和五层网络模型区别和联系

七层、四层和五层网络模型区别和联系 概述OSI网络7层模型&#xff08;概念型框架&#xff09;概述图片分析 四层模型概述常用协议OSI与TCP/IP四层的区别 五层模型概述三种网络模型对比 总结 概述 网络模型-七层模型&#xff08;OSI模型&#xff09;、五层协议体系结构和TCP/IP…

【ag-grid-vue】column

网格中的每一列都使用列定义(ColDef)来定义。列根据在网格选项中指定的列定义的顺序在网格中定位。 列定义 下面的例子展示了一个定义了3列的简单网格: <template><ag-grid-vuestyle"height: 300px; width: 1000px"class"ag-theme-balham":colum…