一、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 的一个客户端工具。 -
crictl
是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序。 -
ctr -v
输出的是 containerd 的版本,crictl -v
输出的是当前 k8s 的版本,从结果显而易见你可以认为 crictl 是用于 k8s 的。
[root@localhost test]# ctr -v
ctr github.com/containerd/containerd v1.4.11
[root@localhost test]# crictl -v
crictl version v1.21.0-k3s1
一般来说你某个主机安装了 k8s 后,命令行才会有 crictl 命令。而 ctr 是跟 k8s 无关的,你主机安装了 containerd 服务后就可以操作 ctr 命令。
三、Docker和Containerd两种容器引擎常用命令对比
功能 | crictl CLI(Containerd容器)推荐
|
ctr CLI(Containerd容器) | docker CLI(Docker容器) |
---|---|---|---|
镜像列举 | crictl images | ctr image ls | docker images |
导出镜像 | ctr image export app.tar weiyigeek.top/app:1.2.0 | docker save -o app.tar app:1.2.0 | |
导入镜像 | ctr image import app.tar | docker load -i app.tar | |
拉取镜像 | crictl pull redis:latest | ctr -n k8s.io images pull docker.io/library/redis:latest | docker pull redis:latest |
上传镜像 | crictl push redis:latest | ctr -n k8s.io images push docker.io/library/redis:latest | docker push redis:latest |
更改标记 | ctr -n k8s.io images tag docker.io/library/redis:latest weiyigeek.top/redis:latest | docker tag redis:latest weiyigeek.top/redis:latest | |
删除镜像 | crictl rmi redis:latest | ctr -n k8s.io images rm docker.io/library/redis:latest | docker rmi redis:latest |
创建容器 | crictl create | ctr -n k8s.io container create docker.io/library/redis:latest redis | docker create --name redis redis:latest |
创建并运行容器 | ctr -n k8s.io run -d --env name=WeiyiGeek weiyigeek.top/app:1.2.0 app | docker run -d --name app weiyigeek.top/app:1.2.0 | |
查看容器 | crictl ps | ctr -n k8s.io container list | docker ps |
启动容器 | crictl start | ctr -n k8s.io task start app | docker start app |
暂停容器 | ctr -n k8s.io task pause app | docker pause app | |
停止容器 | crictl stop | ctr -n k8s.io task kill app | docker stop app |
删除容器 | crictl rm | ctr -n k8s.io container rm [-f] app | docker rm [-f] app |
容器详情 | crictl inspect app | ctr -n k8s.io c info app | docker inspect app |
容器连接 | crictl attach | ctr -n k8s.io task attach app | docker attach app |
进入容器 | crictl exec -it app sh | ctr -n k8s.io task exec -t --exec-id pid app sh | docker exec -it app sh |
stats(状态) | crictl stats | ctr -n k8s.io task metric app | docker top app |
日志查看 | crictl logs | ctr -n k8s.io event | docker logs --tail 50 app |
查看Pod列表 | crictl pods | ||
查看Pod详情 | crictl inspectp | ||
启动Pod | crictl runp | ||
停止Pod | crictl stopp | ||
复制容器文件 | 1、挂载本地磁盘/tmp/mymount到app容器:ctr -n k8s.io snapshot mounts /tmp/mymount app | xargs sudo 2、从本地/tmp/mymount目录复制文件:cp /tmp/mymount/data ~/data 3、卸载/tmp/mymount目录:umount /tmp/mymount
|
docker cp |