大家好!随着Kubernetes生态系统的发展,从Kubernetes v1.24开始,Dockershim已被完全移除。这导致许多工程师不得不从熟悉的Docker运行时“强制”迁移到Containerd运行时。😅
“啊?那现在不能用docker ps了吗?”
是的,没错。在Containerd环境中,由于没有Docker守护进程,所以旧的命令将无法工作。
但别担心!有一些工具提供了与Docker几乎相同的体验。今天,为了那些熟悉Docker CLI的您,我们详细整理了Containerd环境下的生存指南和命令比较。

🛠️ 处理Containerd的3种工具(应该用哪个?)
迁移到Containerd后,命令不再统一,您会根据情况遇到3种工具。首先,我们需要了解它们的本质。
- nerdctl (contaiNERD ctl): 👍 强烈推荐
- 这是一个与Docker CLI语法几乎100%兼容的工具。
- 它甚至支持docker build和docker-compose功能。
- 如果您想保留Docker的用户体验,请务必安装并使用它。
- crictl (CRI ctl): 🕵️ K8s调试专用
- 这是一个用于在Kubernetes节点上调试容器运行时接口(CRI)的工具。
- 它理解Pod概念,主要用于检查Kubernetes节点状态。
- 不具备镜像构建(build)功能。
- ctr: 🔧 低级别(不推荐)
- 这是Containerd自身内置的默认CLI。
- 不用户友好,仅用于调试。(几乎不会用到。)
📊 Docker vs nerdctl vs crictl 命令比较表
我们主要比较了最常用的功能。看看nerdctl与Docker有多么相似!
| 功能 | Docker (原有) | nerdctl (推荐) | crictl (K8s 调试) | 备注 |
| — | — | — | — | — |
| 版本检查 | docker version | nerdctl version | crictl version | |
| 镜像列表 | docker images | nerdctl images | crictl images | |
| 拉取镜像 | docker pull |
nerdctl pull |
crictl pull |
|
| 删除镜像 | docker rmi |
nerdctl rmi |
crictl rmi |
|
| 容器列表 | docker ps | nerdctl ps | crictl ps | crictl也显示Pod信息 |
| 所有容器 | docker ps -a | nerdctl ps -a | crictl ps -a | |
| 运行容器 | docker run -d … | nerdctl run -d … | ❌ 不支持 | crictl需要在创建Pod后运行 |
| 查看日志 | docker logs |
nerdctl logs |
crictl logs |
|
| 进入容器 | docker exec -it |
nerdctl exec -it |
crictl exec -it |
|
| 构建镜像 | docker build . | nerdctl build . | ❌ 不支持 | 最大区别 |
| 删除容器 | docker rm |
nerdctl rm |
crictl rm |
|
| 查看信息 | docker inspect |
nerdctl inspect |
crictl inspect |
|
| 事件监控 | docker events | nerdctl events | crictl events |
—
🧐 核心要点深度分析
除了简单的命令差异,还有一些必须了解的重要概念。
1. 命名空间 (Namespace) 的陷阱 🕳️
Docker通常向用户隐藏命名空间,但Containerd明确区分命名空间。
- Docker: 用户无需关心命名空间。
- Kubernetes (k8s.io): Kubernetes创建的容器存储在k8s.io命名空间中。
- 问题: 如果直接使用ctr或nerdctl,可能看不到Kubernetes容器!
解决方案:
# 如果想查看Kubernetes容器?
nerdctl --namespace k8s.io ps
# 或者
ctr -n k8s.io container list
(注意: crictl默认遵循k8s配置,因此无需指定命名空间。)
2. 镜像构建 (Build) 🏗️
有时需要在Kubernetes节点上构建镜像。
- crictl: 不具备构建功能。
- nerdctl: 内置BuildKit,可以像docker build一样构建Dockerfile。
# 使用nerdctl构建镜像
nerdctl build -t my-app:v1 .
3. Pod概念支持 (crictl) 📦
crictl支持Docker中没有的Pod相关命令。这对于Kubernetes故障排除非常有用。
# 查看运行中的Pod列表
crictl pods
# 查看特定Pod的信息
crictl inspectp <pod-id>
💡 结论与推荐策略
运行时切换到Containerd后,不必过于担心。策略很简单。
- 日常开发/运维时: 安装并使用nerdctl。设置alias docker=nerdctl可以无缝使用。
- Kubernetes节点故障排除时: 如果在节点上安装nerdctl有困难,可以使用预装的crictl来查看日志或检查容器状态。
- 忘记ctr: 除非进行非常深层次的调试,否则几乎不会用到它。
现在,自信地在Containerd环境中执行命令吧!🚀
发表回复