将项目部署到服务器上

最近因为毕业设计的项目需要一个远程检查,所以老师让我把毕业设计部署到服务器上,然后让我联系一个买了阿里云服务器的学长,学长的阿里云上已经有 docker 了,所以记录一下将项目用 docker 部署到阿里云上的过程。


目录


ssh 连接

ssh 连接主要使用的是 Xshell 的教育版,官网的下载地址是这个:

Xshell 官网下载地址

教程主要参考的下面这个,由于我的账户密码是学长给的,所以参考的就是后半部分的连接部分:

Xshell 教程

按照教程连接对应的主机时,会要求输入对应的账户名和密码,同时分配账户的人还可以设置各个账户的权限,我发现我这个账户就没有 root 权限。

Xshell 的身份验证

Xshell 的身份验证

neo4j 数据库

neo4j 数据库为了保证兼容性,达到和在自己电脑上一致的运行效果,首先查看自己电脑上 neo4j 的版本信息:

neo4j 版本信息

然后参考这两篇博客部署 neo4j:

docker 安装部署 neo4j

Centos 下 Docker 中运行 neo4j 并配置挂载本地文件

首先使用

docker pull neo4j:[对应版本号]

的命令下载对应的 neo4j 版本:

下载 neo4j 对应版本

然后输入对应的语句配置和启动 neo4j:

配置和启动 neo4j

docker run -d --name container_name \  //-d 表示容器后台运行 --name 指定容器名字
-p 7474:7474 -p 7687:7687 \  //映射容器的端口号到宿主机的端口号
-v /home/neo4j/data:/data \  //把容器内的数据目录挂载到宿主机的对应目录下
-v /home/neo4j/logs:/logs \  //挂载日志目录
-v /home/neo4j/conf:/var/lib/neo4j/conf   //挂载配置目录
-v /home/neo4j/import:/var/lib/neo4j/import \  //挂载数据导入目录
--env NEO4J_AUTH=neo4j/password \  //设定数据库的名字的访问密码
neo4j:version //指定使用的镜像对应版本号

最后通过客户端的浏览器查看访问对应端口验证是否设置成功:

浏览器验证 neo4j


MySQL 数据库

首先还是查看 MySQL 的版本:

MySQL 版本

然后主要参照这个博客部署 MySQL:

在 docker 中运行 mysql 实例

但是这个教程中修改文件位置会报错,原因应该是默认配置文件的位置发生了变化:

Docker 安装 MySQL

之后的过程与下载和配置 noe4j 类似:

下载 MySQL

下载 MySQL

运行 MySQL

运行 MySQL

部署后端

参考了这些博客部署 SpringBoot 的项目:

使用 docker 将 SpringBoot 项目部署到阿里云

首先,需要将 SpringBoot 项目打包:

项目打包

项目打包

打包成功

打包成功

然后需要将打包后的 jar 包发送到服务器上,这时候就需要使用工具发送,我使用的是 Xftp

Xftp 官方下载地址

Xftp 支持图形化界面操作,新建一个传输连接之后,创建对应目录拖动即可

新建文件传输

新建文件传输

xftp 操作

xftp 操作

之后需要使用 vim 编辑一个配置文件:

vim 使用教程

后端配置

后端配置

之后悲催的发现 jdk 11 没有官方的 docker 镜像,为了保证版本兼容,先找一个靠谱的第三方 jdk 11 的镜像:

jdk 镜像

然后需要制作一个 jdk 11 的 docker 镜像,这里参考了这两个博客:

自己制作一个 java:11 的 docker 镜像

docker 基础镜像 ubuntu 添加 jdk 1.8

jdk 镜像配置

jdk 镜像配置

然后使用构建语句:

docker build -t java:11 .

构建镜像(注意后面那个点不要少了,表示在当前路径构建)

构建 jdk 镜像

测试 jdk

测试 jdk

完成之后再次构建后端镜像就成功了:

构建后端镜像

最后运行后端的镜像:

后端运行


后端部署的 bug

当事情显得过于顺利的时候,往往就是坎坷的开始,当以为部署完成的时候,实际上就是开始的 debug 的时候。

总结了一下,部署的时候大致存在以下几个问题:

1.地址的误用

由于当时在开发的时候并没有考虑到部署到服务器的问题,所以有一些需要前后端配合写地址的地方直接把 localhost 和前后端的端口号硬编码到地址中去了,但是后面发现部署到服务器上的时候需要将地址改为服务器的地址。

具体的解决方法就是在代码中引用配置文件的字段,这样子重新配置时只需要修改配置文件即可。

在代码中使用配置文件的字段

在代码中使用配置文件的字段

在配置文件中设置字段

在配置文件中设置字段

2.配置文件中字段的误用

为了解决之前将地址硬编码进入代码的问题,于是将各种变量都写进了配置文件里面,然后由于参考网上教程的将后端端口命名为 serve.port 于是想当然的把地址命名为 serve.address,然后部署之后就没法启动了,tomcat 插件疯狂报错端口被占用,重点是这个错误网上搜索基本找不到一样的问题,于是疯狂被折磨。

之后求助了一下学长,学长研究了很久说这个字段是有含义的,修改了之后问题就解决了。

springboot server.address 配置问题

选择没有特殊含义的名称

选择没有特殊含义的名称

3.后端打包前没有先 clean

还有一个要注意的点就是后端打包时最好先 clean 一下,有一个包怎么也部署不成功,但是 clean 了一下之后重新打包部署就好了,这也是一个好的习惯。

打包之前先clean一下


重新部署

解决了上面的问题我们重新部署一下,前端部署实际上就是打包成静态资源放到后端的 /resources/static 文件夹中,首先打包前端的资源,用:

npm run build

这个命令。

前端项目打包

前端项目打包

然后打开对应前端项目的 dist 文件夹,将其中的所有内容复制到对应后端项目的 /resources/static 文件夹中。

存放前端打包的 dist 文件夹

存放前端打包的 dist 文件夹

存放在后端文件夹中

存放在后端文件夹中

之后 clean 后 package 打包,按照本文第四部分的步骤打包即可。

确认一下 Dockerfile 的内容:

FROM java:11
ADD ./kgbackend-0.0.1-SNAPSHOT.jar /app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Dspring.config.location=/home/application.properties","-jar","/app.jar"]

打包的命令:

docker build -t kg .

运行的命令:

docker run -d -p 8443:8443 -v /home/wy/data:/home --name kg kg

通过

docker  ps -a

查看运行结果。

部署完运行成功

部署完运行成功

本地浏览器访问成功

本地浏览器访问成功