containerd使用指南
containerd 是一个高级容器运行时,又名 容器管理器。简单来说,它是一个守护进程,在单个主机上管理完整的容器生命周期:创建、启动、停止容器、拉取和存储镜像、配置挂载、网络等。
containerd 旨在轻松嵌入到更大的系统中。Docker 在底层使用 containerd 来运行容器。Kubernetes 可以通过 CRI 使用 containerd 来管理单个节点上的容器。但是较小的项目也可以从与 containerd 的轻松集成中受益——例如,faasd 使用 containerd(我们需要更多的 d!)在独立服务器上启动一个服务。
但是,以编程方式使用 containerd 并不是唯一的选择。它还可以通过可用客户端之一从命令行使用。由此产生的容器 UX 可能不像 docker 客户端提供的那样全面和用户友好,但它仍然是有用的,例如,用于调试或学习目的。
如何在 ctr 中使用 containerd
ctr 是作为 containerd 项目的一部分提供的命令行客户端。如果您在机器上运行了 containerd,则 ctr 二进制文件很可能也在那里。
该 ctr 界面 与 Docker CLI 不兼容,乍一看,可能看起来不那么用户友好。显然,它的主要受众是测试守护进程的容器开发人员。但是,由于它是最接近实际 containerd API 的东西,因此它可以作为一种很好的探索手段——通过检查可用命令,您可以大致了解 containerd 可以做什么和不能做什么。
ctr 也非常适合学习的能力低级别的使用人员,因为 ctr + containerd 是更接近实际的容器比 docker + dockerd。
使用 ctr 处理容器镜像
拉取镜像,似乎是必需和完全合规的,但是你不能忽略注册表或标签部分:
1 |
|
要列出本地镜像,可以使用:
1 |
|
令人惊讶的是,containerd 不提供开箱即用的镜像构建支持。但是 containerd 经常被更高级别的工具用来构建镜像。
ctr 您可以导入使用 docker build 或其他 OCI 兼容软件构建的现有镜像,而不是使用构建镜像:
1 |
|
使用 ctr,您还可以学习和探索下挂载镜像:
1 |
|
要使用删除镜像 ctr,请运行:
1 |
|
使用 ctr 处理容器
你可以运行一个容器用ctr run image-ref container-id。例如:
$ ctr run –rm -t docker.io/library/debian:latest cont1
请注意,ctr 与用户友好地 docker run 为您生成唯一容器 ID 不同,您必须自己提供唯一容器 ID。该 ctr run 命令还只支持一些熟悉的 docker run 标志:–env,-t,–tty,-d,–detach,–rm等,但没有端口指定或自动重启容器–restart=always。
与镜像类似,您可以使用以下命令列出现有容器:
$ ctr containers ls
有趣的是,该 ctr run 命令实际上是快捷方式ctr container create + ctr task start:
1 |
|
我喜欢 container 和 task 子命令的这种分离,因为它反映了 OCI 容器经常被遗忘的性质。尽管普遍认为容器不是进程 -容器是资源被隔离和执行受限制的进程。
使用 ctr task attach,您可以重新连接到在容器内运行的现有任务的 stdio 流:
1 |
|
与 docker 非常相似,您可以在现有容器中执行命令:
1 |
|
在删除容器之前,必须停止其所有任务:$ ctr task kill -9 nginx_1
或者,您可以使用以下标志–force 删除正在运行的任务:$ ctr task rm -f nginx_1
最后,要删除容器,请运行:$ ctr container rm nginx_1
如何在 nerdctl 中使用 containerd
nerdctl 是一个相对较新的 containerd 命令行客户端。与 ctr,nerdctl 旨在用户友好且与 Docker 兼容。在某种程度上,nerdctl + containerd可以无缝替换docker + dockerd. 但是,这似乎不是该项目的目标:
nerdctl 其目标是促进试验 Docker 中不存在的 containerd 的尖端功能。此类功能包括但不限于延迟拉取 (stargz) 和图像加密 (ocicrypt)。预计这些功能最终也将在 Docker 中可用,但是,这可能需要几个月甚至几年的时间,因为 Docker 目前被设计为仅使用容器子系统的一小部分。重构 Docker 以使用整个 containerd 是可能的,但并不简单。所以我们决定创建一个完全使用 containerd 的新 CLI,但我们不打算用 Docker 来完成。我们一直在为 Docker/Moby 以及 containerd 做出贡献,并将继续这样做。
从基本使用的角度来看,与 相比 ctr,nerdctl 支持:
1 |
|
最酷的部分是 nerdctl 尝试提供与 docker(和 podman)相同的命令行用户体验。因此,如果您熟悉 docker(或 podman)CLI,那么您已经熟悉 nerdctl.
如何在 crictl 中使用 containerd
crictl 是 Kubernetes CRI 兼容容器运行时的命令行客户端。
引入了 Kubernetes 容器运行时接口 (CRI)以使 Kubernetes 容器运行时充满魔法。Kubernetes 节点代理 kubelet 实现了 CRI 客户端 API,可以使用任何实现 CRI 服务器 API 的容器运行时来管理其节点上的容器和 pod。
从 1.1 版开始,containerd 带有一个内置的 CRI 插件。因此,containerd 是一个兼容 CRI 的容器运行时。因此,它可以与 crictl 共存.
crictl 创建用于检查和调试 Kubernetes 节点上的容器运行时和应用程序。它支持以下操作:
1 |
|
这里有趣的部分是,通过 crictl + containerdbundle 可以了解 pod 是如何实现的,但是这个话题值得自己去探索。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!