2019年,我用打包好的jar包,拖到服务器上进行部署,那命令我甚至忘了,好像是java -jar。
2020年,我已经忘记哪里学来的docker,还是打包成jar包,拖到服务器上,配合Dockerfile打包成docker部署。
很骚的是,我只记得一个事情,网上抄来的Dockerfile,试了很多个,都不能用,最后好不容易找到一个帖子,还因为换了电脑找不到那个帖子了,只抄了个Dockerfile的内容,然后这个Dockerfile一直用到现在,哈哈。
从去年开始,我尝试过两次换成jenkins自动部署,但是没有一次成功的。
第一次死于我熟悉的springboot,具体的记不太清了。
第二次印象特别深,死于前端的vue项目部署,我周末在家里花了一整天搞jenkins部署vue,尝试无果之后想直接手动部署,但就是手动部署都在隔天的工作日把我搞到了凌晨1点才弄完,从那次之后我就对npm run有阴影了。
啊,突然想起来我也不是前端,那没事了。
好像部署这类的教程,要找到适合自己的实际情况非常难。
本篇文章先记录下用docker部署springboot的流程,接下来我打算再尝试一遍用jenkins部署,但是这次不急,想好好学学再开始整。
即学即用、现学现卖有个好处,那就是能快速地解决问题,但也有个坏处,就是出了意料之外的问题时,无法快速定位出问题所在。
如果一个月之后,这篇文章没有介绍jenkins部署的流程,那就当我又一次失败了吧,哈哈。
使用docker部署springboot项目
首先在pom.xml下添加这些东西,注意build标签是在project标签下:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
为什么要加呢?
哈哈,因为年代久远,我也忘了,只记得不加好像不能打包成功,而且里面有些不是必须的,但是我也实在想不起来了,保险起见还是全粘过来。
这可能是一篇不太靠谱的教程,但好歹我自己是能跑通的。
接着编写Dockerfile:
# 基于java8
FROM java:8
VOLUME /tmp
# 前面的jar是你打包好的jar包名,后面的jar是放在docker容器里的jar名,可以随意取
ADD demo-0.0.1-SNAPSHOT.jar /app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
按下图步骤生成打包好jar包
Dockerfile无所谓放哪里其实,一般我们放项目里其实只是为了好找,这种部署方式放到服务器上,Dockerfile都会和jar包放同一个目录下:
然后接下来就是无脑的一堆docker命令啦:
# 制作docker镜像
docker build -t [镜像名] .
# 启动docker容器并初始化本地网络
docker run -p 服务器端口号:docker端口号 -d --net=host --name [容器名] [镜像名]
举个栗子就是:
# 制作docker镜像
docker build -t demo .
# 启动docker容器并初始化本地网络
docker run -p 8080:8080 -d --net=host --name demo demo
注意制作docker镜像的时候docker build -t [镜像名] .,镜像名后面是有个空格和一个点的,表示在当前目录下制作。
docker的端口号一般也是不能改的,看你springboot项目里怎么写的,但是服务器端口号你爱怎么改怎么改,配合nginx,可以搞很多个服务。
这里还用了--net=host,让docker容器直接用了宿主机的网络,因为之前发现不这么做好像连不到服务器上同样放在docker的MySQL。
现在想来或许可以直接在springboot项目的配置里把MySQL的链接写成公网的ip,这样的话就可以去掉--net=host了。
不过我也没试过,因为让docker容器直接用宿主机的网络,我用了这么久也没出什么问题,或者你可以自己试试。
假如你不是第一次部署这个项目,那么可能把之前的项目删了会让你更爽一点:
# 停止docker容器
docker stop [容器名]
# 删除docker容器
docker rm -f [容器名]
# 删除docker镜像
docker rmi [镜像id]
# 制作docker镜像
docker build -t [镜像名] .
# 启动docker容器并初始化本地网络
docker run -p 服务器端口号:docker端口号 -d --net=host --name [容器名] [镜像名]
如果没什么问题,到这里就部署好了。
只是我觉得这种方法真的有点太难受,特别是在公司用jenkins,我自己就用这种捞的不行的方法,部署自己做着玩的一些项目应该不下百回了。
jenkins的原理基本也是这个流程,不过就是有个钩子能感知到你推代码到git上,然后自己构建docker并启动,对于没部署过的人,这篇文档还是能帮上一点忙的,熟悉了上面的步骤,就算后面用自动部署,也能知晓其原理。
关于用jenkins怎么部署,我也还没走通,把flag立这里了,如果没有后续的话就太丢人了,为了不丢人,我应该会更尽力去搞好这个东西吧,嘿嘿。