Spring Boot项目部署到Docker的流程及一些容易踩的坑

  • 前期准备
  • 准备Spring Boot项目
    • 编写简单的控制类,方便测试
    • 编写日志打印相关
    • 测试项目是否能正常工作
  • 准备部署到docker环境
    • 打包项目

前期准备

Docker是基于Linux内核工作的,虽然在windows上有相应的可视化界面,但是本质上依旧是在windows上开启了一个虚拟机并在其中运行,所以本文采取在Ubuntu虚拟机中运行Docker的角度来进行解释。
因此在开始之前,需要准备一个Ubuntu虚拟机,并在其中安装好docer,java环境,maven环境等,在本文不是重点,就不过多赘述了

准备Spring Boot项目

编写简单的控制类,方便测试

首先创建一个spring boot项目,引入Spring Web相关的依赖
另外为了方便测试,我使用了Log4J2服务将日志输出到外部的文件
同时引入lombok简化类的处理,总体的依赖如下:

<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.17.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency></dependencies>

先别急着复制!!!我知道你很急,但是你先别急。
这里要说几个很大的坑,因为你引入了Spring Web依赖,他会自动的将logback的包给你引入,但是如果你引用了这个依赖,日志就不能正常的输出到外部的文件。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency>

你可以注意到,这个exclusions就是将logback包排除,因此各位引入依赖的时候一定要特别注意,最好能将maven工程reload一下

然后我编写了一个非常简单的控制类:

@Slf4j
@RestController
public class TestController {@GetMapping("/docker")public String test() {log.info("this is info log");log.warn("this is warn log");log.error("this is error log");return "Docker Deployed";}}

然后设置端口号,在application.propertities中编写

server.port=9999

编写日志打印相关

导入上文提到的依赖之后,其中就包含了日志打印相关的包
需要在resources目录下新建一个名为log4j2.xml的文件
内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration monitorInterval="5"><!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--变量配置--><Properties><!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符--><!-- %logger{36} 表示 Logger 名字最长36个字符 --><property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36}  - %msg%n" /><!-- 定义日志存储的路径,不要配置相对路径 --><property name="FILE_PATH" value="/home/tplinkdev/桌面/logs" /><!--项目名称--><property name="FILE_NAME" value="spring-boot-docker-test" /></Properties><appenders><console name="Console" target="SYSTEM_OUT"><!--输出日志的格式--><PatternLayout pattern="${LOG_PATTERN}"/><!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/></console><!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用--><File name="Filelog" fileName="${FILE_PATH}/test.log" append="false"><PatternLayout pattern="${LOG_PATTERN}"/></File><!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,默认是1 hour--><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="10MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile><!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,默认是1 hour--><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="10MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile><!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,默认是1 hour--><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="10MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile></appenders><!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。--><!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效--><loggers><!--过滤掉spring和mybatis的一些无用的DEBUG信息--><logger name="org.mybatis" level="info" additivity="false"><AppenderRef ref="Console"/></logger><!--监控系统信息--><!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。--><Logger name="org.springframework" level="info" additivity="false"><AppenderRef ref="Console"/></Logger><root level="info"><appender-ref ref="Console"/><appender-ref ref="Filelog"/><appender-ref ref="RollingFileInfo"/><appender-ref ref="RollingFileWarn"/><appender-ref ref="RollingFileError"/></root></loggers>
</configuration>

这里又要注意了!!!!

这个文件复制粘贴之后需要修改这两条的value,一个是logs文件夹存放的路径,这个路径一定一定要是可以编辑的。也就是说你自己进到这个文件目录下,右键可以创建新的文件夹,不然日志文件将不能正常输出!
第二个value是自己的项目名称,不要打错字

测试项目是否能正常工作

启动项目,进入浏览器输入localhost:9999/docker,进入如下页面:

查看日志文件:

成功生成,根据自己编写的内容查看输出结果对不对即可

准备部署到docker环境

首先在pom文件当中引入docker插件

<!-- Docker maven plugin --><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.0.0</version><configuration><imageName>${docker.image.prefix}/${project.artifactId}</imageName><dockerDirectory>src/main/docker</dockerDirectory><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin><!-- Docker maven plugin -->

然后在properties标签内部在添加一条

<properties><java.version>1.8</java.version><docker.image.prefix>spring-boot-docker-test</docker.image.prefix></properties>

在这里又要注意了!!!!
docker.image.prefix内部的名字全小写,不能出现大写字母
检查自己的pom文件内的artifactId标签和version标签,例如:

<artifactId>spring-boot-docker-test</artifactId><version>0.0.1-SNAPSHOT</version>

其中artifactId标签内的内容要全小写
根据版本号,生成的jar包理应是:spring-boot-docker-test-0.0.1-SNAPSHOT.jar
这个包名要记住,接着往下看

在main目录下新建一个目录——docker
其中添加一个文件Dockerfile,注意没有任何后缀
内容如下:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD spring-boot-docker-test-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

第一行选择自己的jdk版本号
第二行可以不用管
第三行ADD后的第一个jar包名要和上文说的jar包名称相同,这个很重要!
第四行保留,不用管即可

打包项目

然后就可以开始打包,进入项目根目录,执行docker images
查看当前docker镜像当中是否有jdk,如果没有,执行命令,

docker pull java:8

再次执行docker images即可

随后执行命令 mvn package,看是否能正常打包
上述操作最好进入管理员模式下进行

打包后执行命令,mvn package docker:build 即可开始构建镜像
第一次构建可能会很慢

构建完成之后,即可通过docker image查看自己的镜像

然后执行命令

docker run -p 8080:8080 -d 6bf

-p后面的端口号表示,将容器的xxxx端口映射到虚拟机的xxxx端口
-d表示在后台运行,-t表示实时运行
最后的数字代表image id,输入前几位能唯一区分一个镜像就可以了

完成后运行,打开浏览器查看即可:

以上就是全部内容!

Spring Boot项目部署到Docker的流程及一些容易踩的坑相关推荐

  1. 用idea插件将一个spring boot项目部署到docker容器里运行

    修改docker配置文件 1.编辑docker.service脚本 /usr/lib/systemd/system/docker.service 2.在docker.service中加入脚本并保存退出 ...

  2. 多个Spring Boot项目部署在一个Tomcat容器无法启动

    Tomxin7 Simple, Interesting | 简单,有趣 本文将花费您五分钟时间 业务介绍 最近用Spring Boot开发了一个翻译的小项目,但是服务器上还跑着其他项目,包括一个同样用 ...

  3. 【java】四步法:spring boot项目部署在CentOS 8(后端篇)

    四步法:spring boot项目部署在CentOS 8(后端篇) 一.使用IDEA打包项目为jar包(构建) 1. IDEA版本 2. maven版本 3. pom.xml 设置 4. 构建jar包 ...

  4. java servlet 部署到tomcat_如何把spring boot项目部署到tomcat容器中

    把spring-boot项目按照平常的web项目一样发布到tomcat容器下 一.修改打包形式 在pom.xml里设置 war 二.移除嵌入式tomcat插件 在pom.xml里找到spring-bo ...

  5. Spring Boot项目部署服务器 本地正常 远程无法访问问题排错

    Spring boot项目部署linux 服务器本地正常 远程无法访问 问题描述 排错 原因 最后 最近买个云主机学大佬部署项目..然后直接炸裂了... 问题描述 本地保证代码没问题的情况下( jav ...

  6. 腾讯云服务器 - 将 Spring Boot 项目部署到云服务器上(保姆级教程)

    目录 前言 1.在云服务器上安装 jdk 2.在云服务器上安装 mysql 2.1.安装 mysql 2.2.启动 mysql 服务 2.3.验证 3.将 Spring Boot 项目打包成 jar ...

  7. spring boot项目 部署 使用Procrun 注册为windows服务。

    1.下载Procrun 下载链接:https://downloads.apache.org/commons/daemon/binaries/windows/ 2.新建部署目录workSpace 3.添 ...

  8. 【Linux部署】Spring Boot 项目部署在Linux环境下的Docker容器内举例【任务调度系统 xxl-job 任务调度中心】(手动版)

    1.将SpringBoot项目打jar包 这里打包的是xxl-job任务调度系统的调度器. 2.编写Dockerfile FROM java:8 VOLUME /tmp ADD xxl-job-adm ...

  9. Docker——IDEA部署Spring Boot项目到远程Docker解决方案

    环境配置 IntelliJ IDEA 2021.3 CentOS 7 Docker 20.10.3 解决方案 安装Docker 官方文档:https://docs.docker.com/engine/ ...

最新文章

  1. 38页PPT深度解析:半导体设备产业链全景图
  2. Spring Security OAuth2——自定义OAuth2第三方登录(Gitee)
  3. Today is my birthday
  4. 【BZOJ1857】【SCOI2010】传送带 [三分]
  5. 利用winrar自动备份重要资料
  6. binwalk 提取bootimg_boot.img格式文件结构解析
  7. iQOO骑士黑版本四月亮相:搭载骁龙855+12G运存
  8. jsp中能循环div吗_中药面膜安全靠谱吗?
  9. JavaScript浏览器对象模型常用事件(2)
  10. ios sinaweibo 客户端(二)
  11. java mongodb geo,通过GeoServer在MongoDB中提供地理空间数据
  12. 阿里 离线数据同步工具 DataX 初试
  13. 色彩可视化 | 30DayMapChallenge
  14. 如何在win10电脑上录音
  15. springboot工程中限流方式
  16. 【网络hcip】ospf学习 总结
  17. Cuda: Handle Conflicting Installation Methods
  18. 找回生命本源的力量,走上生命觉醒的旅程
  19. CDN有用吗?我的网站到底需不需要CDN加速?
  20. RTOS系统 音频player对比分析

热门文章

  1. 突然发现哥就是一个传奇
  2. 纯CSS实现的非常酷的卡通肖像和眨眼动效
  3. 第八章 Android 原生程序开发与逆向分析(三)(原生程序文件格式)
  4. a标签的字体颜色继承问题
  5. chickens come home to roost恶有恶报
  6. swiftly语言学习2
  7. 【问题解决】..JasperException: ..ClassNotFoundException: WEB_002dINF.jsp.xxx_jsp
  8. .net6下 OpenCvSharp4的Demon
  9. 教师高级职称中职称计算机,年龄达到45周岁的教师评高级职称需要考计算机吗...
  10. otnm2000启动mysql服务_烽火OTN设备开通初始化指导手册.pdf