当前位置: 首页 > 科技观察

如何从命令行优雅地管理Containerd

时间:2023-03-17 16:25:24 科技观察

Containerd旨在轻松嵌入到更大的系统中。Docker使用containerd来运行容器。Kubernetes可以通过CRI使用containerd来管理单个节点上的容器。但较小的项目也可以从与containerd集成的便利中受益——例如,faasd使用containerd在独立服务器上运行成熟的功能即服务解决方案。但是,以编程方式使用containerd并不是唯一的选择。它也可以通过可用客户端之一从命令行使用。生成的容器UX可能不如docker客户端提供的那样全面和用户友好,但它仍然有用,例如,用于调试或学习目的。如何将ctr与containerd一起使用ctr是作为containerd项目的一部分提供的命令行客户端。如果你的机器上运行了containerd,那么ctr二进制文件很可能也在那里。ctr界面[显然]与DockerCLI不兼容,乍一看,它似乎对用户不太友好。显然,它的主要受众是测试守护进程的容器开发人员。然而,由于它最接近实际的containerdAPI,因此它是一种很好的探索方式——通过检查可用的命令,您可以大致了解containerd可以做什么和不能做什么。ctr也非常适合学习运行低级[OCI]容器的能力,因为ctr+containerd比docker+dockerd更接近实际容器。使用ctr处理容器镜像拉取镜像时,似乎需要完全限定的引用,因此您不能省略注册表或标签部分:$ctrimagespulldocker.io/library/nginx:1.21$ctrimagespulldocker.io/kennethreitz/httpbin:latest$ctrimagespulldocker.io/kennethreitz/httpbin:latest$ctrimagespullquay.io/quay/redis:latest要列出本地镜像,您可以使用:$ctrimagesls令人惊讶的是,containerd不提供开箱即用的图像构建支持。然而,containerd本身经常被更高级别的工具用来构建镜像。您可以导入使用dockerbuild或其他oci兼容软件构建的现有图像,而不是使用ctr来构建图像:$dockerbuild-tmy-app.$dockersave-omy-app.tarmy-app$ctrimagesimport我的-app.tar有ctr,你也可以挂载镜像$mkdir/tmp/httpbin$ctrimagesmountdocker.io/kennethreitz/httpbin:latest/tmp/httpbin$ls-l/tmp/httpbin/total80drwxr-xr-x2rootroot40962018年10月18日bindrwxr-xr-x2rootroot4096Apr242018bootdrwxr-xr-x4rootroot40962018年10月18日devdrwxr-xr-x1rootrootx40962018年10月24日etcdrwxr2rootroot4096Apr242018homedrwxr-xr-x3rootroot4096Oct242018httpbin...$ctrimagesunmount/tmp/httpbin要使用ctrl删除图像,请运行:$ctrimagesremovedocker.io/library/nginx:1.21使用ctr来处理容器有了本地镜像,你可以通过ctr运行来运行一个容器。例如:$ctrrun--rm-tdocker.io/library/debian:latestcont1请注意,与生成唯一容器ID的友好dockerrun不同,使用ctr您必须自己提供唯一容器ID。ctrrun命令也只支持一些常见的dockerrun标志:--env、-t、--tty、-d、--detach、--rm等。但是没有端口发布或使用--restart=alwaysautomaticcontainer开箱即用。类似于镜像,可以列出已有的容器:$ctrcontainersls有意思的是,ctrlrun命令其实是ctrlcontainercreate+ctrltaskstart的快捷方式:$ctrcontainercreate-t??docker.io/library/nginx:latestnginx_1$ctr容器lsCONTAINERIMAGERUNTIMEEnginx_1docker.io/library/nginx:latestio.containerd.runc.v2$ctrtasklsTASKPIDSTATUS#Empty!$ctrtaskstart-dnginx_1#-dfor--detach$ctrtasklistTASKPIDSTATUSnginx_110074RUNNING我喜欢容器和任务子命令的这种分离,因为它反映了OCI容器经常被遗忘的性质。尽管人们普遍认为容器不是进程——对于进程而言,容器是一个隔离且受限的执行环境。使用ctrtaskattach,您可以重新附加到容器中运行的现有任务的stdio流:$ctrtaskattachnginx_12021/09/1215:42:20[notice]1#1:usingthe"epoll"eventmethod2021/09/1215:42:20[通知]1#1:nginx/1.21.32021/09/1215:42:20[通知]1#1:由gcc8.3.0(Debian8.3.0-6)构建2021/09/1215:42:20[通知]1#1:操作系统:Linux4.19.0-17-amd642021/09/1215:42:20[通知]1#1:getrlimit(RLIMIT_NOFILE):1024:10242021/09/1215:42:20[notice]1#1:startworkerprocesses2021/09/1215:42:20[notice]1#1:startworkerprocess31...很像docker,你你可以在现有容器中执行任务:$ctrtaskexec-t--exec-idbash_1nginx_1bash#从容器内部:$root@host:/#curl127.0.0.1:80欢迎使用nginx!