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

云服务器-Docker容器-系统搭建部署

一、引言

        最近公司在海外上云服务器,作者自己也搞了云服务器去搭建部署系统,方便了解整体架构和系统的生命周期,排查解决问题可以从原理侧进行分析实验。虽然用的云不是同一个,但是原理都是相通的。

二、选型

        作者选用的是腾讯云,没别的原因,就是便宜加牌子大。

        阿里云肯定是更好一些的,不管是服务售后还是服务器内核和操作系统都是比较活跃的,毕竟作者以前公司用的就是阿里云,了解一些。

        不过以前都是和运维沟通排查问题,作者自己只能看到一些服务器监控和运维的截图,这对于了解整个云服务架构体系的生命流程是不太友好的。

        操作系统选择了CentOS7.6-Docker20,毕竟linux的底层是必须的,目前的容器环境也是服务的基础。

        基本参数如下,没必要太好

  • CPU - 2核 内存 - 4GB
  • 系统盘 - SSD云硬盘 60GB管理快照
  • 流量包 - 500GB/月(带宽:5Mbps)

三、系统搭建部署

        作者准备把springboot用Maven打包,jar包拿到docker容器运行

3.1、后端

        后端是SpringBoot,SSM框架,代码就不贴了,作者写了个小程序给家里人用的。

3.2、打包

        这一步很麻烦,打出来的包很小,作者当时还没意识到问题,本地java -jar运行一下,报错了。显示no main manifest attribute, in /**.jar,问了一下chatGpt,这就很扯,做了这么久的SpringBoot,他里面的application怎么可能不是字段设置为主类的呢。

17ce6df27b104a96b5382aafb3c999ce.png

        作者有找了网上的一些文章,有的说是打包的时候没有设置入口类,pom的build重新设置一下。

<build><plugins><!-- maven-compiler-plugin 插件配置 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><!-- maven-jar-plugin 插件配置 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version><configuration><archive><manifest><addClasspath>true</addClasspath><mainClass>**.Application</mainClass></manifest></archive></configuration></plugin><!-- 其他插件... --></plugins></build>

        然后出现了新的错误:Caused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)

        跟chatgpt拉扯了许久,还是没找到正确的pom,又找了朋友看以前做的项目,其实很简单的po,完全依赖spring自动打包发现

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

        打包之后有60几M大小,之前只有几百k,所以很明显了,再次本地运行java -jar,显示成功,通过Localhost也可以访问里面的接口

d1d0931761fe47d880c8ebe02fd1de4f.png

 3.3 部署

        部署系统jar之前,需要先把数据库部署好,不然根本运行不起来。

1、部署mysql

        这里安装的的是mysql5.7,习惯了这个版本

        下载MySQL 5.7的Docker镜像:docker pull mysql:5.7
        下载完成后,可以运行以下命令来创建并运行MySQL容器:docker run --name mysql -e MYSQL_ROOT_PASSWORD=<password> -p 3306:3306 -d mysql:5.7
        创建一个名为`mysql`的容器,并将MySQL的默认端口3306映射到主机的3306端口。将`<password>`替换密码。
        检查MySQL容器是否正在运行:docker ps -a
        如果看到`mysql`容器正在运行,说明MySQL已经成功安装并运行在Docker中。

        如果MySQL容器未运行,启动它:docker start mysql

        登录到MySQL:docker exec -it mysql mysql -u root -p

        检查MySQL服务器的运行状态:service mysql status
        启动它:service mysql start

        作者在这中间还走了一些弯路,一开始不想设置用户名密码,结果导致他自动生成了一串,作者还不知道密码是什么,又进去修改密码,最后还生成了两个root账号,一个权限是*一个是localhost,导致后面jar运行出了问题。

2、部署服务

        腾讯云界面上有个SFTP的文件可视化,作者一开始不知道,还准备搞市面上的一些文件传输软件,毕竟jar包需要传输到远程服务器。

        首先要创建一个Dockerfile,这个文件没有后缀的,在服务器窗口建好文件夹之后

        输入:vi Dockerfile

        从vi界面搭建i编辑,自动创建文件,写完内容之后点击esc退出编辑状态,再点击:wq退出文件并且保存。

        Dockerfile里面内容:

# 基础镜像使用java
FROM openjdk:8-jdk-alpine
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
ADD test-provider-service-0.0.1.jar /test-provider-service.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/test-provider-service.jar"]

1. `FROM openjdk:8-jdk-alpine`:指定使用OpenJDK 8的Alpine Linux作为基础镜像。

2. `VOLUME /tmp`:指定将主机的`/var/lib/docker`目录与容器的`/tmp`目录进行挂载,用作临时文件目录。

3. `ADD test-provider-service-0.0.1.jar /test-provider-service.jar`:将当前目录下的`test-provider-service-0.0.1.jar`文件复制到容器的根目录,并将其重命名为`test-provider-service.jar`。

4. `ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/test-provider-service.jar"]`:指定容器启动时要执行的命令。这里是运行Java应用程序的命令,使用`java`命令执行`test-provider-service.jar`文件。

        然后把jar传入服务器,jar要和Dockerfile在一个文件夹里面。

        创建docker镜像:docker build -t ** .

        这个.是指使用当前文件夹,所以要先cd到jar所在的文件夹,**就是指容器的名字。

        运行容器:docker run -d -p 5006:5006**

        用的是宿主机5006端口,容器的5006也是作者springboot用的端口,默认springboot是用8080的,这个要在配置文件设一下

3、问题排查解决

3.1、root拒绝

        docker ps -a看一下容器状态,诶嘿,退出来了exit,说明jar有问题,但是docker logs ** 有看不到日志,那就加个日志打印。

public class Application {public static void main(String[] args) {try{SpringApplication.run(Application.class, args);} catch (Throwable t) {System.out.println(t);throw t;}}
}

       先得把之前的容器和镜像删除,然后重新生成,删除容器需要用容器id或者名称,在docker ps -a中可以看到:docker rm **

        删除镜像:docker rmi **        

        爆出来的是:access denied for user 'root'@'ip' (using password: YES)  

        一开始还以为是配置错了账号密码,在本地又跑了一下,但是很明显没有问题,

        看了一下mysql,在MySQL的user表中,每个用户都有一个唯一的组合键,由用户名(User)和主机名(Host)组成。这意味着即使用户名相同,只要主机名不同,就会被视为不同的用户。我猜测的是root这个%会拦截所有的root访问,因为在本地用workBench去链接显示的也是拒绝。但是%的root不是我设置的密码,所以得加一个新的用户密码。

root | localhost
root | %

        创建一个具有相同权限的新用户,但允许从任何主机访问MySQL服务器:

        CREATE USER 'new_user'@'%' IDENTIFIED BY 'password';GRANT ALL PRIVILEGES ON *.* TO 'new_user'@'%' WITH GRANT OPTION;

3.2、链接mysql失败

        再次运行镜像爆出了不一样的错误:

Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [com/alibaba/druid/spring/boot/autoconfigure/DruidDataSourceAutoConfigure.class]: Invocation of init method failed; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

        很明显是mysql的链接问题,但是为什么会出现这种问题,问一下chatgot

6883d3fd87fc499e849f7e84baf011e6.png

         说的很官方,没有什么实际作用,但是原理是相同的,要么是驱动程序问题,要么是网络问题,如果是驱动程序应该不可能出现本地运行成功,服务器失败。

        那么就要思考服务器的docker容器和本地运行到底有什么区别,作者想到的是mysql和服务jar运行在两个容器当中,本地访问服务器的mysql是通过公网ip,那么在服务器jar里面的配置是使用127.0.0.1(localhost)去链接mysql,那么是不是不能直接使用localhost去链接。

        因为云服务器的容器不一定在同一个宿主机上面,即使在同一个宿主机,分配端口维度也可能是容器,这个就看每个云厂商怎么设置的规则了。

        带着这样的猜测,作者把配置文件改为使用内网ip,结果成功了。

b9a4c6e1f75844a7a9a5602ec06bde93.png

 

 四、总结

        通过自己安装部署云服务器上的系统,作者对于整个系统架构有了更多了解,实践出真知,对于技术工具实验和底层原理排查都有帮助。

 

 

相关文章:

云服务器-Docker容器-系统搭建部署

一、引言 最近公司在海外上云服务器&#xff0c;作者自己也搞了云服务器去搭建部署系统&#xff0c;方便了解整体架构和系统的生命周期&#xff0c;排查解决问题可以从原理侧进行分析实验。虽然用的云不是同一个&#xff0c;但是原理都是相通的。 二、选型 作者选用的是腾讯云…...

ES 索引重命名--Reindex(一)

ES reindex脚本流程&#xff0c;下图为整体流程&#xff1a; 步骤&#xff08;1&#xff09;&#xff1a;每次写入把之前的索引删除再重新创建索引&#xff0c;然后判断索引是否创建成功&#xff0c;由于创建成功返回结果是json&#xff0c;因此用Json Input插件去解析json获得…...

Spring之bean的生命周期

目录 1.Bean的初始化过程 1.1代码详解 1.2思考 2.Bean的单例与多例选择 2.1论证单例与多例优缺点 2.2论证初始化时间点 2.3个例演示 Spring Bean的生命周期&#xff1a; 一、通过XML、Java annotation&#xff08;注解&#xff09;以及Java Configuration(配置类),等方式…...

策略梯度方法

策略梯度方法 数学背景 给定一个标量函数 J ( θ ) J\left(\theta\right) J(θ)&#xff0c;利用梯度上升法&#xff0c;使其最大化&#xff0c;此时的 π θ \pi_\theta πθ​就是最优策略。 θ t 1 θ t α ∇ θ J ( θ t ) \theta_{t1}\theta_t\alpha \nabla_\theta…...

博客系统之单元测试

对博客系统进行单元测试 1、测试查找已存在的用户 测试名称 selectByUsernameTest01 测试源码 //查找用户&#xff0c;存在 Test public void selectByUsernameTest01 () { UserDao userDao new UserDao(); String ret1 userDao.selectByUsername("张三").toStr…...

【ARM v8】如何在ARM上实现x86的rdtsc()函数

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…...

redis--事务

redis事务 在Redis中&#xff0c;事务是一组原子性操作的集合&#xff0c;它们被一起执行&#xff0c;要么全部执行成功&#xff0c;要么全部回滚。虽然Redis的事务并不遵循传统数据库的ACID特性&#xff0c;但它仍然提供了一种将多个命令打包成一组执行的机制&#xff0c;适用…...

111. 二叉树的最小深度

111. 二叉树的最小深度 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeN…...

SpringMVC归纳与总结

前言 Spring的核心是IOC&#xff0c;一种依赖反转的解耦思想。MVC是一种处理Web请求的架构模式&#xff0c;当两者的作用结合&#xff0c;就形成了SpringMVC。 组成及运行原理 1. 两次映射 2. 为什么用适配器模式 过滤器与拦截器 1. 范围 静态资源与动态资源2. 生命周期…...

Python学习笔记_进阶篇(三)_django知识(二)

本章内容 Django model Model 基础配置 django默认支持sqlite&#xff0c;mysql, oracle,postgresql数据库。 <1> sqlite django默认使用sqlite的数据库&#xff0c;默认自带sqlite的数据库驱动 引擎名称&#xff1a;django.db.backends.sqlite3 <2>mysql …...

RISC-V 整型通用寄存器介绍

简介 RISC-V64位/32位提供了32个整型通用寄存器&#xff0c;编号是x0~x31&#xff0c;这些整型通用寄存器的宽度与架构位数一致。 浮点数寄存器与整形寄存器一样也提供了32个&#xff1a;f0~f31&#xff0c;位数与架构位数一致。 通用寄存器介绍 零寄存器 x0/zero x0寄存…...

学习Vue:【性能优化】异步组件和懒加载

在Vue.js应用开发中&#xff0c;性能优化是一个至关重要的主题&#xff0c;而异步组件和懒加载是提升性能的有效方法之一。本文将介绍什么是异步组件和懒加载&#xff0c;以及如何在Vue.js中应用这些技术来提升应用性能。 异步组件和懒加载 异步组件 异步组件是指在需要的时候…...

pdf格式文件下载不预览,云存储的跨域解决

需求背景 后端接口中返回的是pdf文件路径比如&#xff1a; pdf文件路径 &#xff08;https://wangzhendongsky.oss-cn-beijing.aliyuncs.com/wzd-test.pdf&#xff09; 前端适配是这样的 <ahref"https://wangzhendongsky.oss-cn-beijing.aliyuncs.com/wzd-test.pdf&…...

httplib + nlohmann::json上传数据时中文乱码解决

1、nlohmann::json 1.1 编码格式使用UTF-8 参考 nlohmann::json 中文乱码解决方案 &#xff08;1&#xff09;将数据先转为UTF-8格式 2、httplib 2.1 上传数据前 &#xff08;1&#xff09;调用httplib::Response对象的set_header()方法来设置编码格式 httplib::Response res…...

JavaScript中的设计模式之一--单例模式和模块

虽然有一种疯狂天才的感觉可能很诱人&#xff0c;但重新发明轮子通常不是设计软件的最佳方法。很有可能有人已经遇到了和你一样的问题&#xff0c;并以一种聪明的方式解决了它。这样的最佳实践在形式化后被称为设计模式。今天我们来看看它们的概念&#xff0c;并检查单例模式和…...

回归预测 | MATLAB实现GAM广义加性模型多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GAM广义加性模型多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GAM广义加性模型多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本…...

css学习4(背景)

1、CSS中&#xff0c;颜色值通常以以下方式定义: 十六进制 - 如&#xff1a;"#ff0000"RGB - 如&#xff1a;"rgb(255,0,0)"颜色名称 - 如&#xff1a;"red" 2、background-image 属性描述了元素的背景图像. 默认情况下&#xff0c;背景图像进…...

二、SQL,如何实现表的创建和查询

1、新建表格&#xff08;在当前数据库中新建一个表格&#xff09;&#xff1a; &#xff08;1&#xff09;基础语法&#xff1a; create table [表名]( [字段:列标签] [该列数据类型] comment [字段注释], [字段:列标签] [该列数据类型] comment [字段注释], ……&#xff0c…...

大数据及软件教学与实验专业实训室建设方案

一 、系统概述 大数据及软件教学与实验大数据及软件教学与实验在现代教育中扮演重要角色&#xff0c;这方面的教学内容涵盖了大数据处理、数据分析、数据可视化和大数据应用等多个方面。以下是大数据及软件教学与实验的一般内容&#xff1a;1. 数据基础知识&#xff1a;教授学生…...

信创办公–基于WPS的EXCEL最佳实践系列 (公式和函数)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;公式和函数&#xff09; 目录 应用背景相关知识操作步骤1、认识基本的初级函数2、相对引用&#xff0c;绝对引用&#xff0c;混合引用3、统计函数4、文本函数 应用背景 熟练掌握Excel的函数工具能让我们在日常的使用中更加方…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...