当前 containerd 已经取代docker 成为默认的容器运行时了,我们在日常排查问题的时候,经常会使用containerd 的客户端去排查问题。所以日常的命令还是需要掌握的。
containerd 目前有三个客户端,分别是 ctr、nerdctl、crictl 下面我们逐一讲解一下。
ctr
ctr 是containerd 的亲儿子,containerd 的所有功能都可以通过ctr 命令去操作。
比如我们可以通过ctr 拉一个镜像
ctr images pull docker.io/library/nginx:1.21
或者通过ctr 创建一个容器
ctr container create -t docker.io/library/nginx:latest nginx_1
最后通过ctr 启动容器,这里是 task 子命令,containerd 中只要涉及进程相关的都使用task
ctr task start -d nginx_1
容器启动后,就可以通过 exec 进入容器
ctr task exec -t --exec-id bash_1 nginx_1 bash
nerdctl
nerdctl 的命令,我就不说了,因为 nerdctl 目的就是为了做一个兼容 docker 命令的客户端,所以使用的命令和 docker 完全保持一致。
我们就可以直接抛弃 docker + dockerd了,直接通过 nerdctl + containerd 了。
crictl
crictl 在k8s里面非常常用,严格来说,它并不是 containerd 的客户端,只是因为containerd 实现了crictl 的接口,所以可以使用 crictl 。crictl 是k8s CRI 客户端,所以,所有实现CRI 接口的服务,都可以使用 crictl
我们可以先通过
crictl pull xxx
拉镜像,然后启动 Pod(sandbox)
crictl runp pod.json
其中pod.json 内容如下:
{
"metadata": {
"name": "nginx-sandbox",
"namespace": "default",
"attempt": 1,
"uid": "hdishd83djaidwnduwk28bcsb"
},
"log_directory": "/tmp",
"linux": {
"security_context": {
"namespace_options":{
"network": 2
}
}
}
}
然后为这个pod 添加一个容器
crictl create podID container.json pod.json
其中,container.json 内容如下:
{
"metadata": {
"name": "busybox"
},
"image":{
"image": "busybox"
},
"command": [
"top"
],
"log_path":"busybox.log",
"linux": {
}
}
创建成功后,我们再通过 ctr 命令检查一下。
# ctr -n k8s.io c ls
CONTAINER IMAGE RUNTIME
56ae054eed20d0e4dbaf2bf300406baaedaa63646a3b0dc39911daaaff4cd569 docker.io/library/busybox:latest io.containerd.runc.v2
e23205e980b40ebeef875f9489321fe67906cbe62b6b6232912aa69b58842b95 k8s.gcr.io/pause:3.2 io.containerd.runc.v2
可以看到成功的启动了两个容器。