有一台跑 docker 的服务器,系统告警磁盘满了,经过排查,发现 /var/lib/docker/containers/ 占用了过多的磁盘空间,需要清理一下。
检查
/var/lib/docker/containers/ 目录是 Docker 容器的日志目录,我们可以通过以下的命令,来查看每个容器的日志大小。
SHELL
1
|
docker ps -aq | xargs -I '{}' docker inspect --format='{{.LogPath}}' '{}' | xargs ls -lh
|
可以看到类似的内容。
TXT
1 2 3 4 |
-rw-r----- 1 root root 300G Feb 2 12:01 /var/lib/docker/containers/10cbdaa6640bfdd065ee4a192f5f455751f36938c0bbac870d75c6648470caa7/10cbdaa6640bfdd065ee4a192f5f455751f36938c0bbac870d75c6648470caa7-json.log -rw-r----- 1 root root 779 Aug 5 00:35 /var/lib/docker/containers/1663d1e966bc605629470bba553c9678c31712527795ce4e2da9d044655c0e2d/1663d1e966bc605629470bba553c9678c31712527795ce4e2da9d044655c0e2d-json.log -rw-r----- 1 root root 0 Aug 5 00:35 /var/lib/docker/containers/247b3233efb707bb13933fa97db5e9f834be6b53b0e52d262ad95c0f2f8e393e/247b3233efb707bb13933fa97db5e9f834be6b53b0e52d262ad95c0f2f8e393e-json.log -rw-r----- 1 root root 2.0K Aug 5 00:35 /var/lib/docker/containers/5702fc3fce1f6e57565219030cadc33adc995289e4fb48b796ac6449fe4e6919/5702fc3fce1f6e57565219030cadc33adc995289e4fb48b796ac6449fe4e6919-json.log |
我们发现一个日志已经达到了 300G。需要赶紧清理一下。
备份
如果日志很重要,可以备份一下,例如:
SHELL
1
|
cat /var/lib/docker/containers/10cbdaa6640bfdd065ee4a192f5f455751f36938c0bbac870d75c6648470caa7/10cbdaa6640bfdd065ee4a192f5f455751f36938c0bbac870d75c6648470caa7-json.log | bzip2 --best --compress --stdout /data/backup/10cbdaa6640bfdd065ee4a192f5f455751f36938c0bbac870d75c6648470caa7-json.log.bz2
|
我这机器是一点空间都没有了,就不备份了。
删除日志
我们可以使用 fallocate,比如我们删掉这个文件的前 295G,保留最后的 5G 日志。
SHELL
1
|
fallocate --collapse-range --offset 0 --length 295GiB --verbose /var/lib/docker/containers/10cbdaa6640bfdd065ee4a192f5f455751f36938c0bbac870d75c6648470caa7/10cbdaa6640bfdd065ee4a192f5f455751f36938c0bbac870d75c6648470caa7-json.log
|
如何规避
配置一下 docker,限制日志的存储量,并开启滚动存储,以减少日志过度留存。
例如,在 docker-compose.yml 中指定日志配置。
YML
1 2 3 4 5 |
logging: driver: "json-file" options: max-size: "1024m" max-file: "1" |
或者直接怼到 docker 的全局配置下。
SHELL
1
|
echo '{"log-driver": "json-file", "log-opts": {"max-size": "1024m", "max-file": "1"}}' | jq . > /etc/docker/daemon.json
|
然后 restart docker 就大吉了。