1. 概述
在使用 containerd 运行容器化工作负载时,如果遇到问题,通常第一反应是查看日志。但与 Docker 不同,containerd 本身并没有提供一个开箱即用的日志查看机制,这给调试带来一定挑战。
本文将介绍如何通过常用客户端如 nerdctl 和 crictl 查看 containerd 服务日志以及容器日志,方便快速定位问题。
2. containerd 的日志存储位置
containerd 本质上是一个守护进程(daemon),通常以两种方式运行:
✅ 作为 systemd 服务运行:在这种情况下,其日志由 systemd 的 journald 统一管理。
✅ 在终端中直接运行:日志输出到标准输出(stdout/stderr)。
对于容器本身产生的日志,containerd 并不直接负责存储和管理,这部分日志通常由上层客户端(如 nerdctl、crictl)或 Kubernetes 的 kubelet 来处理。
3. 查看 containerd 自身日志
3.1 使用 journalctl 查看日志
大多数现代 Linux 系统都使用 systemd 来管理服务,containerd 也不例外。我们可以使用 journalctl
命令查看其日志:
# 查看 containerd 最近日志
journalctl -xeu containerd.service
也可以查看特定时间段的日志,比如最近 40 分钟:
journalctl -xeu containerd --since "40 min ago"
⚠️ 注意:这些命令只在 containerd 作为 systemd 服务运行时有效。如果不是,需要先配置 systemd 服务。
3.2 直接运行 containerd 查看日志
如果你是手动启动 containerd,可以直接运行:
containerd
此时日志会实时输出到终端。如果想后台运行并保存日志到文件:
containerd > containerd.log 2>&1 &
之后可以用 tail
或 less
查看日志内容:
tail -f containerd.log
这种方式适合调试时使用。
4. 查看容器日志
containerd 本身不提供查看容器日志的功能,需要借助客户端工具来实现。以下是几种常见方式。
4.1 使用 nerdctl 查看日志
nerdctl 是一个兼容 Docker 命令风格的 containerd 客户端,支持查看容器日志。
安装完成后,使用以下命令查看日志:
nerdctl logs <容器名或ID>
要实时查看日志流:
nerdctl logs -f <容器名或ID>
⚠️ 注意:nerdctl 只会为使用 -d
参数启动的容器记录日志。
日志文件默认存储在 /var/lib/nerdctl/
目录下。
4.2 使用 crictl 查看日志
crictl 是 Kubernetes CRI(容器运行时接口)的调试工具,也支持直接与 containerd 交互。
安装完成后,使用如下命令查看日志:
crictl logs <容器名或ID>
实时查看日志:
crictl logs -f <容器名或ID>
相比 nerdctl,crictl 的日志功能更稳定,适合用于生产环境调试。
4.3 查看 /var/log/containers 目录下的日志文件
在 Kubernetes 环境中,kubelet 负责管理节点上的容器日志,并将它们保存在 /var/log/containers
目录下。
日志文件的命名格式如下:
/var/log/containers/<pod_name>_<namespace>_<container_name>-<container_id>.log
例如,查看名为 ecommerce-backend
的容器日志:
cat /var/log/containers/backend_public_ecommerce-backend-545wt6s8fd8s7df8sd7af68.log
文件名中的 container_id
是一个唯一标识符,确保每个容器实例的日志都能独立保存。
5. 总结
本文介绍了如何查看 containerd 的服务日志和容器日志:
- ✅ containerd 自身日志可通过
journalctl
或直接运行命令查看。 - ✅ 容器日志需借助客户端工具如 nerdctl、crictl 或通过
/var/log/containers
文件查看。 - ⚠️ 注意不同客户端对日志的支持情况,尤其是 nerdctl 需要用
-d
参数启动容器才能记录日志。
掌握这些方法,有助于在排查容器运行问题时更快定位原因,避免踩坑。