Docker部署springBoot项目
今天我们分享一个小知识点——docker部署springboot项目,之所以说它是个小知识点,是因为内容不多,而且也很简单,内容主要包含两个方面,一个是基于docker构建springboot项目的镜像,一个就是用docker启动我们的springboot项目镜像。
编写Dockerfile文件
首先,我们要编写这样一份Dockfile,文件名就就是Dockerfile,没有后缀名,这个文件在项目的根目录下,可以先看我的项目结构:

然后在Dockerfile中写入如下内容,项目不同,配置有所不同,可根据自己的需要进行修改:
# Docker image for springboot file run
# VERSION 0.0.1
# Author: eangulee
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER syske <715448004@qq.com>
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp 
# 将jar包添加到容器中并更名为springboot-learning.jar
ADD target/springboot-learning-0.0.1-SNAPSHOT.jar /springboot-learning.jar 
# 运行jar包
RUN bash -c 'touch /springboot-learning.jar'
ENV TZ 'Asia/Shanghai'
EXPOSE 8089
ENTRYPOINT ["java","-jar","/springboot-learning.jar"]
这里简单介绍下这个文件的结构。
FROM的作用是指定项目的运行环境,这里我们指定的是java8;
VOLUME 指定了临时文件目录为/tmp。其效果是在主机 /var/lib/docker目录下创建了一个临时文件,并链接到容器的/tmp。该步骤是可选的,如果涉及到文件系统的应用就很有必要了。
/tmp目录用来持久化到 Docker 数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录
项目的 jar 文件作为 springboot-learning.jar添加到容器的ENTRYPOINT 执行项目 springboot-learning.jar。为了缩短 Tomcat启动时间,添加一个系统属性指向 /dev/./urandom作为 Entropy Source。
ADD就是将我们编译的jar文件添加到容器中,这里可以知道加入容器的文件名;
RUN bash -c就是运行shell命令;
ENV作用是这是环境变量,这里设置的是时区;
EXPOSE的作用是指定容器运行端口;
ENTRYPOINT的作用是指定容器运行命令,指定之后,容器运行的时候就会执行我们指定的命令;
关于Dockerfile编写,可以参考菜鸟教程:
https://www.runoob.com/docker/docker-dockerfile.html
项目打包
在编写Dockerfile的时候,我们指定了jar文件的名字,所以在运行Dockerfil之前,我们要先打包好项目的jar文件,确保Dockerfile中指定的jar文件已经编译好:

打包完成后,我们就可以制作我们的springboot项目的镜像了。
制作镜像
首先确保本地docker已经启动,然后在项目根目录,即Dockerfile所在目录

执行如下命令:
docker build -t springboot-learning:v1 .
	-t 参数是指定此镜像的tag名,一般通常就是项目名:版本号。注意最后面的.,不要忘记了。
如果有如下提示,则表面springboot项目的镜像构建完成,如果你是第一次构建,要拉取java8的镜像,所以时间可能会比较长:

然后我们可以通过下面的命令查看本地镜像:
docker images
其中就有我们刚刚构建完成的镜像:

启动springboot镜像
启动我们构建的镜像与启动其他镜像没有本质区别,只是我们在指定端口的时候,容器的端口就是我们前面构建时指定的端口:
docker run --rm --name springboot-learning -p 8089:8089 springboot-learning:v1
另外这里的镜像版本号,也要和构建文件保持一致。回车之后,你就会看到熟悉的springboot启动日志信息:

这里我为了方便查看,没有加-d(后台运行),所以你ctrl+c后,容器会自动停止,一般我们线上运行都是后台运行的。
测试
我的项目中有测试的controller,我们浏览器访问下看看:


和我们直接在本地java -jar启动一样,没有任何区别。
最后,简单总结下,最近一段时间,我们分享了很多云生态相关的知识,包括dokcer、k8s等比较主流的技术,让包括我在内的各位小伙伴对java云生态有了一些初步的认识和了解。
然后再加上我们今天分享的springboot项目镜像构建,现在这一连串的技术已经差不多全都被我们串起来了,可以这样说,如果这些知识你自己都有动手做过,都有实践过,那你对目前主流的云生态应该已经有了最基本的认知,至少在使用和应用方面没有太多的问题。后面我们再分享下kuboard的用法,我们的springboot项目就可以运行在k8s中了,然后剩下的更细节的知识点就靠各位小伙伴自己去探索学习了。好了,今天的内容就到这里了。
