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
      

常用命令

镜像相关

命令 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
    只有停止的容器才能删除(所以要先停止容器,再来操作删除容器)
posted @ 2023-05-19 09:17  嘸杺  阅读(2048)  评论(0)    收藏  举报