什么是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个小时,确认主题,查询资料,然后做实验,最后整理成文档,掘金真是强~