一、为什么要学 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 运行时排障时,就不容易停留在“只会照着命令敲”的层面。