如何设置Docker容器中Java应用的内存限制
docker run 命令可以对cpu和内存限制,目前没有直接对磁盘限制
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:
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地址
并且定义了buffer的文件名(fwdyourname)和空间大小(1g),以备远程server不能服务的时候,缓存本地日志。
配置container的logrotate信息。
docker container如何支持日志rotate
docker container如何支持日志rotate
缺省情况下docker daemon会把container日志存放到: /var/lib/docker/containers/
其中
/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/
有一个限制:
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 举报,一经查实,本站将立刻删除。