Containerd 客户端工具 ctr、crictl 和 nerdctl
·
Containerd 客户端工具
containerd 的客户端工具有 ctr、crictl 和 nerdctl,三者定位与适用场景差异显著:
ctr:👉 containerd 官方底层工具,适用于调试/学习,不适合 K8s 运维和日常运行容器crictl:👉 Kubernetes 专用 CRI 工具,排障必备,不能 创建容器、不能execnerdctl:👉 Docker CLI 替代品,日常使用最顺手
核心定位对比
| 工具 | 官方定位 | 面向对象 | 是否推荐使用 |
|---|---|---|---|
| ctr | containerd 原生 CLI | containerd 开发者 | 不推荐 |
| crictl | CRI 调试工具 | Kubernetes 运维 | 仅排障 |
| nerdctl | Docker CLI 兼容工具 | 运维 / 开发 | 强烈推荐 |
🔍 三大工具核心能力对比
| 对比项 | ctr | crictl | nerdctl |
|---|---|---|---|
| 直接操作 containerd | ✅ | ❌(走 CRI 协议) | ✅ |
| 支持 Kubernetes | ❌ | ✅ | ⚠️(需指定 namespace) |
| 兼容 Docker 命令习惯 | ❌ | ❌ | ✅ |
| 支持 Compose | ❌ | ❌ | ✅(nerdctl compose) |
| 镜像构建(build) | ⚠️(需 buildctl) | ❌ | ✅ |
| 镜像推/拉/登录 | ⚠️(需额外配置) | ❌ | ✅ |
| 存储卷/网络管理 | ⚠️/❌ | ❌/❌ | ✅/✅ |
| Rootless 模式 | ❌ | ❌ | ✅ |
| Namespace 概念 | 强制指定 | 自动隐藏 | 自动处理 |
| 学习成本 | ⭐⭐⭐⭐(高) | ⭐⭐⭐(中) | ⭐(低) |
💡 关键细节解读:Namespace(90% 的坑都在这)
containerd 用 namespace 做资源隔离,三个工具的默认 namespace 完全不同,是最易踩坑点:
ctr/nerdctl默认使用default命名空间,看不到 Kubernetes 容器crictl默认走k8s.io命名空间,能直接看到 Pod 容器- 如需用
ctr/nerdctl查看 Kubernetes 容器,必须手动指定-n k8s.io
命令示例(运维高频场景)
# 1. 查看普通容器(default 命名空间)
ctr containers ls
# 2. 查看 K8s 容器(指定 k8s.io 命名空间)
ctr -n k8s.io containers ls
# 3. crictl 直接查看 K8s 容器(无需指定 namespace)
crictl ps
# 4. nerdctl 查看 K8s 容器(需手动指定 namespace)
nerdctl -n k8s.io ps
常见命令对照表(运维最常用)
| 需求场景 | Docker 命令 | nerdctl 命令 | crictl 命令 | ctr 命令 |
|---|---|---|---|---|
| 查看运行中容器 | docker ps |
nerdctl ps |
crictl ps |
ctr containers ls(简写:ctr c ls) |
| 查看本地镜像 | docker images |
nerdctl images |
crictl images |
ctr images ls(简写:ctr i ls) |
| 进入容器终端 | docker exec -it <容器ID> sh |
nerdctl exec -it <容器ID> sh |
❌ 不支持 | ❌ 不支持 |
| 查看容器日志 | docker logs <容器ID> |
nerdctl logs <容器ID> |
crictl logs <容器ID> |
❌ 不支持 |
| 拉取镜像 | docker pull <镜像名> |
nerdctl pull <镜像名> |
crictl pull <镜像名> |
ctr images pull <镜像名>(简写:ctr i pull) |
| 构建镜像 | docker build -t <标签> . |
nerdctl build -t <标签> . |
❌ 不支持 | ❌ 不支持 |
全量命令对照表(镜像+容器+交互)
| 操作场景 | Docker 命令 | ctr (containerd 原生) | crictl (Kubernetes CRI) |
|---|---|---|---|
| 镜像管理 | |||
| 查看本地镜像 | docker images |
ctr image ls |
crictl images |
| 拉取镜像 | docker pull <镜像名> |
ctr image pull <镜像名> |
crictl pull <镜像名> |
| 推送镜像 | docker push <镜像名> |
ctr image push <镜像名> |
❌ 不支持 |
| 删除镜像 | docker rmi <镜像ID> |
ctr image rm <镜像ID> |
crictl rmi <镜像ID> |
| 导入镜像(从 tar 包) | docker load -i <文件.tar> |
ctr image import <文件.tar> |
❌ 不支持 |
| 导出镜像(为 tar 包) | docker save -o <文件.tar> <镜像> |
ctr image export <文件.tar> <镜像> |
❌ 不支持 |
| 修改镜像标签 | docker tag <源> <目标> |
ctr image tag <源> <目标> |
❌ 不支持 |
| 容器生命周期 | |||
| 创建容器 | docker create |
ctr container create |
crictl create |
| 运行容器 | docker run |
ctr run |
❌ 不支持(K8s 最小单元为 Pod) |
| 删除容器 | docker rm <容器ID> |
ctr container rm <容器ID> |
crictl rm <容器ID> |
| 查看运行中容器 | docker ps |
ctr task ls / ctr container ls |
crictl ps |
| 启动已停止容器 | docker start <容器ID> |
ctr task start <容器ID> |
crictl start <容器ID> |
| 停止运行容器 | docker stop <容器ID> |
ctr task kill <容器ID> |
crictl stop <容器ID> |
| 容器交互与监控 | |||
| 在容器内执行命令 | docker exec -it <容器ID> sh |
❌ 不支持 | crictl exec -it <容器ID> sh |
| 查看容器详情 | docker inspect <容器ID> |
ctr container info <容器ID> |
crictl inspect <容器ID> |
| 查看容器日志 | docker logs <容器ID> |
❌ 不支持 | crictl logs <容器ID> |
| 查看容器资源占用 | docker stats <容器ID> |
❌ 不支持 | crictl stats <容器ID> |
工具详解
1. ctr & crictl
- ctr:containerd 官方提供的原生客户端工具,深度绑定 containerd 底层能力。
- crictl:CRI 兼容的容器运行时命令行工具,与 containerd 无强关联,由 kubernetes-sigs 维护,专用于 K8s 节点容器运行时调试。
crictl 配置示例
https://kubernetes.io/docs/tasks/debug/debug-cluster/crictl/
# 查看 crictl 配置文件
cat /etc/crictl.yaml
# 典型配置内容
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: true
SIGs 介绍
https://github.com/kubernetes-sigs
Special Interest Groups (SIGs) 是 Kubernetes 社区内的子组,专注于 Kubernetes 开发的特定领域或领域。它们由对项目的特定方面有共同兴趣的个人和组织组成。SIG 负责推动设计提案、审查和批准新功能、维护和发展现有功能,以及为更广泛的 Kubernetes 社区提供指导和支持。
ctr 导入镜像示例
# 导入本地 tar 包镜像
ctr image import flannel-v0.27.4.tar
# 查看导入后的镜像
ctr image ls
2. nerdctl
2.1 介绍
nerdctl 是 Docker 兼容的 Containerd CLI 工具,支持 Compose,命令语法与 Docker 高度一致,学习成本低,为 containerd 官网推荐工具。
- 项目地址:https://github.com/containerd/nerdctl
- 发布包类型:
- Minimal:仅含 nerdctl 二进制 + rootless 辅助脚本
- Full:全量包,包含 Containerd、CNI、runc、BuildKit 等完整组件
2.2 单机安装(替代 Docker)
# 下载版本(以 2.2.1 为例)
VERSION=2.2.1
wget https://github.com/containerd/nerdctl/releases/download/v${VERSION}/nerdctl-full-${VERSION}-linux-amd64.tar.gz
# 查看包内容
tar tf nerdctl-full-${VERSION}-linux-amd64.tar.gz
# 解压安装(至 /usr/local)
tar Cxvf /usr/local nerdctl-full-${VERSION}-linux-amd64.tar.gz
# 查看帮助
nerdctl --help
2.3 K8s 集群中安装使用
# 所有节点执行(下载 Minimal 包)
VERSION=2.2.1
# 直接下载
wget https://github.com/containerd/nerdctl/releases/download/v${VERSION}/nerdctl-${VERSION}-linux-amd64.tar.gz
# 加速下载(可选)
wget https://mirror.ghproxy.com/https://github.com/containerd/nerdctl/releases/download/v${VERSION}/nerdctl-${VERSION}-linux-amd64.tar.gz
# 解压安装(至 /usr/local/bin)
tar xf nerdctl-${VERSION}-linux-amd64.tar.gz -C /usr/local/bin/
# 方式1:手动指定 namespace 查看 K8s 容器/镜像
nerdctl -n k8s.io images
nerdctl -n k8s.io ps
# 方式2:配置默认 namespace(无需每次指定 -n k8s.io)
mkdir /etc/nerdctl/
cat > /etc/nerdctl/nerdctl.toml << EOF
namespace = "k8s.io" # 默认命名空间
debug = false
debug_full = false
insecure_registry = true # 启用非安全镜像仓库
EOF
# 导入镜像(指定/默认 namespace)
nerdctl load -i flannel-v0.26.7.tar # 默认 namespace
nerdctl -n k8s.io load -i flannel-v0.26.7.tar # K8s namespace
2.4 常见问题:CNI 版本不兼容
问题现象:创建容器时报错 incompatible CNI versions
新版已无此问题
nerdctl run -d --name nginx -p 80:80 nginx:alpine
# 报错:plugin type="bridge" failed (add): incompatible CNI versions
解决方法:
# 查看 containerd 配置的 CNI 目录
grep cni /etc/containerd/config.toml # 通常为 /opt/cni/bin
[plugins."io.containerd.grpc.v1.cri".cni]
bin_dir = "/opt/cni/bin"
conf_dir = "/etc/cni/net.d"
cni_conf_dir = ""
cni_max_conf_num = 0
cni_conf_dir = ""
cni_max_conf_num = 0
cni_conf_dir = ""
cni_max_conf_num = 0
# 备份原有 CNI 插件
mv /opt/cni/bin/ /srv/
# 下载新版 CNI 插件(v1.1.1 为例)
wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz
tar xf cni-plugins-linux-amd64-v1.1.1.tgz -C /opt/cni/bin/
# 重新创建容器
nerdctl rm -f nginx
nerdctl run -d --name nginx -p 80:80 nginx:alpine
# 验证运行状态
nerdctl ps
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)