大家好,今天我们来聊一个在 Docker 世界里“不说没人问,一问吓一跳”的话题——容器日志。
大家是否遇到过这样的场景:服务器突然收到磁盘空间不足的告警,排查半天,最后发现是 /var/lib/docker/containers 目录下的某个日志文件已经膨胀到了几十个 G?别笑,这绝对是真实发生过的“惨案”。尤其是在使用较新版本的 Docker(例如 28.0.1 版本)时,默认的日志驱动 json-file 并不会自动进行日志轮转(Log Rotation)。这意味着,如果不加配置,容器的标准输出日志会无限制地写入一个 json.log 文件,直到占满整个磁盘。
今天,我就手把手带大家彻底解决这个“定时炸弹”,为大家的 Docker 守护进程配置一个全局的、一劳永逸的日志轮转策略。
为什么默认配置是个“坑”?
Docker 的默认日志驱动是 json-file。这个驱动会将容器的所有标准输出(stdout)和标准错误(stderr)捕获,并以 JSON 格式写入到宿主机的一个文件中。这个文件通常位于:
/var/lib/docker/containers/[container-id]/[container-id]-json.log
问题的关键在于:默认情况下,Docker 不会限制这个文件的大小,也不会限制文件的数量。对于那些日志输出频繁的应用(比如一个开启了 DEBUG 模式的 Web 服务),这个文件会在短时间内迅速增长,最终成为磁盘空间的“吞噬者”。
解决方案:配置 Docker 守护进程 daemon.json
解决这个问题的最佳实践,不是为每个容器单独指定日志参数,而是在 Docker 守护进程层面进行全局配置。这样,所有新创建的容器都会自动继承这个策略。我们需要修改或创建 Docker 的配置文件 daemon.json。
在大多数 Linux 系统上,这个文件位于 /etc/docker/daemon.json。如果它不存在,请直接创建一个。
第一步:编辑配置文件
使用我们喜欢的编辑器打开文件:
sudo nano /etc/docker/daemon.json
第二步:添加日志轮转配置
在文件中添加以下内容。这是一个非常推荐的配置,我们可以根据自己的需求调整其中的数值。
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
让我们来解读一下这些配置项:
"log-driver": "json-file": 明确指定使用json-file驱动。虽然这是默认项,但显式声明是一个好习惯。"log-opts": 这是配置日志驱动选项的关键。"max-size": "100m": 设置单个日志文件的最大体积。当日志文件达到 100MB 后,Docker 会自动进行轮转,生成一个新的文件。我们可以使用k(KB)、m(MB)、g(GB)作为单位。"max-file": "3": 设置保留的轮转日志文件的最大数量。在这个例子中,Docker 会保留最多 3 个日志文件。当文件数量超过 3 个后,最旧的那个将被删除。
这个配置意味着什么?
对于任何一个容器,它的日志最多会占用 100MB * 3 = 300MB 的磁盘空间。这是一个非常合理且安全的限制,既能保证我们有足够的日志进行问题排查,又避免了磁盘被无限占用的风险。
第三步:重启 Docker 服务使配置生效
保存并关闭 daemon.json 文件后,最重要的一步是重启 Docker 守护进程,让配置生效。
# 重启 Docker 服务
sudo systemctl restart docker
# 如果系统没有 systemctl,可以尝试
# sudo service docker restart
第四步:验证配置
如何确定我们的配置已经成功应用了呢?
可以运行 docker info 命令,然后查看 Logging Driver 和 Log Options 相关的部分。
docker info | grep -A 3 "Logging Driver"
应该能看到类似下面的输出,证明全局配置已经生效:
Logging Driver: json-file
Log Options:
max-file: 3
max-size: 100m
重要提醒:配置只对新容器生效!
请务必记住:daemon.json 的修改只对之后新创建的容器有效,对已经存在的容器是无效的!
那么如何处理那些已经在运行的“老”容器呢?
-
最佳方式:重新创建容器 这是最简单、最可靠的方法。如果应用是通过
docker-compose管理的,那就再简单不过了:# 进入 docker-compose.yml 所在目录 docker-compose up -d --force-recreate如果容器是手动通过
docker run启动的,要先stop和rm旧容器,然后用相同的命令重新run一个新的。 -
临时急救:手动清理日志 如果暂时无法重启容器,但又急需释放空间,可以手动清理日志文件。注意:这只是权宜之计,治标不治本!
首先,找到占用空间最大的日志文件:
# 查找大于 1GB 的日志文件 sudo find /var/lib/docker/containers -name "*-json.log" -size +1G -print然后,清空它(直接
rm文件可能会导致问题,推荐使用truncate):# 警告:此操作会清空日志,请谨慎使用! sudo truncate -s 0 /var/lib/docker/containers/[container-id]/[container-id]-json.log
结论
配置 Docker 日志轮转是一个看似微小但极其重要的运维实践。它就像是为我们的服务器磁盘买了一份保险,能够有效地防止因日志无限增长而导致的灾难性故障。
花上两分钟,检查一下 /etc/docker/daemon.json 文件吧!如果还是空的,赶紧把我们今天分享的配置加上去。这个简单操作,可能会在未来的某一天,省去数小时的紧急排错时间和不必要的损失。