容器运行时(Container Runtime)是Kubernetes (k8s))最重要的组件之一,负责管理镜像和容器的生命周期。Kubelet通过ContainerRuntime Interface (CRI)与容器运行时交互,以管理镜像和容器。
一、containerd与docker的区别是什么
在使用k8s时,使用docker和containerd的调用链如下所示:
Docker作为k8s容器运行时组件,调用关系如下:
kubelet --> docker shim(在 kubelet进程中) --> dockerd --> containerdContainerd作为k8s容器运行时组件,调用关系如下:
kubelet --> cri plugin (在 containerd进程中)--> containerd
其中dockerd虽增加了swarm cluster、docker build、docker API等功能,但也会引入一些bug,而与containerd相比,多了一层调用。
区别:1、containerd不需要经过dockershim,所以调用链更短,组件更少,更稳定,占用节点资源更少,docker需要经过所以调用链更长;2、docker调用cni是“docker-shim”,containerd调用cni是“containerd-cri”。
二、如何选择containerd与docker
1、默认k8s建议选择containerd,调用链更短,组件更少,更稳定,占用节点资源更少。
2、当遇到以下情况时,请选择docker作为运行时组件:
- 如需使用docker in docker
- 如需在CCE节点使用 docker build/push/save/load 等命令
- 如需调用docker APl
- 如需docker compose或docker swarm
Containerd创建并启动的容器会被kubelet立即删除,不支持暂停、恢复、重启、重命名、等待容器,Containerd不具备docker构建、导入、导出、比较、推送、查找、打标签镜像的能力,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 命令。
常用命令以及对比
Containerd不支持dockerAPl和dockerCLl,但是可以通过crictl命令实现类似的功能。 Docker中有的命令Crictl大部分都有。
docker ctr(containerd) crictl(kubernetes)
查看运行的容器 docker ps ctr task ls/ctr container ls crictl ps
查看镜像 docker images ctr image ls crictl images
查看容器日志 docker logs 无 crictl logs
查看容器数据信息 docker inspect ctr container info crictl inspect
查看容器资源 docker stats 无 crictl stats
启动/关闭已有的容器 docker start/stop ctr task start/kill crictl start/stop
运行一个新的容器 docker run ctr run 无(最小单元为pod)
修改镜像标签 docker tag ctr image tag 无
创建一个新的容器 docker create ctr container create crictl create
导入镜像 docker load ctr image import 无
导出镜像 docker save ctr image export 无
删除容器 docker rm ctr container rm crictl rm
删除镜像 docker rmi ctr image rm crictl rmi
拉取镜像 docker pull ctr image pull ctictl pull
推送镜像 docker push ctr image push 无
在容器内部执行命令 docker exec 无 crictl exec
Containerd常用命令例子:
1、查看镜像
crictl images
2、查看运行的容器
#对应用户进程
crictl ps
3、查看运行中的pod
# 对应sandbox进程
crictl pods
4、查看pod详细信息
crictl inspectp eea1584366c1d
5、查看容器详细信息
crictl inspect 5389d4e04a974
6、查看容器镜像详细信息
crictl inspecti 70f5e18fddce8
ctr命令例子:
ctr -n k8s.io image tag registry.aliyuncs.com/google_containers/csi-attacher:v3.3.0 k8s.gcr.io/sig-storage/csi-attacher:v3.3.0
ctr -n k8s.io image tag registry.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.3.0 k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.3.0
ctr -n k8s.io image tag registry.aliyuncs.com/google_containers/csi-provisioner:v3.0.0 k8s.gcr.io/sig-storage/csi-provisioner:v3.0.0
ctr -n k8s.io image tag registry.aliyuncs.com/google_containers/csi-resizer:v1.3.0 k8s.gcr.io/sig-storage/csi-resizer:v1.3.0
ctr -n k8s.io image tag registry.aliyuncs.com/google_containers/csi-snapshotter:v4.2.0 k8s.gcr.io/sig-storage/csi-snapshotter:v4.2.0
ctr -n k8s.io image tag registry.cn-hangzhou.aliyuncs.com/rook_image/ceph:v16.2.7 quay.io/ceph/ceph:v16.2.7
ctr -n k8s.io image tag registry.cn-hangzhou.aliyuncs.com/rook_image/cephcsi:v3.4.0 quay.io/cephcsi/cephcsi:v3.4.0
ctr -n k8s.io image tag registry.cn-hangzhou.aliyuncs.com/rook_image/volumereplication-operator:v0.1.0 quay.io/csiaddons/volumereplication-operator:v0.1.0
ctr -n k8s.io image tag registry.cn-hangzhou.aliyuncs.com/rook_image/ceph:v1.8.0 rook/ceph:v1.8.0
四、containerd与docker存储位置
1、数据目录
相信大家都知道docker的数据目录默认是在/var/lib/docker目录下;而切换到containerd时,数据目录默认为/var/lib/containerd
2、日志
当我们在使用k8s时,如果使用了docker作为运行时,其实容器程序日志的落盘是由docker来负责的。/var/log/pod和/var/log/container下的日志文件会软连接到/var/lib/docker下对应的日志文件,如果还需要对日志做一些参数配置,直接修改docker配置文件即可;而如果我们现在使用containerd作为运行时,则容器日志的落盘将由kubelet来负责,/var/log/container下的日志文件会软连接到/var/log/pod下的日志文件,如果需要调整日志参数,则需要修改kubelet相关配置
3、CNI
当使用docker作为运行时时,kubelet中的docker-shim负责调用cni;而当使用containerd作为运行时时,containerd中内置的containerd-cri负责调用cni
[plugins."io.containerd.grpc.v1.cri".cni]
bin_dir = "/opt/cni/bin"
conf_dir = "/etc/cni/net.d"
4、流服务
熟悉k8s的朋友都知道,kubectl exec 和 kubelet log等命令需要通过apiserver与容器通信,这其中就涉及到了流服务。而docker API本身支持,kubelet中的docker-shim通过docker API流转发;但containerd却要对此进行单独配置
[plugins."io.containerd.grpc.v1.cri"]
stream_idle_timeout = "4h0m0s"
stream_server_address = "127.0.0.1"
stream_server_port = "0"
enable_tls_streaming = false
感谢以下:
https://www.csdn.net/tags/MtTaIg0sNTg2NjMwLWJsb2cO0O0O.html
containerd与docker的区别是什么-Docker-PHP中文网文章来源:https://www.toymoban.com/news/detail-482880.html
Containerd和Docker的关系 - 百度文库文章来源地址https://www.toymoban.com/news/detail-482880.html
到了这里,关于containerd与docker的联系、区别是什么的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!