Docker libcontainerd模块出现PROTOCOL_ERROR导致日志文件暴涨耗尽磁盘空间求助
Docker libcontainerd模块出现PROTOCOL_ERROR导致日志文件暴涨耗尽磁盘空间求助
兄弟,我之前也踩过这个坑!先给你分步骤来,先紧急救回磁盘空间,再彻底解决日志疯涨的根源问题:
一、紧急释放磁盘空间(先让应用恢复正常)
- 别直接删除那些超大的旧日志文件,容易导致日志服务出问题,用空内容覆盖它们就行:
这俩命令执行完,瞬间就能释放40多G的空间,你的Node.js应用应该就能正常跑了。cat /dev/null > /var/log/syslog.1 cat /dev/null > /var/log/daemon.log.1 - 如果syslog还在疯狂刷日志,临时重启一下rsyslog服务稳住:
systemctl restart rsyslog
二、解决dockerd的PROTOCOL_ERROR根源
这个错误是Docker和containerd之间的RPC通信出问题了,试试这几个方法:
- 先单独重启containerd服务,大部分情况这个操作就能修复通信异常:
systemctl restart containerd - 如果重启containerd没用,就把整个Docker服务重启(重启前先确认你的容器会自动重启!):
先检查容器的重启策略:
要是显示docker ps -q | xargs docker inspect --format '{{.Name}} 重启策略: {{.HostConfig.RestartPolicy.Name}}'always或者unless-stopped,就放心执行:systemctl restart docker - 检查Docker和containerd的版本兼容性,Debian默认源里的版本可能比较老,容易出现不匹配的情况。你可以用这俩命令看版本:
如果版本差距较大,建议更新到Docker官方提供的稳定版套件,比Debian源的版本靠谱多了。docker version containerd --version - 顺带清理一下Docker的冗余资源,缓存堆积有时候也会间接引发通信问题:
docker system prune -af
三、长期预防:配置日志自动管理
这次是吃了日志没限制的亏,给你两个配置方案,防止以后再爆磁盘:
- 配置logrotate自动切割系统日志:
给rsyslog加个配置,让它自动切割/var/log里的日志文件,比如限制单个日志最大100M,保留5个备份,避免文件无限膨胀。 - 限制Docker容器日志大小:
编辑Docker daemon的配置文件/etc/docker/daemon.json(如果没有就新建),添加日志驱动的限制:
保存后重启Docker生效:{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "5" } }
这样每个容器的日志最多保留5个10M的文件,再也不会出现单个日志几十G的情况了。systemctl restart docker
备注:内容来源于stack exchange,提问作者Manda Ravalison
相关产品推荐
相关产品推荐

