文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

看看程序员如何被 Docker 日志坑惨了

2024-12-02 21:02

关注

最近在读《计算机程序的构造和解释》,里面有一句话:代码必须能够被人阅读,只是机器恰巧可以执行。

我也想到了一句话:BUG 一定能够被人写出,只是恰好我写的多而已。

说多了都是泪,来看看我最近遇到的一个问题。

问题

普通的一天,打开普通的电脑,登录一台普通的服务器,敲下一条普通的命令。

在我使用命令补全时,出现了一条不普通的提示:

  1. -bash: cannot create temp file for here-document: No space left on device ls -bash 

怎么磁盘满了?

使用 df -h 一看还真是。

什么原因呢?

解决

首先,查找一下系统里的大文件,看看是哪个小可爱搞的鬼。

  1. du -sh /* | grep G 

很快就定位到了这个目录:/var/lib/docker/containers。

原来是 Docker 这家伙,这个目录下存放的都是容器运行过程中产生的日志。

使用下面命令来给这些文件按大小排个序:

  1. du -d1 -h /var/lib/docker/containers | sort -h 
  2.  
  3. 32K    /var/lib/docker/containers/d607c06e475191fff1abd0c2b4b672e7fe8a96cb197f4e8557b18600de2e60af 
  4. 36K    /var/lib/docker/containers/0d4321106721b9d26335fefef7b9e8e23629691684a4da2f953ac8223c8240c3 
  5. 36K    /var/lib/docker/containers/7525aab4aa917aa1016169114762261726ac7b9cc712bef35cdc7035b50d20ce 
  6. 36K    /var/lib/docker/containers/9252e1c373d59ef5613c2b6122eb6e43aa2bd822bd2c199aa67d6eb659c4adb7 
  7. 142M    /var/lib/docker/containers 
  8. 142M    /var/lib/docker/containers/15700ee92cd2831554b9a1e78127df0f07248c1498d35c17525407bc8a98bc1a 

文件名称就是容器 ID,每个文件对应一个容器,也就可以定位到,具体是哪个容器产生了大量的日志。

使用这个命令可以将大文件快速清空:

  1. sh -c "cat /dev/null > ${log_file_name}" 

但是清空了文件哪算解决问题,新的日志还在源源不断往日志里打呢。看了看日志内容,很熟悉。前两天为了调试程序,刚加的一条 print。

编辑代码,删除 print,重启容器。好了,日志不再疯狂追加了。

为什么 print 语句将日志都输出到文件里了呢?别着急,后面再来详细介绍。

先处理一下眼前的问题,放任日志无限增长是肯定不行的,需要有一个单个文件大小限制。否则,明天张三再加一条 print,磁盘又满了。

这里有两个方案:

  1. 单一容器配置
  2. 全局配置

单一容器配置

启动容器时,通过参数来控制日志的文件个数和单个文件的大小:

  1. docker run -it --log-opt max-size=10m --log-opt max-file=3 redis 

但这样做是比较麻烦的,更多的采用的是全局配置的方式。

全局配置

编辑 /etc/docker/daemon.json:

  1.     "log-driver":"json-file"
  2.     "log-opts":{ 
  3.         "max-size" :"50m"
  4.         "max-file":"3" 
  5.     } 

重启 Docker 服务:

  1. systemctl daemon-reload 
  2. systemctl restart docker 

注意: 已存在的容器不会生效,需要重建才可以。

接下来再说说上文提到的 print 问题。

Docker 日志

Docker 日志分为两类:

引擎日志

Docker 引擎日志一般是交给了 Upstart(Ubuntu 14.04) 或者 systemd (CentOS 7, Ubuntu 16.04)。前者一般位于 /var/log/upstart/docker.log 下,后者一般通过 journalctl -u docker 进行查看。

不同系统的位置都不一样,网上有人总结了一份列表,我修正了一下,可以参考:

容器日志

使用下面命令可以显示当前运行的容器的日志信息:

  1. docker logs CONTAINER 

UNIX 和 Linux 命令有三种输入输出,分别是 STDIN、STDOUT 和 STDERR。docker logs 显示的内容包含 STDOUT 和 STDERR。

在生产环境下,如果我们的应用输出到日志文件里,那么我们在使用 docker logs 时一般收集不到太多重要的信息。

这里来看一下 nginx 和 httpd 是怎么做的:

当日志量比较大的时候,使用 docker logs 来查看日志,会对 docker daemon 造成比较大的压力,容易导致容器创建慢等一系列问题。

只有使用了 local 、json-file、journald 日志驱动的容器才可以使用 docker logs 捕获日志,使用其他日志驱动无法使用 docker logs。

Docker 默认使用 json-file 作为日志驱动。

除此之外,Docker 还提供了很多其他日志驱动,这里就不过多介绍。还有日志管理方案,我也不是很有经验,大家如果感兴趣的话自己搜搜看吧。

 

来源:AlwaysBeta内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯