文章目录
概述
最近连续遇到两次,docker占用大量磁盘空间,磁盘告警的情况。把排查过程记录如下。
环境
系统
- CentOS 7.9
- Docker 26.1.4
现象
磁盘使用率98%,监控告警。经排查发现都是/var/lib/docker目录下占用的。
bash
[root@centos7.9]# du -sh --exclude="mysql" /var/lib/* | sort -rh
425G /var/lib/docker
101M /var/lib/rpm
14M /var/lib/yum
4.5M /var/lib/samba
224K /var/lib/containerd
120K /var/lib/alternatives
64K /var/lib/systemd
8.0K /var/lib/NetworkManager
8.0K /var/lib/authconfig
......
0 /var/lib/avahi-autoipd
解决
情况1-容器日志大
- 使用以下命令排查,发现某个容器日志占用了200G
bash
sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -rh
bash
[root@centos7 var]# sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -rh
200G /var/lib/docker/containers/39b55d6c55766a08953411f7dfa88f198779105202d5a07175d07cf26af23765/39b55d6c55766a08953411f7dfa88f198779105202d5a07175d07cf26af23765-json.log
16M /var/lib/docker/containers/249693a2d4580c375b164af52ba576b6d8ea448179c7496b9f0d94627dec1016/249693a2d4580c375b164af52ba576b6d8ea448179c7496b9f0d94627dec1016-json.log
快速解决-清理日志
- 手动清除日志
bash
sudo truncate -s 0 /var/lib/docker/containers/39b55d6c55766a08953411f7dfa88f198779105202d5a07175d07cf26af23765/39b55d6c55766a08953411f7dfa88f198779105202d5a07175d07cf26af23765-json.log
- 增加cron定时任务
- 强制清除超过10G的容器日志文件
bash
# 查询命令
# find /var/lib/docker/containers/ -name "*-json.log" -size +10G -ls
# 清理任务
0 0 * * * find /var/lib/docker/containers/ -name "*-json.log" -size +10G -exec truncate -s 0 {} \;
长期解决-限制日志大小
- 修改容器配置
bash
vim /etc/docker/daemon.json
- 确认配置支持热加载 "live-restore": true。如果之前未配置,需要配置后重启docker
- 增加日志限制
- max-size: "1g":单个日志文件最大 1 GB
- max-file: "10":最多保留 10 个日志文件
json
{
"live-restore": true,
"insecure-registries": ["192.168.6.5:5000"],
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "1g",
"max-file": "10"
}
}
- 热加载配置(需要预先配置 live-restore,并重启过docker)
bash
systemctl reload docker
- 重建容器
- 注意:只有重建后的容器才受到日志限制约束,所以必须销毁并重建容器
bash
docker rm -f test-service
bash
docker run -d --name test-service .....
情况2-构建缓存大
- 查看 Docker 整体磁盘使用情况
bash
docker system df
# 查看更详细的版本,会列出所有容器、镜像等
#docker system df -v
bash
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 7 2 1.693GB 1.431GB
Containers 2 2 51.04MB 0B (0%)
Local Volumes 0 0 0B 0B
Build Cache 24 0 960B 147.3GB
快速解决-清理缓存
- 手动清除48小时以前创建的缓存
bash
docker builder prune --filter until=48h -f
- 增加cron定时任务
- 强制清除创建超过7天的缓存
- 强制清理创建超过30天的系统垃圾
bash
# 清理7天前创建的缓存
0 1 * * 0 docker builder prune --filter until=168h -f > /dev/null 2>&1
# 清理30天的创建或停止的镜像、网络、容器及缓存等
0 1 * * 6 /usr/bin/docker system prune -f --filter "until=720h" >> /dev/null 2>&1
长期解决-限制构建缓存大小
- 修改容器配置
bash
vim /etc/docker/daemon.json
- 增加构建缓存限制
- "defaultKeepStorage": "20GB":限制 20GB
json
{
"live-restore": true,
"insecure-registries": ["192.168.6.5:5000"],
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "500m",
"max-file": "5"
},
"builder": {
"gc": {
"enabled": true,
"defaultKeepStorage": "20GB"
}
}
}
- 重启docker生效
bash
systemctl restart docker
- 查看新策略自动清理结果
bash
docker system df -v