云服务器-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怎么可能不是字段设置为主类的呢。
作者有找了网上的一些文章,有的说是打包的时候没有设置入口类,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也可以访问里面的接口
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
说的很官方,没有什么实际作用,但是原理是相同的,要么是驱动程序问题,要么是网络问题,如果是驱动程序应该不可能出现本地运行成功,服务器失败。
那么就要思考服务器的docker容器和本地运行到底有什么区别,作者想到的是mysql和服务jar运行在两个容器当中,本地访问服务器的mysql是通过公网ip,那么在服务器jar里面的配置是使用127.0.0.1(localhost)去链接mysql,那么是不是不能直接使用localhost去链接。
因为云服务器的容器不一定在同一个宿主机上面,即使在同一个宿主机,分配端口维度也可能是容器,这个就看每个云厂商怎么设置的规则了。
带着这样的猜测,作者把配置文件改为使用内网ip,结果成功了。
四、总结
通过自己安装部署云服务器上的系统,作者对于整个系统架构有了更多了解,实践出真知,对于技术工具实验和底层原理排查都有帮助。
相关文章:

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

ES 索引重命名--Reindex(一)
ES reindex脚本流程,下图为整体流程: 步骤(1):每次写入把之前的索引删除再重新创建索引,然后判断索引是否创建成功,由于创建成功返回结果是json,因此用Json Input插件去解析json获得…...

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

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

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

【ARM v8】如何在ARM上实现x86的rdtsc()函数
博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…...
redis--事务
redis事务 在Redis中,事务是一组原子性操作的集合,它们被一起执行,要么全部执行成功,要么全部回滚。虽然Redis的事务并不遵循传统数据库的ACID特性,但它仍然提供了一种将多个命令打包成一组执行的机制,适用…...
111. 二叉树的最小深度
111. 二叉树的最小深度 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeN…...
SpringMVC归纳与总结
前言 Spring的核心是IOC,一种依赖反转的解耦思想。MVC是一种处理Web请求的架构模式,当两者的作用结合,就形成了SpringMVC。 组成及运行原理 1. 两次映射 2. 为什么用适配器模式 过滤器与拦截器 1. 范围 静态资源与动态资源2. 生命周期…...
Python学习笔记_进阶篇(三)_django知识(二)
本章内容 Django model Model 基础配置 django默认支持sqlite,mysql, oracle,postgresql数据库。 <1> sqlite django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 引擎名称:django.db.backends.sqlite3 <2>mysql …...
RISC-V 整型通用寄存器介绍
简介 RISC-V64位/32位提供了32个整型通用寄存器,编号是x0~x31,这些整型通用寄存器的宽度与架构位数一致。 浮点数寄存器与整形寄存器一样也提供了32个:f0~f31,位数与架构位数一致。 通用寄存器介绍 零寄存器 x0/zero x0寄存…...
学习Vue:【性能优化】异步组件和懒加载
在Vue.js应用开发中,性能优化是一个至关重要的主题,而异步组件和懒加载是提升性能的有效方法之一。本文将介绍什么是异步组件和懒加载,以及如何在Vue.js中应用这些技术来提升应用性能。 异步组件和懒加载 异步组件 异步组件是指在需要的时候…...

pdf格式文件下载不预览,云存储的跨域解决
需求背景 后端接口中返回的是pdf文件路径比如: pdf文件路径 (https://wangzhendongsky.oss-cn-beijing.aliyuncs.com/wzd-test.pdf) 前端适配是这样的 <ahref"https://wangzhendongsky.oss-cn-beijing.aliyuncs.com/wzd-test.pdf&…...
httplib + nlohmann::json上传数据时中文乱码解决
1、nlohmann::json 1.1 编码格式使用UTF-8 参考 nlohmann::json 中文乱码解决方案 (1)将数据先转为UTF-8格式 2、httplib 2.1 上传数据前 (1)调用httplib::Response对象的set_header()方法来设置编码格式 httplib::Response res…...
JavaScript中的设计模式之一--单例模式和模块
虽然有一种疯狂天才的感觉可能很诱人,但重新发明轮子通常不是设计软件的最佳方法。很有可能有人已经遇到了和你一样的问题,并以一种聪明的方式解决了它。这样的最佳实践在形式化后被称为设计模式。今天我们来看看它们的概念,并检查单例模式和…...

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

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

二、SQL,如何实现表的创建和查询
1、新建表格(在当前数据库中新建一个表格): (1)基础语法: create table [表名]( [字段:列标签] [该列数据类型] comment [字段注释], [字段:列标签] [该列数据类型] comment [字段注释], ……,…...

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

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

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...

uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...