docker、containerd、ctr、crictl
docker 和 containerd
- docker 由 docker-client ,dockerd,containerd,docker-shim,runc组成,所以containerd是docker的基础组件之一
- 从k8s的角度看,可以选择 containerd 或 docker 作为运行时组件:其中 containerd 调用链更短,组件更少,更稳定,占用节点资源更少。所以k8s后来的版本开始默认使用 containerd 。
- containerd 相比于docker , 多了 namespace 概念,每个 image 和 container 都会在各自的namespace下可见。
- docker 作为 k8s 容器运行时,调用关系为:kubelet --> dockershim (在 kubelet 进程中) --> dockerd --> containerd
containerd 作为 k8s 容器运行时,调用关系为:kubelet --> cri plugin(在 containerd 进程中) --> containerd
命令区别
- ctr 是 containerd 的一个自带的客户端命令行工具,ctr命令运行的默认 命名空间 是在:default
- crictl 是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序。
crictl缺少对具体镜像的管理能力,crictl是k8s中CRI(容器运行时接口)的客户端,k8s使用该客户端和containerd进行交互,crictl命令运行的默认 命名空间 是在:k8s.io - ctr -v 输出的是 containerd 的版本,crictl -v 输出的是当前 k8s 的版本,从结果显而易见你可以认为 crictl 是用于 k8s 的。
[root@master ~]# ctr -v ctr github.com/containerd/containerd v1.6.19 [root@master ~]# crictl -v crictl version v1.26.0
- 一般来说你某个主机安装了 k8s 后,命令行才会有 crictl 命令。而 ctr 是跟 k8s 无关的,你主机安装了 containerd 服务后就可以操作 ctr 命令。
- 注意点:
- ctr比较严格,需要完整的URL路径:docker.io/library/[镜像名称]:[tag]
# 不指定命名空间拉取镜像 ctr image pull docker.io/library/redis:latest # crictl 查看镜像情况(查不到上面拉取的镜像) crictl image ls # ctr 查看镜像情况(可以查到上面拉取的镜像) ctr image ls
- ctr比较严格,需要完整的URL路径:docker.io/library/[镜像名称]:[tag]
常用命令
镜像相关
命令 | docker | crictl(k8s) | ctr(containerd) |
---|---|---|---|
查看镜像列表 | docker images | crictl images | ctr -n k8s.io i ls |
查看镜像详情 | docker inspect IMAGE-ID | crictl inspecti IMAGE-ID | 无 |
拉取镜像 | docker pull | crictl pull | ctr -n k8s.io i pull |
推送镜像 | docker push | 无 | ctr -n k8s.io i push |
删除镜像 | docker rmi | crictl rmi | ctr -n k8s.io i rm |
导入镜像 | docker load | 无 | ctr image import |
导出镜像 | docker save | 无 | ctr image export |
修改镜像标签 | docker tag | 无 | ctr image tag |
容器相关
命令 | docker | crictl(k8s) | ctr(containerd) |
---|---|---|---|
查看容器列表 | docker ps | crictl ps | ctr task ls/ctr container ls |
查看容器详情 | docker inspect | crictl inspect | ctr container info |
查看容器日志 | docker logs | crictl logs | 无 |
容器内执行命令 | docker exec | crictl exec | 无 |
挂载容器 | docker attach | crictl attach | 无 |
显示容器资源使用情况 | docker stats | crictl stats | 无 |
创建一个新的容器,但不运行 | docker create | crictl create | ctr container create |
启动容器 | docker start | crictl start | ctr -n k8s.io run |
停止容器 | docker stop | crictl stop | 无 |
删除容器 | docker rm | crictl rm | ctr -n k8s.io c del |
运行一个新的容器 | docker run | 无(最小单元为pod) | ctr run |
pod相关
命令 | docker | crictl(k8s) | ctr(containerd) |
---|---|---|---|
查看Pod列表 | 无 | crictl pods | 无 |
查看Pod详情 | 无 | crictl inspectp | 无 |
启动Pod | 无 | crictl runp | 无 |
停止Pod | 无 | crictl stopp | 无 |
删除Pod | 无 | crictl rmp [-f\-a] <POD-ID> | 无 |
注意:
- crictl rmp <POD-ID> # 只能删除已停止的POD
- crictl rmp -f <POD-ID> # 即时POD未停止也强制删除
- crictl rmp -a <POD-ID> # 删除全部POD
- 删除POD会自动删除POD中的容器。
命名空间相关
命令 | docker | crictl(k8s) | ctr(containerd) |
---|---|---|---|
查看命名空间 | 无 | 无 | ctr ns ls |
指定命令运行命令 | 无 | 无 | ctr -n 命名空间名称(如: k8s.io) 命令(如:image ls) |
ctr(containerd)命令总结
- 下载镜像:ctr image pull docker.io/library/redis:alpine3.13
- 查看镜像:ctr images ls 可以简写成: ctr i ls
- 运行容器:ctr run -d docker.io/library/redis:alpine3.13 redis
- 查看容器运行信息:ctr container ls
- 查看容器运行状态:ctr task ls
(其实是查看任务,这个跟 ctr container ls 是分开的) - 进入容器:ctr container exec -t --exec-id redis-sh redis sh
(--exec-id redis-sh意思是: 进入容器时的一个名称,是唯一不能重复使用的,如果发送断开再用这个名称就报错了,只能用另外一个名称) - 暂停容器:ctr task pause redis
- 恢复容器为启动状态:ctr tasks resume redis
- 停止容器:ctr task kill redis
停止的容器是不能恢复启动状态的 - 删除容器:ctr task delete redis
只有停止的容器才能删除(所以要先停止容器,再来操作删除容器)