ctr 是 containerd 提供的用于直接管理 containerd 容器的命令行工具。它有一个非常重要的特性:Namespace(命名空间)。这与你熟悉的 Docker 命令有着显著区别。
ctr 预设了三个特殊的 namespace:
- default:使用
ctr 命令创建容器时默认使用的命名空间。
- k8s.io:这是 Kubernetes 调度 Pod 到节点时,通过 containerd 创建的容器所属的命名空间。
- moby:这是 Docker 引擎(当使用 containerd 作为后端时)创建的容器所属的命名空间。
因此,当你在 Kubernetes 的工作节点上使用 ctr 查看容器却一无所获时,很可能是因为你忘记了指定 -n k8s.io 这个命名空间参数来进行查询。
namespace 命令
管理命名空间的基础命令如下:
ctr ns ls
ctr ns create test
ctr ns rm test
image
镜像相关的操作。你可以使用 ctr image,也可以简写为 ctr i。
ctr -n test image ls
ctr image pull # 拉取镜像
ctr image tag # 为镜像打标签
ctr image rm # 删除镜像
ctr image export # 将镜像导出为压缩包
ctr image import # 从压缩包导入镜像
容器
以下是容器的基本管理命令:
# 创建容器
ctr container create docker.io/library/nginx:alpine nginx
# 列出容器
ctr container ls
# 查看容器详情
ctr container info nginx
# 删除容器
ctr container rm nginx
这里需要特别注意:ctr 命令中的 container 概念与 Docker 命令中的 container 有所不同。
在 Docker 中,一个 container 通常对应一个正在运行的进程。而在 ctr 中,执行 ctr container create 后创建的只是一个“容器对象”,它并非处于运行状态。在 ctr 的语境里,真正运行中的容器实例被称为 task。
task
task 命令用于管理容器的运行时状态。
# 启动容器
ctr task start -d nginx
# 列出运行中的容器
ctr task ls
# 查看容器的运行时指标
ctr task metrics nginx
# 查看容器内所有进程在宿主机上的 PID
ctr task ps nginx
# 进入容器执行命令。--exec-id 是附加的进程ID,可以任意指定(如0),但需确保在当前容器内唯一。
ctr task exec --exec-id 0 -t nginx sh
# 暂停容器
ctr task pause nginx
# 恢复已暂停的容器
ctr task resume nginx
#停止容器
ctr task kill nginx
# 删除容器运行实例(task)
ctr task rm nginx
crictl
crictl 是一个兼容 CRI(容器运行时接口)的命令行工具,由 Kubernetes 社区提供。它与 containerd 本身没有直接绑定关系,主要用于检查和调试 Kubernetes 节点上的任何 CRI 兼容的容器运行时(如 containerd、CRI-O)及其上的应用。这对于 Kubernetes 集群的 运维与调试 至关重要。
与 ctr 不同,crictl 在设计上没有命名空间(namespace)的概念,它会直接列出通过 CRI 接口管理的所有资源。
pod命令
由于面向 Kubernetes 环境,crictl 提供了一些与 Pod 相关的操作命令。
# 打印所有 Pod 的清单
crictl pods
# 根据名称过滤打印 Pod
crictl pods --name nginx-xxxxxxxxxx
# 根据标签过滤打印 Pod
crictl pods --label run=nginx
镜像命令
镜像管理命令与 Docker 类似。
# 列出镜像
crictl images
# 根据镜像仓库名过滤
crictl images nginx
# 拉取镜像
crictl pull busybox
容器命令
容器管理命令也与 Docker 命令高度相似。
crictl ps -a # 列出所有容器
crictl ps # 列出运行中的容器
# 在容器内执行命令
crictl exec -i -t 容器id ls
# 查看容器日志
crictl logs 容器id
# 启动容器
crictl start 容器id
总结
总而言之,ctr 和 crictl 都是容器运行时层面的管理工具,因此它们都不具备构建(build)镜像的功能。构建镜像属于研发阶段,你可以参考另一篇关于 nerdctl + buildkit 的文章,或者直接使用 Docker。
简单来说,ctr 是 containerd 的“原生”管理工具,更底层,包含 namespace 隔离概念;而 crictl 是 Kubernetes 生态的调试工具,专为查看和操作通过 CRI 接口管理的 云原生 资源(Pod、容器等)设计。理解两者的定位和区别,能帮助你在不同场景下选择更合适的工具。如果你想了解更多容器技术和实践,欢迎到 云栈社区 与其他开发者交流探讨。