@TOC
前言
一直埋头学一些项目,没有考虑过怎么部署一个项目,一天突发奇想挺想试试部署个springboot,就网上搜了挺多资料的,但是资料太繁杂了,这里自己记录一下部署的过程,避免自己遗忘,也为其他小伙伴做个参考。这里是租的阿里云服务器,然后在本地做了一个非常简单的springboot样例,之后加了点mysql数据库,ok,来看看怎么将本地项目部署到云服务器上。
在云服务器中下载并安装Docker
这里就不细讲了,下Docker挺简单的,自行下就行了,官网什么的都有教程。
用docker --version命令检查是否成功安装Docker。
docker --version
使用Docker安装对应版本的JDK
对应版本是对应你的springboot项目版本,我项目用的是JDK17,所以这里以安装JDK17为例。
Docker安装jdk17参考 https://blog.51cto.com/u_16213457/7698778
我这里创建了一个文件夹名叫my_springboot,新建一个文件叫Dockerfile,没有任何后缀。内容为
FROM ubuntu:latest RUN apt-get update && apt-get install -y openjdk-17-jdk ENV JAVA_HOME /usr/lib/jvm/java-17-openjdk-amd64 ENV PATH $JAVA_HOME/bin:$PATH
上述我们使用最新的Ubuntu镜像作为基础镜像,并在其中安装openjdk-17-jdk。然后,我们设置JAVA_HOME和PATH环境变量以便在镜像中使用Java 17。
完成Dockerfile的编写后,我们可以使用以下命令来构建Docker镜像:
docker build -t java17 .
构建镜像完成后,我们可以使用以下命令来运行一个容器:
docker run -it java17 java -version
目前为止我们就完成用Docker构建了一个JDK17镜像,名叫java17
并且用这个镜像运行了一个具备JDK17运行环境的容器
可以部署简单的springboot项目了
其实如果部署一个没有数据库的springboot项目,到目前为止就够了。真的,一些博客说还要下载安装tomcat镜像,但是我觉得springboot已经内置tomcat那些东西了不是吗,所以我没那样做,结果也是能运行的。
我们先将项目打成jar包,这里可以选择去掉test,直接认为自己写的项目没有问题,给我打包就是
打包成功后tartget目录下会有一个jar包
使用xshell传jar包到云服务器
xshell新建一个会话
名称随便写;协议貌似不是很重要,我用的SFTP也可以;主机是
云服务器的公网ip地址
,端口号默认。然后接下来可能需要你输入云服务器用户名(一般是root,除非你在这个云服务器上创建过多个用户,你可以输入你想连接的用户)和密码(对应用户的密码)。
连接成功后,xshell允许直接拖拽,将jar包拖进去,等一会发现上传成功了。然后使用mv命令,将jar包放进my_springboot目录下,并起个别的名字。
mv xxx.jar my_springboot/dzc.jar
最后一步
在my_springboot目录下,新建一个Dockerfile,之前那个用来下载安装JDK17的Dockerfile可以改个名字了。新的Dockerfile内容如下:
# java17运行环境,我们刚才通过Docker下载安装的,这里就用到了,FROM表示基础环境 FROM java17 # 作者名称 MAINTAINER dzc # 切换工作目录 WORKDIR /my_springboot # 添加rundemo.jar文件到docker环境内 ADD dzc.jar /my_springboot/dzc.jar # 暴露端口8080, EXPOSE 8080 # 运行命令 ENTRYPOINT ["java", "-server", "-Xms512m", "-Xmx512m", "-jar", "/my_springboot/dzc.jar"]
然后在my_springboot目录中执行下面的命令,构建一个镜像,取的名字为dzc,取的版本号为0.0.1
docker build -t dzc:0.0.1 .
最后执行命令,运行镜像,这里通过8081端口映射找到8080,之后可以通过8081这个端口访问了。(注意我们所有用到的端口,最好都要去对应云服务器开放这些端口)
docker run -p 8081:8080 -t dzc:0.0.1
我们可以看到在云服务器中成功运行了我们的项目。
我们的项目代码很简单,就是这样的
@RestController public class test { @Autowired JdbcTemplate jdbcTemplate; @GetMapping("/show") public List<Map<String,Object>> userList() { String sql = "select * from student"; List<Map<String,Object>> list_maps = jdbcTemplate.queryForList(sql); return list_maps; } @GetMapping("/") public String dzc() { return "<h1>I am dengzhichao</h1>"; } }
浏览器地址栏输入:
服务器IP地址:8081
,看一看自己的普通项目有没有成功部署。
我们可以在云服务器使用
docker images
和
docker ps -a
命令,可以看到我们是构建了dzc:0.0.1镜像,并用这个镜像创建了一个容器,而刚才的项目其实就是这个容器。
现在还没有加入mysql,所以目前访问xxxxxxx:8081/show
必定是报500错误。
OK,目前为止就部署了一个非常简单的springboot项目,下面来看一下怎么加入mysql。
如何加入mysql
这一步参考的博客,看mysql那一节就好了:
https://blog.csdn.net/weixin_62404729/article/details/130827802
可以先跟着一开始的方法走,但卡在了进容器那一步,怎么start容器都没用,会显示退出状态,怎么都进不去,也就没法进入mysql命令行,进而修改root远程连接权限。所以又用的这个命令:
docker run -p 3306:3306 -e MYSQL_DATABASE=workdb -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
执行完之后使用
docker images
和
docker ps -a
可以发现:
有了mysql:latest这个镜像,并且运行生成了一个容器。
之后使用下面2个命令:
docker exec -it 7498278db14e bash
mysql -uroot -p123456
我们就进入了mysql的命令行,目的是为了修改root远程连接权限,让本地能够连接并操纵这边的mysql,于是在命令行依次执行以下命令:
Mysql 8.0之前的版本 grant all privileges on *.* to ‘root‘@‘%‘ identified by ‘123456‘ with grant option; grant all privileges on *.* to ‘root‘@‘localhost‘ identified by ‘123456‘ with grant option;
MySql 8.0之后的版本,也是我这边的版本 mysql> alter user root@'%' identified by '123456'; mysql> grant all privileges on *.* to root@'%' with grant option; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; #解决编码问题 #只要该句话运行成功即可 mysql> FLUSH PRIVILEGES; mysql> quit #退出mysql
基于我们在云服务器上安装的mysql用户名、密码等,修改本地的application.yml:
spring: datasource: username: root password: 123456 url: jdbc:mysql://xxxxxx(服务器IP地址):3306/member(我取的一个数据库的名字)?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8 driver-class-name: com.mysql.cj.jdbc.Driver
这时候可以在idea中重新将项目package成jar包,不过记得不要勾选test,因为我们项目并不部署在本地上,所以这个yml文件配置对本地来说是不对的,test会报错,不让你package,所以不勾选test。
当然你也可以在第1次打jar包时就把application.yml写成这样,不过在这里说这个配置为什么这样写,我感觉会更好
使用Navicat连接云服务器mysql
Connection Name随便起一个;Host为是
云服务器的公网ip地址
;Port为3306;User Name为我们云服务器mysql的root;密码为我们云服务器mysql设置的密码123456。
连接成功后,创建一个database名为member,有一个表叫student,里面添加上2条数据。如下图:
验证是否成功
OK,一般来说连接成功就大功告成了。
①如果你第1次打包时你的application.yml就跟刚才配置的一样,此时只需再次运行项目就行
docker run -p 8081:8080 -t dzc:0.0.1
②否则的话,因为mysql已经OK了,只需跟第1次一样部署一个简单的springboot项目相同,不过最好将第2次的jar包取个别的名字,我这里是dzc2.jar
mv xxx.jar my_springboot/dzc2.jar
别忘了Dockerfile相应更改
# java17运行环境,我们刚才通过Docker下载安装的,这里就用到了,FROM表示基础环境 FROM java17 # 作者名称 MAINTAINER dzc # 切换工作目录 WORKDIR /my_springboot # 添加rundemo.jar文件到docker环境内 ADD dzc2.jar /my_springboot/dzc2.jar # 暴露端口8080, EXPOSE 8080 # 运行命令 ENTRYPOINT ["java", "-server", "-Xms512m", "-Xmx512m", "-jar", "/my_springboot/dzc2.jar"]
然后在my_springboot目录中执行下面的命令,构建一个镜像,取的名字为dzc2,取的版本号为0.0.1
docker build -t dzc2:0.0.1 .
最后执行命令,运行镜像,这里通过8081端口映射找到8080,之后可以通过8081这个端口访问了。(注意我们所有用到的端口,最好都要去对应云服务器开放这些端口)
docker run -p 8081:8080 -t dzc2:0.0.1
浏览器输入xxxx:8081/show
OK,成功显示了数据库中的内容。
后话
这次其实就是稍微记录一下,免得自己哪天忘了,能过来回忆回忆。
还有就是目前只是简单的部署,现在项目一般是前后端分离,比如前端用的Vue,那之后怎么部署Vue不知什么时候有时间再试试了,嗯就先这样吧。
Follow me on twitter for more awesome stuff like this @transitive_bs
