🚛 从Docker迁移到Containerd:命令完美适应指南与比较表

大家好!随着Kubernetes生态系统的发展,从Kubernetes v1.24开始,Dockershim已被完全移除。这导致许多工程师不得不从熟悉的Docker运行时“强制”迁移到Containerd运行时。😅

“啊?那现在不能用docker ps了吗?”

是的,没错。在Containerd环境中,由于没有Docker守护进程,所以旧的命令将无法工作。

但别担心!有一些工具提供了与Docker几乎相同的体验。今天,为了那些熟悉Docker CLI的您,我们详细整理了Containerd环境下的生存指南和命令比较。


🛠️ 处理Containerd的3种工具(应该用哪个?)

迁移到Containerd后,命令不再统一,您会根据情况遇到3种工具。首先,我们需要了解它们的本质。

  1. nerdctl (contaiNERD ctl): 👍 强烈推荐
  • 这是一个与Docker CLI语法几乎100%兼容的工具。
  • 它甚至支持docker build和docker-compose功能。
  • 如果您想保留Docker的用户体验,请务必安装并使用它。
  1. crictl (CRI ctl): 🕵️ K8s调试专用
  • 这是一个用于在Kubernetes节点上调试容器运行时接口(CRI)的工具。
  • 它理解Pod概念,主要用于检查Kubernetes节点状态。
  • 不具备镜像构建(build)功能。
  1. 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 sh nerdctl exec -it sh crictl exec -it sh
构建镜像 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后,不必过于担心。策略很简单。

  1. 日常开发/运维时: 安装并使用nerdctl。设置alias docker=nerdctl可以无缝使用。
  2. Kubernetes节点故障排除时: 如果在节点上安装nerdctl有困难,可以使用预装的crictl来查看日志或检查容器状态。
  3. 忘记ctr: 除非进行非常深层次的调试,否则几乎不会用到它。

现在,自信地在Containerd环境中执行命令吧!🚀


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注