无论是初次接触 Docker 的新手,还是日常频繁使用 Docker 的老手,往往都会忽视日志存储的问题。因为在轻度使用场景下,很难意识到 Docker 会无限制地累积日志,往往直到磁盘空间耗尽,才会发现这个问题。
根据官网的文档得知,Docker默认使用 json-file 作为容器的 logging driver。
JSON File logging driver | Docker Docs
json-file 的问题在于,它的 max-size 配置默认为 -1,也就是没有大小限制,不执行日志轮换。通过阅读官方文档,显然官方也意识到了这个问题,所以它更加推荐用户使用 local 作为容器的 logging driver。
至于为何不直接将其设为默认?官方给出的理由是“为了向后兼容旧版本 Docker”。(好你个官方😅)
那么 local 是如何管理日志的呢,它是否能满足我们的需求呢。
Local file logging driver | Docker Docs
根据文档我们可以知道,它的 max-size 参数默认为20m,max-file 默认为5并且默认开启日志压缩。这一默认配置已足以满足大多数轻度使用场景;若仍有更高需求,也可根据实际情况适当调大相应参数。
如何更改默认Logging Driver
在启动容器时指定Logging Driver
docker run -d --name your_container_name \
--log-driver local --log-opt max-size=50m --log-opt max-file=10 \
[其他参数] your_image在docker-compose.yml中指定
services:
......
nginx:
image: nginx:stable
logging:
driver: local
options:
max-size: 50m
max-file: 10
......该方法会导致容器被重建,如有重要文件,请先备份。
修改daemon.json
在Debian中,这个文件默认在/etc/docker/daemon.json
在Windows中,可以通过Docker Desktop直接修改。
修改完需要重启Docker后,才能生效。
但是这个方式有个问题,它只对修改后创建的容器生效。
无法重建时的补救办法
如果没有办法重建容器的话,只能写个定时任务,定时去备份、清空容器的日志,避免它撑满硬盘。
稳定运行了几年的容器,谁敢去重建它啊,反正我不敢😂。
在Debian中,默认的日志位置为/var/lib/docker/containers/{容器id}
cp /var/lib/docker/containers/{容器id}/{容器id}-json.log
# 因Linux的机制,无法通过直接删除来解决
echo "" > /var/lib/docker/containers/{容器id}/{容器id}-json.log经验教训
在引入任何新工具时,都应提前评估它的日志等管理策略,避免因其无限增长导致后期无法通过常规方式修复。