Spring Boot打包瘦身 Docker 使用全过程 动态配置、日志记录配置
springBoot打包的时候代码和jar包打包在同一个jar包里面,会导致jar包非常庞大,在不能连接内网的时候调试代码,每次只改动了java代码就需要把所有的jar包一起上传,导致传输文件浪费了很多时间,所以如果打包的时候只把写成的代码打包,已经上传服务器的jar包不用修改,这样每次上传文件将会大大节省时间,接下来描述一下单独打jar包的过程。
1、瘦身插件
更改springBoot打jar包的插件即可改为一下格式:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<includes>
<include>
<groupId>non-exists</groupId>
<artifactId>non-exists</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>classes</classifier>
<attach>false</attach>
</configuration>
</execution>
</executions>
</plugin>
如图:
2、生成lib目录
2、那么导入的jar包又在哪里呢?没关系,我们还有另一个插件。如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>target/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
当你打包的时候自动去生成,如下:
jar包:
这样,就可以把项目中使用到的所有jar包提取出来。
3、配置文件的剔除
项目在大jar包的时候也会把配置文件和页面一起打包,导致每次都要替换或者更改配置文件,导致非常繁琐。
我们可以在打包插件中指定不用打包的内容,如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!--这里是打包的时候排除的文件例如配置文件-->
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
<exclude>**/*.yml</exclude>
<exclude>static/**</exclude>
<exclude>templates/**</exclude>
<exclude>**/*.xlsx</exclude>
</excludes>
</configuration>
</plugin>
4、映射配置文件目录
Spring Boot 加载配置文件的方式以及步骤
springboot 默认加载配置文件有三个位置
1、a 加载第二个是 通jar包同级 config目录 下的 一系列配置文件 xxx.yaml
2、b 加载第一个是 同jar包同级的 一系列配置文件xxx.yaml
3、c 加载第三个是 自身jar包的 配置文件。
加载顺序 为:a b c
测试实例 :
a: server.port = 8082
b: server.port = 8081
c: server.port = 8080
结果如下:
5、完整pom
<build>
<finalName>web-discovery-test</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<includes>
<include>
<groupId>non-exists</groupId>
<artifactId>non-exists</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>classes</classifier>
<attach>false</attach>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>target/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!--这里是打包的时候排除的文件例如配置文件-->
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
<exclude>**/*.yml</exclude>
<exclude>static/**</exclude>
<exclude>templates/**</exclude>
<exclude>**/*.xlsx</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
6、启动命令
java -jar -Dloader.path=lib -jar web-discovery-test.jar
java -Dloader.path=lib -jar *.jar
7、制作镜像
制作镜像步骤
1、Dockerfile 文件
## java:8-alpine(145) java8:latest (500m)
FROM java:8-alpine
# 维者信息
MAINTAINER fage
RUN mkdir -p /work /work/config /work/libs /work/logs /work/file
EXPOSE 8080
ADD empty.jar /work/web-discovery-test.jar
WORKDIR /work
CMD ["java","-Dloader.path=/work/libs","-jar","/work/web-discovery-test.jar"]
2、提供相对应的文件
比如:empty.jar
运行命令
docker run -d -p 8080:8080 --name web-discovery-test -v /fage/web-discovery-test/web-discovery-test.jar://work/web-discovery-test.jar -v /fage/web-discovery-test/logs:/work/logs -v /fage/web-discovery-test/libs:/work/libs -v /fage/web-discovery-test/file:/work/file -v /fage/web-discovery-test/config:/work/config web-discovery-test:v2
3、命令构建
docker build -t 镜像名:版本号标签 .
## 实例:
docker build -t web-discovery-test:v1 .
[root@localhost docker]#
[root@localhost docker]# docker build -t web-discovery-test:v2 .
Sending build context to Docker daemon 2.56kB
Step 1/6 : FROM java:8-alpine
8-alpine: Pulling from library/java
709515475419: Pull complete
38a1c0aaa6fd: Pull complete
5b58c996e33e: Pull complete
Digest: sha256:d49bf8c44670834d3dade17f8b84d709e7db47f1887f671a0e098bafa9bae49f
Status: Downloaded newer image for java:8-alpine
---> 3fd9dd82815c
Step 2/6 : RUN mkdir -p /work /work/config /work/libs /work/logs /work/file
---> Running in 4833f98cc891
Removing intermediate container 4833f98cc891
---> 8398b01d5158
Step 3/6 : EXPOSE 8080
---> Running in 6b43e5e32ef7
Removing intermediate container 6b43e5e32ef7
---> 5bde587635f3
Step 4/6 : ADD empty.jar /work/web-discovery-test.jar
---> beed469c2bfe
Step 5/6 : WORKDIR /work
---> Running in d953acaefdc0
Removing intermediate container d953acaefdc0
---> 801c71d84e45
Step 6/6 : CMD ["java","-Dloader.path=/work/libs","-jar","/work/web-discovery-test.jar"]
---> Running in af7a7d89f55b
Removing intermediate container af7a7d89f55b
---> 2f03a2dfcb94
Successfully built 2f03a2dfcb94
Successfully tagged web-discovery-test:v2
[root@localhost docker]#
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
web-discovery-test v2 2f03a2dfcb94 4 seconds ago 145MB
4、其他命令
##进入容器
docker exec -it 容器名 /bin/bash ##查询 xx 相关的镜像
docker search xx ##下载镜像到本地
docker pull 镜像名 (可定义名称 xx:xx) ##查看本地镜像
docker images ##查看正在运行镜像
docker ps (-a 所有启动过的,包括不运行的) ##将容器制作成镜像(内部自定义了一些配置等)
docker commit -m '镜像描述' -a '制作者' 容器名 镜像名 ##将制作好的镜像打成 tar 包
docker save -o tar包的名字 镜像名 ##怎么使用 tar 包
docker load < tar 包所在路径
5、RUN vs CMD vs ENTRYPOINT区别
RUN:执行命令并创建新的镜像层;
CMD:设置容器启动后默认执行的命令即参数,但cmd能被docker run后面的命令行参数替换;
ENTRYPOINT:配置容器启动时运行的命令。
ENTRYPOINT的Exec格式用于设置要执行的命令及其参数,同时可以通过CMD提供额外的参数。ENTRYPOINT中的参数始终会被用到,而CMD的额外参数可以再容器启动时动态替换。
ENTRYPOINT指令可以让容器以应用程序或者服务的形式运行。和CMD不同的是,ENTRYPOINT不会被忽略,一定会被执行,即使运行docker run时指定了其他命令。
修改镜像名称
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
pujh/centos tomcat-centos 70ff7873d7cd About an hour ago 612 MB
docker.io/centos latest 9f38484d220f 11 days ago 202 MB
[root@localhost ~]# docker tag 70ff7873d7cd my_centos:tomcat-centos
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_centos tomcat-centos 70ff7873d7cdAboutanhourago612MB
pujh/centostomcat-centos70ff7873d7cdAboutanhourago612MB
docker.io/centoslatest9f38484d220f11daysago202MB [root@localhost~]#dockerrmi70ff7873d7cd
Errorresponsefromdaemon:conflict:unabletodelete70ff7873d7cd(cannotbeforced)-imageisbeingusedbyrunningcontainer70859e710147
[root@localhost~]#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
70859e71014770ff"/bin/sh-c'/root..."AboutanhouragoUpAboutanhour0.0.0.0:8090->8080/tcpdazzling_hopper
[root@localhost~]#dockerstop70859e710147
[root@localhost~]#dockerrm70859e710147
[root@localhost~]#dockerrmi70ff7873d7cd
[root@localhost~]#dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
my_centostomcat-centos70ff7873d7cdAboutanhourago612MB
docker.io/centoslatest9f38484d220f11daysago202MB ###IMAGEID一样,无法删除
[root@localhost/]#dockerrmi00bc163fa009
Errorresponsefromdaemon:conflict:unabletodelete00bc163fa009(mustbeforced)-imageisreferencedinmultiplerepositories
[root@localhost/]#dockerrmiwilliamyeh/java8:latest
Untagged:williamyeh/java8:latest
Untagged:williamyeh/java8@sha256:174d528516a0eae5c4df69966eeb5e51d7c0dc1a532249af61013953eab1d9f3
8、Spring Boot日志
Spring Boot 默认使用logback日志。
1、使用动态配置
开发与生产配置隔离,分开配置
application.properties
## 开发环境 dev /生产环境 product
spring.profiles.active=dev
application-dev.yaml
## 日志配置 配置绝对路径,不要使用相对路径
logging:
file:
path: D:\logs\dev
## 其他配置
server:
port: 8084
application-product.yaml
## 日志配置 配置绝对路径,不要使用相对路径
logging:
file:
path: D:\logs\product
## 其他配置
server:
port: 80
2、logback配置
logback-spring.xml配置
一定要加 -spring ,表示在spring配置被加载之后才执行,当前的logback配置,
<!-- spring 配置 -->
<springProperty scope="context" name="logPath" source="logging.file.path"/>
<springProperty scope="context" name="logname" source="spring.application.name"/>
动态传入配置信息
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds"> <contextName>logback</contextName>
<!-- spring 配置 -->
<springProperty scope="context" name="logPath" source="logging.file.path"/>
<springProperty scope="context" name="logname" source="spring.application.name"/> <!-- 设置 颜色,从 org.springframework.boot.logging.logback 下 的 xml 获取 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRuleconversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRuleconversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<propertyname="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-ddHH:mm:ss.SSS}}){faint}%clr(${LOG_LEVEL_PATTERN:-%5p})%clr(${PID:-}){magenta}%clr(---){faint}%clr([%15.15t]){faint}%clr(%-40.40logger{39}){cyan}%clr(:){faint}%m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<propertyname="FILE_LOG_PATTERN"
value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-ddHH:mm:ss.SSS}}${LOG_LEVEL_PATTERN:-%5p}${PID:-}---[%t]%-40.40logger{39}:%m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <loggername="org.apache.catalina.startup.DigesterFactory"level="ERROR"/>
<loggername="org.apache.catalina.util.LifecycleBase"level="ERROR"/>
<loggername="org.apache.coyote.http11.Http11NioProtocol"level="WARN"/>
<loggername="org.apache.sshd.common.util.SecurityUtils"level="WARN"/>
<loggername="org.apache.tomcat.util.net.NioSelectorPool"level="WARN"/>
<loggername="org.eclipse.jetty.util.component.AbstractLifeCycle"level="ERROR"/>
<loggername="org.hibernate.validator.internal.util.Version"level="WARN"/>
<loggername="org.springframework.boot.actuate.endpoint.jmx"level="WARN"/> <appendername="CONSOLE"class="ch.qos.logback.core.ConsoleAppender">
<target>System.out</target>
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filterclass="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<!--设置字符集FATAL_FILE-->
<charset>UTF-8</charset>
</encoder>
</appender> <!--时间滚动输出level为DEBUG日志-->
<appendername="DEBUG_FILE"class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--正在记录的日志文件的路径及文件名-->
<!--<file>${logPath}/log_debug.log</file>-->
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset><!--设置字符集-->
</encoder>
<!--日志记录器的滚动策略,按日期,按大小记录-->
<rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志归档-->
<fileNamePattern>${logPath}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!--此日志文件只记录debug级别的-->
<filterclass="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
</appender> <!--时间滚动输出level为INFO日志-->
<appendername="INFO_FILE"class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--正在记录的日志文件的路径及文件名-->
<!--<file>${logPath}/log_info.log</file>-->
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<!--日志记录器的滚动策略,按日期,按大小记录-->
<rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--每天日志归档路径以及格式-->
<fileNamePattern>${logPath}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!--此日志文件只记录info级别的-->
<filterclass="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender> <!--时间滚动输出level为ERROR日志-->
<appendername="ERROR_FILE"class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--正在记录的日志文件的路径及文件名-->
<!--<file>${logPath}/log_error.log</file>-->
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset><!--此处设置字符集-->
</encoder>
<!--日志记录器的滚动策略,按日期,按大小记录-->
<rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logPath}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!--此日志文件只记录ERROR级别的-->
<filterclass="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender> <!--开发环境:打印控制台;自定义设置包下面的日志打印级别-->
<!--<springProfilename="dev">-->
<!--<loggername="com.spring.boot.springbootdemo.mapper"level="debug"/>-->
<!--</springProfile>--> <rootlevel="info">
<appender-refref="CONSOLE"/>
<appender-refref="DEBUG_FILE"/>
<appender-refref="INFO_FILE"/>
<appender-refref="ERROR_FILE"/>
</root> </configuration>
9、Linux 删除目录的命令
-r 就是向下递归,不管有多少级目录,一并删除-f 就是直接强行删除,不作任何提示的意思
删除文件夹实例:
rm -rf /var/log/httpd/access
将会删除/var/log/httpd/access目录以及其下所有文件、文件夹
删除文件使用实例:
rm -f /var/log/httpd/access.log
将会强制删除/var/log/httpd/access.log这个文件
10、实战测试
1、项目结构
2、服务器结构
3、镜像
docker build -t web-discovery-test:v1 .
可以发现,这个jar是非常的小
4、执行结果
运行命令
docker run -d -p 8080:8080 --name web-discovery-test -v /fage/web-discovery-test/web-discovery-test.jar://work/web-discovery-test.jar -v /fage/web-discovery-test/logs:/work/logs -v /fage/web-discovery-test/libs:/work/libs -v /fage/web-discovery-test/file:/work/file -v /fage/web-discovery-test/config:/work/config web-discovery-test:v2
运行结果查看
日志打印
[root@localhost docker]# docker logs -f b2b3eaee4b81
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.2.RELEASE)
2020-08-06 14:14:17.080 INFO 1 --- [ main] com.fage.demo.DemoApplication : Starting DemoApplication v0.0.1-SNAPSHOT on b2b3eaee4b81 with PID 1 (/work/web-discovery-test.jar started by root in /work)
2020-08-06 14:14:17.084 INFO 1 --- [ main] com.fage.demo.DemoApplication : The following profiles are active: product
2020-08-06 14:14:18.863 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2020-08-06 14:14:18.880 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2020-08-06 14:14:18.892 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.37]
2020-08-06 14:14:19.026 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2020-08-06 14:14:19.026 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1835 ms
2020-08-06 14:14:19.892 INFO 1 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2020-08-06 14:14:20.374 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2020-08-06 14:14:20.403 INFO 1 --- [ main] com.fage.demo.DemoApplication : Started DemoApplication in 4.073 seconds (JVM running for 4.615)
2020-08-06 14:15:04.855 INFO 1 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-08-06 14:15:04.855 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-08-06 14:15:04.871 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 16 ms
2020-08-06 14:15:04.928 INFO 1 --- [nio-8080-exec-1] com.fage.demo.DemoApplication : file.isDirectory() = true
2020-08-06 14:15:35.456 INFO 1 --- [nio-8080-exec-4] com.fage.demo.DemoApplication : hello world
2020-08-06 14:15:35.457 ERROR 1 --- [nio-8080-exec-4] com.fage.demo.DemoApplication : error
2020-08-06 14:16:12.006 INFO 1 --- [nio-8080-exec-6] com.fage.demo.DemoApplication : hello world
2020-08-06 14:16:12.012 ERROR 1 --- [nio-8080-exec-6] com.fage.demo.DemoApplication : error
2020-08-06 14:16:15.305 INFO 1 --- [nio-8080-exec-7] com.fage.demo.DemoApplication : file.isDirectory() = true
2020-08-06 14:16:15.306 INFO 1 --- [nio-8080-exec-7] com.fage.demo.DemoApplication : 文件夹: /work/file/mk
2020-08-06 14:16:15.306 INFO 1 --- [nio-8080-exec-7] com.fage.demo.DemoApplication : 文件: /work/file/aaa
验证 是否映射成功?调用接口:http://192.168.71.134:8080/files和http://192.168.71.134:8080/hello
日志打印:
2020-08-06 14:16:15.305 INFO 1 --- [nio-8080-exec-7] com.fage.demo.DemoApplication : file.isDirectory() = true
2020-08-06 14:16:15.306 INFO 1 --- [nio-8080-exec-7] com.fage.demo.DemoApplication : 文件夹: /work/file/mk
2020-08-06 14:16:15.306 INFO 1 --- [nio-8080-exec-7] com.fage.demo.DemoApplication : 文件: /work/file/aaa
代码分享
微信公众号 点击关于我,加入QQ群,即可获取到代码
公众号:发哥讲
这是一个稍偏基础和偏技术的公众号,甚至其中包括一些可能阅读量很低的包含代码的技术文,不知道你是不是喜欢,期待你的关注。
如果你觉得文章还不错,就请点击右上角选择发送给朋友或者转发到朋友圈~
● 扫码关注我们
据说看到好文章不推荐的人,服务器容易宕机!
本文版权归 发哥讲 和 博客园 共有,原创文章,未经允许不得转载,否则保留追究法律责任的权利。
Spring Boot打包瘦身 Docker 使用全过程 动态配置、日志记录配置的更多相关文章
- Spring boot 打包瘦身方法
背景 随着spring boot 的流行.越来越多的来发着选择使用spring boot 来发 web 应用. 不同于传统的 web 应用 需要 war 包来发布应用. spring boot 应用可 ...
- Spring Boot 项目瘦身指南,瘦到不可思议!129M->1.3M
之前在 从使用传统Web框架到切换到Spring Boot后的总结 中提到关于 Spring Boot 编译打包,Spring Boot 应用程序不用额外部署到外部容器中,可以直接通过 Maven 命 ...
- Spring Boot AOP 扫盲,实现接口访问的统一日志记录
AOP 是 Spring 体系中非常重要的两个概念之一(另外一个是 IoC),今天这篇文章就来带大家通过实战的方式,在编程猫 SpringBoot 项目中使用 AOP 技术为 controller 层 ...
- Spring Boot工程发布到Docker
先聊聊闲话 搞过企业级的application运维的同仁肯定深有感触,每个application的功能交叉错杂,数据交换就让人焦头烂额(当然这和顶层业务设计有关系), 几十个application发布 ...
- 从零开始通过idea插件将一个spring boot项目部署到docker容器里运行
实操:将一个spring boot项目部署到docker容器里运行 实验需要的环境: 腾讯云+Ubuntu 16.04 x64+idea+插件docker integration+daocloud 第 ...
- Spring Boot打包部署
date: 2018-11-19 15:30:11 updated: 2018-11-21 08:28:37 Spring Boot打包部署 第一种方式 打包成jar包部署在服务器上 1.1 添加插件 ...
- 将Spring Boot项目运行在Docker上
将Spring Boot项目运行在Docker上 一.使用Dockerfile构建Docker镜像 1.1Dockerfile常用指令 1.1.1ADD复制文件 1.1.2ARG设置构建参数 1.1. ...
- 【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南
[SFA官方翻译]使用 Kubernetes.Spring Boot 2.0 和 Docker 的微服务快速指南 原创: Darren Luo SpringForAll社区 今天 原文链接:https ...
- spring boot (2):spring boot 打包tomcat、tomcat 部署多个项目、服务器部署项目SSL 设置(阿里云)
一.spring boot 内置tomcat配置https: 关于自签名证书可以看下上一篇 spring boot1 更详细的可以看转载 https://www.jianshu.com/p/8d4ab ...
随机推荐
- sql多表语句
多条件查询条件判空 最优写法 3三表带条件查询
- MySQL事物原理及事务隔离级别
mysql事物 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取.事务的正确执行使得数据库从一种状态转换为另一种状态. 事务必须服从ISO/IEC所制定的ACID原则.AC ...
- 随笔java面试基础
转:http://blog.csdn.net/wenwen360360/article/details/54969418 Application ―Java应用程序”是可以独立运行的Java程序.由J ...
- 史上最全的 jmeter 获取 jdbc 数据使用的四种方法
jmeter使用jdbc协议获取数据库中数据,很多人都会用,因为大家在做测试的时候,有时候需要大量的用户进行登录,获取需要数据库中真实的数据用于测试,所以常常会用jdbc来获取数据库数据. 那从数据库 ...
- SpringBoot2.x入门:使用MyBatis
这是公众号<Throwable文摘>发布的第25篇原创文章,收录于专辑<SpringBoot2.x入门>. 前提 这篇文章是<SpringBoot2.x入门>专辑的 ...
- canvas使用context.drawImage时图片不在画布上展示的问题
遇到问题:找到图片img元素后,将参数传给context.drawImage(image,10,10)后图片并没有在画布上展示. 解决方案:在外层嵌套document.images[0].onload ...
- 关于IDEA的一些快捷键操作
shift+F6修改实体类中的属性会重构代码
- ElasticSearch(二)Kibana、版本控制
Kibana简介: Kibana可视化界面 Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作. 你用Kibana来搜索,查看,并和存储在Elasticsearch ...
- Redis(一)简介及安装、测试
一.Redis简介: 关于关系型数据库和nosql数据库 关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而nosql数据 库是基于特殊的结构,并将数据存储到内存的数据库.从性能上而言, ...
- Web优化躬行记(2)——JavaScript
一.语言 1)慎用全局变量 当变量暴露在全局作用域中时,由于全局作用域比较复杂,因此查找会比较慢. 并且还有可能污染window对象,覆盖之前所赋的值,发生意想不到的错误. 0 == '' //tru ...