1. 首页 > 电脑手机 >

docker日志大小限制 docker的日志

如何设置Docker容器中Java应用的内存限制

docker run 命令可以对cpu和内存限制,目前没有直接对磁盘限制

docker日志大小限制 docker的日志docker日志大小限制 docker的日志


Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container -c, --cpu-shares=0 CPU shares (relative weight) -m, --memory="" Memory limit (format: , where unit = b, k, m or g)

Docker日志收集

Docker的应用为我们带来便利的同时,日志集中化问题就越来越有必要性了。

在收集之前,我们先来简单了解下docker日志处理的机制。当启动一个容器的时候,它其实是docker daemon的一个子进程,docker daemon可以拿到你容器里面进程的标准输出,拿到标准输出后,它会通过自身的一个LogDriver模块来处理,LogDriver支持的方式很多,可以写到本地的文件(默认方式),可以发送到syslog等,见下图:

目前,常见的收集方式有下面几种:

在日志收集的过程中,需要特别考虑性能的问题。试想一下,当容器的流量比较大的时候,势必日志也会随着大量地产生,这时就会有个问题,日志收集agent必然会跟容器抢占宿主机的资源,为了避免这个问题,在收集选型的时候就需要注意:

综上所属,最佳实践就是采用 旁路模式 来收集,并且使用容器方式来运行并限定使用的资源;最终采用了 logspout+Fluentd 的方案(架构图见下),采用的理由如下:

logspout通过docker.sock监听本地容器的启动,通过docker API获取到这个新容器的日志流,并将这个日志流通过udp的协议发送给fluentd处理,fluentd处理完成后发送给后续的日志系统。

最后,受阿里云fluentd-pilot的影响,我将官方的logspout进行一些小的修改, 请见 :

下面个出个docker-compose.yml, 通过docker-compose up就可以运行了;

fluent的简单配置:

最后,可以通过查看fluent的log来查看格式化的容器日志;

docker如何配置syslog作为log输出。

docker如何配置syslog作为log输出。

有两个途径,一是全局配置即daemon.json,影响所有的container

其中log-opts需要查看docker的文档,根据需要配置。

这个例子中的两个参数,后面会介绍他们的含义。

另一个途径就是per-container的配置。

就是在docker run的时候指定参数。

经过这个配置之后,docker会把container的log导出到syslog。

必须先确保syslog在运行

查看是状态是否在运行;注意rsyslog依赖于journald,查看journald是否在运行

这里systemd-journald依赖于一个machine id

重启journald和rsyslog

经过这个步骤之后,container的log就导出到/var/log/messages里面了。

syslog还可以把log输出到远程的syslog,比如在docker swarm环境下,可以配置一个syslog server,把所有的不同机器上的container全部导出到这台机器上,实现log的集中式管理。

配置rsyslog server

可以配置成TCP或者UDP,上述配成UDP

上述配置了server端的监听地址,下面配置server端收到log信息之后如何处理。

几点说明:

配置rsyslog client

这里把客户端的log全部转发到server地址:514,两个@@表示远端是TCP连接,一个@表示UDP连接。

并且定义了buffer的文件名(fwdyourname)和空间大小(1g),以备远程server不能服务的时候,缓存本地日志。

配置container的logrotate信息。

docker container如何支持日志rotate

docker container如何支持日志rotate

缺省情况下docker daemon会把container日志存放到: /var/lib/docker/containers//-json.log ,这是RedHat下的路径,不同的Linux发行平台会不一样,请参考各自文档。

其中是64字节长度的长名,例如:

/var/lib/docker/containers/49f9b1d950553a732c6493bb5794871f7169f235de0be50b0da1c98f3d9f7e2b/49f9b1d950553a732c6493bb5794871f7169f235de0be50b0da1c98f3d9f7e2b-json.log

在container里面执行的进程输出的stdout和stderr都被被docker daemon输出到上述日志文件。

上述缺省情况下是一个json格式的文本文件,随着container运行时间的增长,日志文件会越来越大,最终占用过量的磁盘空间。

采用log rotate的办法自动删除多余的历史日志信息,保证每个container占用最多的磁盘空间。

docker本身提供这种功能。

docker log rotate提供的策略,有两个参数用来设置log rotate的配置值:

两个数字相乘就是一个container允许占用的最大日志磁盘空间。例如:

假设: log-max-size=10M, log-max-file=5

那么在最多会生成5个日志文件:

其中/var/lib/docker/containers//-json.log是当前正在写的日志文件,其他的是历史日志文件(每个文件大小5M),数字越大表示越老的日志。当当前的日志文件满5M后,把当前日志文件备份成json.1.log,而把json.1.log重命名成json.2.log,把json.2.log重命名成json.3.log,把json.3.log重命名成json.4.log,再把json.4.log删除了。

有一个限制:

docker log rotate只支持基于文件大小轮转,不支持基于时间的rotate,例如每小时生成一个日志文件,每天生成一个日志文件这种方式;这个需求还是很常用的。

这样所有新起来的container都能使用日志轮换的功能,而不需要为每个container单独设置。

重启docker daemon,配置生效:

在每个container启动的时候在命令行设置:

docker日志存储位置,设置docker容器日志大小

在Linux系统中docker启动后日志存储在 /var/lib/docker/containers/容器ID/ 目录中,启动一个容器后,容器ID目录中会生成如下文件:

每个容器的日志默认都会以 json-file 的格式存储于 /var/lib/docker/containers/<容器id>/<容器id>-json.log 下,不过并不建议去这里直接读取内容,因为容器的日志则可以通过 docker logs 命令来访问,而且可以像 tail -f 一样,使用 docker logs -f 来实时查看。如果使用 Docker Compose,则可以通过 docker-compose logs <服务名> 来查看。

从上面可以知道docker容器日志存储在文件中,容器销毁后 /var/lib/docker/containers/<容器id>/ 目录会被自动删除,所以容器日志也被一并删除。如果容器一直运行并且一直产生日志,容器日志会导致磁盘空间爆满,如何解决这个问题?

新建 /etc/docker/daemon.json ,若有就不用新建了。添加log-dirver和log-opts参数,如下:

设置完成之后,需要删除容器,并重新启动容器,我们可以看到 /var/lib/docker/containers/<容器id>/hostconfig.json 文件的变化如下:

设置 log-opts 之前:

设置 log-opts 之后:

在k8s集群中docker容器日志 /var/lib/docker/containers/容器ID/ 目录的文件如下:

与docker容器目录相比少了一些文件:hostname、hosts、resolv.conf、resolv.conf.hash

k8s通过 sandbox(pause容器,关于pause容器的介绍可以查阅资料) 关联了这些文件,通过查看 cat config.v2.json 可以发现如下配置:

使用命令 cat /var/lib/docker/containers/<容器id>/hostconfig.json 查看 hostconfig.json 的内容,发现有如下设置:

查看 /etc/docker/daemon.json 发现有如下配置:

下面列出了一个容器的日志文件达到设置值的情况:

参考文档:

Docker 日志都在哪里?怎么收集?

Docker容器日志查看与清理

调整dockerd的日志输出级别

dockerd支持的日志级别debug, info, warn, error, fatal,默认的日志级别为info。必要的情况下,还需要设置日志级别,这也可以通过配置文件,或者通过启动参数-l或–log-level。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至836084111@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息