这篇文章主要解决的问题是springboot在使用docker部署的时候日志的存放问题,主要参考以下几篇文章,Docker支持更深入的容器日志分析,Docker容器的日志集中化处理,Docker数据管理(数据卷&数据卷容器),Docker-数据卷和数据容器卷,容器内日志收集方案示例。
将jdk和需要的运行的jar构建成镜像之后,运行成容器之后,可以实时的输出日志,但是当容器挂掉之后,日志也便消失不见。在容器中可以运行bash命令的前提下,容器运行的时候会根据jar中配置的日志目录生成相应的日志文件,当容器停止的时候在容器中的所有的东西也会消失不见,查询原因时就会遇到问题,所以就需要在容器之外将日志存储起来,下边是几种容器日志存储的解决方案。
第一种,docker logs containerId:
这种方式存在的问题是只能实时输出层,存储的路径在容器内部,容器挂掉之后日志变会消失不见。这种方式存在的问题是只能实时输出层,存储的路径在容器内部,容器挂掉之后日志变会消失不见。
第二种,数据卷的方式:
1
2 1docker run -d -v /changfeng/logscontainer/syway:/changfeng/logs/syway -p 8081:8080 txxs/springbootdocker:1.0
2
前边的是宿主机中日志的目录,后边是容器中日志文件的输出目录,指定暴露的端口号是8081,运行的镜像是txxs/springbootdocker的1.0的版本。这样就可以在外部docker的宿主机上看到日志,但是问题是再次启动镜像的时候日志会怎么办呢,这时候并不会重新新建文件而是直接在原文件的末尾添加,也就是这两个容器的日志文件合并为同一个。改变的办法可以很简单,虽然镜像都是一样的,但是可以动态的生成日志文件的名字,这样在启动镜像的时候因为日志文件的名字不同,也就不存在上边的问题了。具体日志文件的名字可以使用时间或者IP+序号的方式进行拼接
第三种,数据卷容器:
1
2 1docker run -it -v /changfeng/logs/syway --name logs centos
2
数据卷容器的路径和日志的输出日志路径要保持一致,用这种方式指定需要输出日志路径,创建数据卷容器的时候就要指定相应的路径。
1
2 1docker run -it --volumes-from logs -p 8082:8080 txxs/springbootdocker:1.0
2
这种方式有同样的问题就是新建容器并不会对日志文件进行重建,而是直接在第一个日志文件的基础上继续添加,这样所有的容器的日志文件都会集中在这一个文件中,对于查找问题依旧是不方便,另一个问题是,数据卷容器挂了,那么所有的日志也将消失。改变的方式类似于上述数据卷的形式,但是,这样的话就需要改代码,其实并不是非常合适。
第四种,消息队列
在容器内部的程序中通过消息队列的方式发送出去,然后序列化。再把序列化的文件或数据进行分析和查询。个人认为日志就两方面的作用,一是查找问题,二是分析问题,通过消息队列的方式显然是后者。
第五种,Loggly
第六种,ELK(Elasticsearch+Logstash+Kibana)
后两者方式没有安装操作验证就不写了,在这里记录一下以便以后学习。
数据卷有以下四个方面的特征:
1、容器移除的时候可以保存容器的数据
2、在文件系统和docker容器之间可以共享数据
3、docker容器之间可以共享数据
4、容器具有隔离性,临时性
补充说明,可以使用以下命令进入内部容器
docker exec -it containerid /bin/bash,但是有时候并不好使,因为你不知道构建镜像的基础是什么,这时候可以使用docker history –no-trunc=true image> image-dockerfile获取dockerfile后,查看内部的镜像构建基础,比如有的是/bash,而有的可能是/bin/sh,还可能就不可以使用命令行,那么你就需要自己构建相应的镜像,或者将两个现成的镜像合并