一、为什么要学 ctr

ctr 更像 Containerd 的底层操作工具,它的特点是:

  • 功能全面
  • 直接对接 Containerd API
  • 适合调试和排障

它的代价也很明显:

  • 命令没有 Docker 那么友好
  • 需要显式理解命名空间
  • 很多操作更偏底层,不适合完全新手直接上来当日常工具

但正因为它足够贴近底层,所以学 Containerd 时非常值得掌握。

二、先理解 ctr 和命名空间的关系

使用 ctr 时,一个非常重要的前提是:很多操作都要显式指定命名空间

例如:

  • default 是默认命名空间
  • k8s.io 通常用于 Kubernetes
  • 你也可以自定义例如 test

这意味着同一台机器上的镜像和容器,不同命名空间之间并不是默认共享视图。

三、ctr 命名空间管理怎么做

Day006 里给出了几条很典型的命名空间管理命令:

ctr ns c test
ctr ns ls
ctr ns label test a=b
ctr ns rm test

这几条命令分别对应:

  • 创建命名空间
  • 列出所有命名空间
  • 给命名空间打标签
  • 删除命名空间

对于需要做底层隔离调试的场景,这组命令非常实用。

四、用 ctr 做镜像管理时最常用哪些命令

ctr 的镜像管理能力覆盖了拉取、删除、打标签、推送、导入导出以及挂载查看内容等多个环节。

4.1 拉取和查看镜像

例如拉取到 test 命名空间:

ctr ns c test
ctr -n test images pull registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.21.6
ctr -n test i ls

这说明镜像是按命名空间隔离视图存放和管理的。

4.2 给镜像打标签

ctr -n test images tag registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.21.6 nginx:1.21.6

4.3 删除镜像

ctr -n test i rm registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.21.6

4.4 推送镜像到仓库

ctr -n test images tag nginx:1.21.6 10.0.0.13/public/nginx:1.21.6
ctr -n test images push 10.0.0.13/public/nginx:1.21.6 --user <user>:<password> --plain-http

这里建议实际使用时把账号密码换成自己的有效凭证,不要把固定密码直接写进可发布文档里。

4.5 导入、导出和挂载镜像

ctr -n test images export nginx.tar nginx:1.21.6
ctr images import nginx.tar

mkdir /mnt/test
ctr -n test images mount nginx:1.21.6 /mnt/test
ctr -n test images unmount /mnt/test

这几组命令很适合:

  • 做离线镜像迁移
  • 排查镜像内容
  • 查看镜像文件系统结构

五、ctr 的容器管理和 Docker 有什么不同

ctr 容器管理更偏底层,它不像 Docker 那样一条 run 就帮你包办很多事情。

原始笔记里展示的是创建一个静态容器:

ctr -n test c create nginx:1.21.6 nginx

然后查看容器:

ctr -n test c ls
ctr -n test c info nginx

最后删除容器:

ctr -n test c rm nginx

这里要特别注意:ctr c create 创建的是容器定义本身,不等于像 Docker 一样自动帮你完成完整的运行时体验。它更适合用来观察容器元数据和底层管理方式。

六、为什么 ctr 更适合排障而不是完全替代 Docker

ctr 的优势在于:

  • 直接查看运行时内部状态
  • 更方便理解命名空间和镜像隔离
  • 对镜像导入导出、挂载分析更直接

但它的局限也很明显:

  • 使用门槛更高
  • 缺乏 Docker 那种“一条命令完成大部分事情”的体验
  • 某些日常操作不如 nerdctl 顺手

所以实战里可以这样理解:

  • 要排底层问题,优先想起 ctr
  • 要做日常操作,nerdctl 往往更顺手

七、学会 ctr 后最值得建立的思维

如果你把 Day006 里关于 ctr 的内容真正吃透,最重要的不是背会多少命令,而是建立下面几个思维:

  • Containerd 世界里“命名空间”是第一优先级概念
  • 镜像、容器和任务的视图都可能受命名空间影响
  • ctr 是底层工具,适合理解运行时原理和排障
  • 导入导出、挂载镜像这些能力非常适合定位镜像和运行时问题

一旦有了这些思维,后面再学 nerdctl 和 Kubernetes 运行时排障时,就不容易停留在“只会照着命令敲”的层面。