目前,containerd已经取代docker作为默认的容器运行时。我们在日常排查问题的时候,经常会使用containerd客户端来排查问题。所以日常命令还是需要掌握的。containerd目前有3个客户端,分别是ctr、nerdctl、crictl。让我们一一解释。ctrctr是containerd的儿子,通过ctr命令可以操作containerd的所有功能。比如我们可以通过ctrimagespulldocker.io/library/nginx:1.21拉取镜像或者通过ctr创建容器ctrcontainercreate-t??docker.io/library/nginx:latestnginx_1最后通过ctr启动容器,这里是task子命令,只要进程涉及到containerd,使用taskctrtaskstart-dnginx_1容器启动后,可以通过execctrtaskexec-t--exec-idbash_1nginx_1进入容器bashnerdctlnerdctl命令,我就不说了,因为nerdctl的目的是做一个兼容docker命令的客户端,所以使用的命令和docker完全一致。我们可以直接放弃docker+dockerd,直接通过nerdctl+containerd。crictlcrictl在k8s中非常常用。严格来说,它不是containerd的客户端,但是可以使用crictl,因为containerd实现了crictl接口。crictl是k8s的CRI客户端,所以所有实现了CRI接口的服务都可以使用crictl。我们可以先通过crictlpullxxx拉取镜像,然后启动Pod(sandbox)crictlrunppod.json其中pod.json的内容如下:{"metadata":{"name":"nginx-sandbox",“命名空间”:“默认”,“尝试”:1,“uid”:“hdishd83djaidwnduwk28bcsb”},“log_directory”:“/tmp”,“linux”:{“security_context”:{“namespace_options”:{“网络":2}}}}然后给这个pod添加一个容器crictlcreatepodIDcontainer.jsonpod.json其中,container.json的内容如下:{"metadata":{"name":"busybox"},"image":{"image":"busybox"},"command":["top"],"log_path":"busybox.log","linux":{}}创建成功后我们查看再次使用ctr命令。#ctr-nk8s.ioclsCONTAINERIMAGERUNTIME56ae054eed20d0e4dbaf2bf300406baaedaa63646a3b0dc39911daaaff4cd569docker.io/library/busybox:latestio.containerd.runc.v2e23205e980b40ebeef875f9489321fe67906cbe62b6b6232912aa69b58842b95k8s.gcr.io/pause:3.2io.containerd.runc.v2可以看到成功的启动了twocontainers.
