Containerd 客户端命令行工具入门教程

1. 工具介绍

当我们的容器进行时从 Docker 切换为 Containerd 后,需要从 docker 命令行切换到 Containerd 的命令行。常见的 Containerd 客户端命令行有 ctr 和 crictl。

1.1 ctr

Containerd 客户端命令行工具入门教程

ctr 是 containerd 官方的命令行工具,功能相对简单,可以实现拉取镜像 创建容器等功能;

需要注意的是,ctr 支持选择 namespace,这个 namespace 不是 kubernetes 里面的 namespace,而是 containerd 中的 namespace,一个 namespace 里面的镜像、容器等资源,在另一个 namespace 里面是看不到的。

默认情况下操作的 都是 default namespace 中的容器和镜像资源,kubernetes 集群中的容器、镜像等资源都放置在 k8s.io 这个 namespace 中。

我们可以使用 -n namespace 来指定操作的是哪个 namespace,也可以使用 ctr namespace ls 查看有哪些 namespace。比如,加上 -n k8s.io 选项之后就可以查看 kubernetes 中的容器和镜像资源了。

1.2 crictl

Containerd 客户端命令行工具入门教程

crictl 是 kubernetes cri-tools 的一部分,是专门为 kubernetes 使用 containerd 而专门制作的,提供了 Pod、容器和镜像等资源的管理命令。

需要注意的是:使用其他非 kubernetes 创建的容器、镜像,crictl 是无法看到和调试的,比如说 ctr run 在未指定 namespace 情况下运行起来的容器就无法使用 crictl 看到。当然 ctr 可以使用 -n k8s.io 指定操作的 namespace 为 k8s.io,从而可以看到/操作 kubernetes 集群中容器、镜像等资源。可以理解为:crictl 操作的时候指定了 containerd 的 namespace 为 k8s.io。

2. 工具使用

2.1 命令对比

ctr 中假如没有指定 -n k8s.io 则表示查看非 kubernetes 中的容器、镜像资源,ctr 中指定了 -n k8s.io 则表示查看 kubernetes 中的容器、镜像资源。

crictl 命令默认就是获取 k8s.io namespace 下面的资源信息。

命令dockercrictlctr
查看容器列表docker pscrictl psctr container ls(查看非 kubernetes 中的容器)ctr -n k8s.io container ls(查看 kubernetes 集群中的容器)
查看容器详情docker inspectcrictl inspectctr container info
查看容器日志docker logscrictl logs
容器内执行命令docker execcrictl execctr task exec
挂载容器docker attachcrictl attachctr task attach
显示容器资源使用情况docker statscrictl stats
创建容器docker createcrictl createctr container create
启动容器docker startcrictl startctr task start(请看使用示例)
运行容器docker runcrictl runctr run
停止容器docker stopcrictl stopctr task kill (请看使用示例)
删除容器docker rmcrictl rmctr container rm
查看docker/containerd系统信息docker infocrictl info
查看镜像列表docker imagescrictl imagesctr image ls
查看镜像详情docker inspectcrictl inspecti
导入镜像docker loadctr image import
导出镜像docker savectr image export
拉取镜像docker pullcrictl pullctr image pull(请看使用示例)
推送镜像docker pushctr image push(请看使用示例)
tag 镜像docker tagctr image tag(请看使用示例)
删除镜像docker rmicrictl rmictr image rm
查看Pod列表crictl pods
查看Pod详情crictl inspectp
启动Podcrictl runp
停止Podcrictl stopp

2.2 使用示例

2.2.1 查看镜像


# 查看默认 namespace 中的镜像
ctr image ls
# 指定 namespace 为 k8s.io,表示操作的是 kubernetes 集群中的镜像资源
ctr -n k8s.io image ls


# 查看 kubernetes 中的镜像
crictl image

2.1.2 拉取/推送/tag镜像


# 拉取镜像,ctr 拉取时需要指定全路径
ctr image pull docker.io/library/nginx:latest

# 遇到 `http: server gave HTTP response to HTTPS client` 问题时,使用 --plain-http
ctr image pull registry-internal.oecp.aliyuncs.com:5000/oecp/busybox:stable --plain-http

# 指定 namespace 为 k8s.io,表示操作的是 kubernetes 集群中的镜像资源,遇到 ctr image push xxx 时,报错 ctr: content digest sha256:35e28b647bd4976b7cacfaa32b7b253817d0881d77b6cda731ad46a29d08c2cb: not found 问题时,需要添加 --all-platforms 参数
ctr -n k8s.io image pull docker.io/library/nginx:latest --all-platforms

# tag docker.io/library/busybox:1.28 镜像为 172.16.136.18:5000/transwarp/busybox:1.28
ctr images tag docker.io/library/busybox:1.28 172.16.136.18:5000/transwarp/busybox:1.28

# 推送镜像指镜像仓库
ctr images push 172.16.136.18:5000/transwarp/busybox:1.28

# 拉取镜像,会拉取 docker.io/library/nginx:latest 这个镜像
crictl pull nginx

2.1.3 导入/导出镜像

# 导入镜像,指定 namespace 为 k8s.io,表明镜像导入是为了 k8s 集群使用的,若是不加 namespace,默认是 default 租户,k8s 下 pod 无法使用到镜像
# 格式为 ctr image import <image-filename>
ctr -n k8s.io image import antrea-ovs.tar

# 导出镜像,可以上传到其他节点使用
# 格式为 ctr image export <output-filename> <image-name>
ctr -n k8s.io image export pause.tar registry.aliyuncs.com/google_containers/pause:3.6

2.1.4 删除镜像


# ctr 删除 docker.io/library/nginx:latest 这个镜像
ctr image rm docker.io/library/nginx:latest


# crictl 删除 nginx 镜像,删除的是 docker.io/library/nginx:latest 这个镜像
crictl rmi nginx

2.1.5 查看容器


# ctr 查看容器,无 -a 选项
# 这里的 contaienr 和 task 是有区别的:
# 1. container 对象是指包含了一个容器所需要的资源及配置的数据结构,并没有处于运行状态,是一个静态容器。
#    这个时候 namespaces(containerd 中的,非 kubernetes 中的)、rootfs 和容器的配置都已经初始化成功了。
# 2. task 代表任务的意思,是 container 对象运行起来之后的表示。
#        ctr task start CONTAINER_NAME 会真正启动一个容器。
# 容器真正 run 起来之后,会存在 container 和 task 两个对象!
# 查看 container 对象
ctr container ls
# 查看 task 对象,可以看到运行的状态
ctr task ls


# crictl 查看容器,-a 是指查看所有状态
crictl ps
crictl ps -a

2.1.6 启动容器


# 1. 先创建名为 demo_container 的 container 对象
ctr container create docker.io/library/nginx:latest demo_container
# 2. 再紧接着执行 ctr task start 才会真正启动一个容器,container 对象只是一个静态的数据结构。-d 同 docker 中的 -d
ctr task start -d demo_container

# 效果同上,相同将上面两个步骤合为一步,直接启动一个真正的容器,也会有 container 和 task 两个对象
ctr run -d docker.io/library/nginx:latest demo_container


# crictl 无法直接创建一个容器,需要在 sandbox 中创建容器
crictl run container-config.[json|yaml] pod-config.[json|yaml]

2.1.7 删除容器

# 1. 先 kill 掉 task 对象
ctr task kill demo_container
# 2. 再 rm 掉 container 对象
ctr container rm demo_container

# crictl 停止、删除容器
# 1. 先停止掉 container
crictl stop CONTAINER-ID
# 2. rm 掉 container
crictl rm CONTAINER-ID
声明: 本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
Docker

docker-compose.yml文件模板和解析

2024-11-28 10:55:40

Docker

Dockerfile常用命令整理

2024-12-6 9:40:19

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索