有一台跑 docker 的服务器,系统告警磁盘满了,经过排查,发现 /var/lib/docker/containers/ 占用了过多的磁盘空间,需要清理一下。

检查

/var/lib/docker/containers/ 目录是 Docker 容器的日志目录,我们可以通过以下的命令,来查看每个容器的日志大小。

1
docker ps -aq | xargs -I '{}' docker inspect --format='{{.LogPath}}' '{}' | xargs ls -lh

可以看到类似的内容。

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。需要赶紧清理一下。

备份

如果日志很重要,可以备份一下,例如:

1
cat /var/lib/docker/containers/10cbdaa6640bfdd065ee4a192f5f455751f36938c0bbac870d75c6648470caa7/10cbdaa6640bfdd065ee4a192f5f455751f36938c0bbac870d75c6648470caa7-json.log | bzip2 --best --compress --stdout /data/backup/10cbdaa6640bfdd065ee4a192f5f455751f36938c0bbac870d75c6648470caa7-json.log.bz2

我这机器是一点空间都没有了,就不备份了。

删除日志

我们可以使用 fallocate,比如我们删掉这个文件的前 295G,保留最后的 5G 日志。

1
fallocate --collapse-range --offset 0 --length 295GiB --verbose /var/lib/docker/containers/10cbdaa6640bfdd065ee4a192f5f455751f36938c0bbac870d75c6648470caa7/10cbdaa6640bfdd065ee4a192f5f455751f36938c0bbac870d75c6648470caa7-json.log

如何规避

配置一下 docker,限制日志的存储量,并开启滚动存储,以减少日志过度留存。

例如,在 docker-compose.yml 中指定日志配置。

1
2
3
4
5
logging:
driver: "json-file"
options:
max-size: "1024m"
max-file: "1"

或者直接怼到 docker 的全局配置下。

1
echo '{"log-driver": "json-file", "log-opts": {"max-size": "1024m", "max-file": "1"}}' | jq . > /etc/docker/daemon.json

然后 restart docker 就大吉了。

文章封面图:@carrier_lost