Docker 2019-05-29
springboot服务运行在docker容器中,产生的日志会随容器删除而被删除,而且也不好管理日志,比如做日志切割等,所以我们一般会把日志挂载到宿主机器上,这样运维人员也好管理日志,从日志定位问题也比较方便。
前提必须安装了docker和jdk8
1.首先需要让springboot产生日志文件到某个目录,比如/logs目录,一般情况下,springboot运行是没有日志文件产生的,这个日志文件并不是catalina.out,catalina.out为控制台输出,可以通过dockerlogs实时查看,但并不会生成一个日志文件的,之前一直以为catalina.out有输出就会在挂载卷有日志文件存在,其实不会,懵逼了好久。
这里我们可以结合logback,就是给springboot配置logback-spring.xml,然后让日志输出到/logs目录下
logback-spring.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="true"> <!-- 项目名称 --> <property name="PROJECT_NAME" value="demo2" /> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <property name="LOG_HOME" value="./logs" /> <!-- 控制台输出 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %highlight([%-5level] %logger{50} - %msg%n)</pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${LOG_HOME}/catalina.%d{yyyy-MM-dd}.log</FileNamePattern> <!--日志文件保留天数--> <MaxHistory>15</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!--myibatis log configure--> <logger name="com.apache.ibatis" level="TRACE"/> <logger name="java.sql.Connection" level="DEBUG"/> <logger name="java.sql.Statement" level="DEBUG"/> <logger name="java.sql.PreparedStatement" level="DEBUG"/> <!-- 开发环境下的日志配置 --> <springProfile name="dev"> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root> </springProfile> <!-- 生产环境下的日志配置 --> <springProfile name="prod"> <root level="INFO"> <appender-ref ref="FILE" /> </root> </springProfile> </configuration>
这样springboot就会产生日志到/logs下了,这一步很重要
2.有了日志文件产生,下一步我们就给springboot做镜像了。
先通过maven把springboot打包成demo2.jar
然后在linux上新建一个文件夹
mkdir /opt/demo2
把demo2.jar放到这个文件夹下
然后在此目录下新建一个Dockerfile文件
Dockerfile内容如下:
FROM java:8 ADD demo2.jar demo2.jar EXPOSE 8087 ENTRYPOINT ["nohup","java","-Djava.security.egd=file:/dev/./urandom","-jar","/demo2.jar","--spring.profiles.active=dev",">>","catalina.out","2>&1","&"]
执行命令创建镜像
docker build -t demo2 .
执行命令运行镜像,产生容器
docker run -d --name demo2 -v /opt/demo2/logs:/logs demo2
注意必须,得有-v/opt/demo2/logs:/logs执行容器的挂载目录
好了,我们进入容器查询,是否产生了日志文件,进入容器命令
docker exec -it demo2 /bin/sh
此次容器内的/logs目录下已经产生了catalina.log日志文件
然后退出容器,到宿主机器的/opt/demo2/logs/也有了一样的catalina.log日志文件
同样利用了logback做日志管理,按时间切割,按大小清理日志,挺好的