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  嘸杺  阅读(1311)  评论(0编辑  收藏  举报