容器日志以及如何不丢失它们
Docker 日志存放在哪里,如何限制其大小以免占满磁盘,以及怎样做才能让记录在容器重建后仍然保留。
更新于 2026年8月23日
当服务宕机时,日志是唯一可靠的信息来源。默认情况下,Docker 会将其写入容器旁边的文件,且不限制其大小:一个话多的应用可以在一周内填满整个磁盘。
如何读取
docker logs -f --tail 100 <container>
docker compose logs -f app
docker compose logs --since 30m --timestamps app
docker logs <container> 2>&1 | grep -i error | tail -50
值得记住:Docker 显示的是应用程序写入标准输出和标准错误的内容。如果它写入容器内部的自己的文件,docker logs 将不会显示任何内容——您必须在容器内查找日志或重定向输出。
docker compose exec app ls -la /var/log
立即限制大小
所有容器的全局设置是 /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "20m", "max-file": "3" }
}
sudo systemctl restart docker
该设置适用于重启后创建的容器。正在运行的容器必须重新创建。对于单个服务,同样适用于 Compose:
services:
app:
logging:
driver: json-file
options:
max-size: "20m"
max-file: "3"
结果:每个服务不超过 60 MB,而不是无限增长。
在它让您措手不及之前检查当前大小:
sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail。 您不能用rm修剪正在运行的文件——当 Docker 持有描述符时,空间不会被释放。正确的方法:重新创建容器或sudo truncate -s 0 <file>。
让日志在容器之后存活
日志文件会随容器一起删除。如果历史记录很重要,请将其交给系统日志:
logging:
driver: journald
options:
tag: "myapp"
journalctl -t myapp -n 200 --since today
journalctl -t myapp -p err --since "2 days ago"
journald 会自行轮转记录,并受 /etc/systemd/journald.conf 中的 SystemMaxUse 设置限制。要检查它占用了多少空间:journalctl --disk-usage。
对于多个服务同时运行,将所有内容收集到一个地方更方便——例如,使用一个专用的收集器容器,按天将记录存储在文件中。但请从 journald 开始:它已经存在且不花费任何成本。
调试故障时要注意什么
- 崩溃前的最后 200 行:
docker logs --tail 200 <container>。 - 退出代码:
docker inspect -f '{{.State.ExitCode}} {{.State.OOMKilled}}' <container>。代码 137 和OOMKilled中的true表示内核因内存不足而杀死了进程——请参阅资源限制。 - 机器的系统日志:
sudo dmesg -T | tail -50将显示内存不足杀死和磁盘错误。
常见错误
- 磁盘被日志填满,所有服务都宕机了。 在安装 Docker 之后立即限制大小是必须的。
- 查看已删除容器的日志。 在
docker compose down之后它就消失了。请提前将记录收集到journald中。 - 日志中的机密信息。 应用程序喜欢打印带有密码的连接字符串。任何有权访问该机器的人都可以读取日志。
- 在文本控制台中查找错误。 它总是 80×24,长行会被截断。要读取日志,SSH 或“Screen”控制台更方便。