一、RunC是什么

RunC 是一个轻量级的工具,它是用来运行容器的,只用来做这一件事,是一种运行容器的运行时,它负责利用符合标准的文件等资源运行容器,但是它不包含 docker 那样的镜像管理功能。所以要用 runC 运行容器,我们先得准备好容器的文件系统。所谓的 OCI bundle 就是 rootfs文件系统 + config.json 文件。有了容器的文件系统后我们可以通过 runc spec 命令来生成 config.json 文件。

几张图理解下runc的位置

K8S运行生态

kubelet和container管理关系

各种level的容器运行时

二、RunC安装

# yum -y install libseccomp libseccomp-dev gcc gcc-c++
# git clone https://github.com/opencontainers/runc.git
# make 
# make install 

三、RunC运行容器

创建OCI bundle

创建一个runc的目录包含一个标准文件夹rootfs
# mkdir -p snakecontainer/rootfs

# cd snakecontainer/

提前pull好一个busybox镜像,然后基于镜像制作bootfs
# cd rootfs && docker export $(docker create busybox) | tar -C rootfs -xvf -

声明config.json
# runc spec

经过以上步骤一个标准的runc运行目录就建好了,rootfs+config.json

修改config.json文件

terminal": true  修改为 terminal": false

执行tree -L 2 .命令,查看一下目录结构:

.
├── config.json
└── rootfs
    ├── bin
    ├── dev
    ├── etc
    ├── home
    ├── lib
    ├── lib64 -> lib
    ├── linuxrc -> bin/busybox
    ├── media
    ├── mnt
    ├── opt
    ├── proc
    ├── root
    ├── run -> tmp
    ├── sbin
    ├── sys
    ├── tmp
    ├── usr
    └── var

18 directories, 2 files

运行创建好的容器

runc create snakebusybox

查看运行状态

执行runc list得到:

ID             PID         STATUS      BUNDLE                           CREATED                          OWNER
snakebusybox   112633      created     /root/snakechen/snakecontainer   2022-09-25T03:56:00.023094895Z   root

执行runc state snakebusybox得到:

{
  "ociVersion": "1.0.2-dev",
  "id": "snakebusybox",
  "pid": 112633,
  "status": "created",
  "bundle": "/root/snakechen/snakecontainer",
  "rootfs": "/root/snakechen/snakecontainer/rootfs",
  "created": "2022-09-25T03:56:00.023094895Z",
  "owner": ""
}

其他命令,可以用help

runc ps snakebusybox
runc events snakebusybox
runc delete snakebusybox