什么是runc
runc是基于OCI规范,用于生成和运行容器的CLI工具,由go语言编写,完成支持Linux特性,例如: selinux,cgroups等,是个独立的组件,甚至于你可以用此来运行符合OCI规范的镜像,或则适用runc单独构建并且运行镜像,除此之外,还有一个工具叫做crun是用c语言编写的符合 OCI规范的工具,注意不要搞混了。除了runc和crun,还有其他工具么? 答案是有的,例如: kata、gVisor等。
runc安装
这里简单提一下,因为runc是使用go语言进行编写的,所以你可以在github``release中下载适合自己的系统的runc,而不用编译安装,不过还是要提及一下。
二进制安装
在runc``github``release选择合适的版本和类型进行下载即可,地址: github.com/opencontain…
源码安装
不建议直接git clone项目,而是和上述一致,在release中直接下载源码进行编译安装。
前提: go版本需要高于1.17
检测go版本
安装依赖
yum install libseccomp-devel -y
下载v1.1.1的源码并且编译安装
wget https://github.com/opencontainers/runc/archive/refs/tags/v1.1.1.tar.gz tar xf v1.1.1.tar.gz cd runc-1.1.1/ make
查看版本
尝试使用runc启动一个容器
从podman中导出一个容器
查看正在运行的容器
我们导出nginx5
使用 podman export导出
创建rootfs目录并且解压
利用runc生成容器规范文件
命令: runc spec
利用runc启动容器
命令: runc run pdudoJuejinRuncIDs
ps: pdudoJuejinRuncIDs 是容器ID
查看runc启动的容器
我们打开另外一个窗口,并且使用 runc list查看,正在我们刚刚启动的容器
感悟
podman使用runc作为默认的runtime,所以我们可以这样玩
我们发现,使用runc list 也能输出正在运行的容器,甚至于我们可以使用runc ps 容器ID输出正在运行的容器进程信息
容器运行时,不仅只有runc还有如前文所述的那几种,都是基于OCI规范标准的,你也许和我一样好奇,这个标准有什么用? 我举个例子吧,前段时间,kubernetes宣布在v1.20中弃用docker闹得沸沸扬扬,大家好奇这货为啥不支持docker了,原因是因为docker出来的时候业界还没有标准达成,就像是上世纪计算机那阵子,不也出现了大端序 和 小端序么,大家都各玩各的,回来头来看docker,它之所以能够在kubernetes上跑,是因为有dockershim这么个中间件,这就是先有东西,再有标准(CRI),所以标准很重要,以至于我们按照标准可以写个类似runc出来,或则按照runc我们写个podman出来。扯多了,扯多了。反正目前podman(v3.4.4) 是使用 runc作为默认runtime的。
发现掘金这个激励计划,有点意思,我现在强迫自己学习,我清明假期,每天都要花大概3-4个小时,确认主题,查询资料,然后做实验,最后整理成文档,掘金真是强~











