• 转载自:RunC 简介

RunC 是什么?

RunC 是一个轻量级的工具,它是用来运行容器的,只用来做这一件事,并且这一件事要做好。我们可以认为它就是个命令行小工具,可以不用通过 docker 引擎,直接运行容器。事实上,runC 是标准化的产物,它根据 OCI 标准来创建和运行容器。而 OCI(Open Container Initiative)组织,旨在围绕容器格式和运行时制定一个开放的工业化标准。

安装 runC

RunC 是用 golang 创建的项目,因此编译它之前需要在本地安装 golang 的开发环境。Golang 的安装请参考《Golang 入门 : 打造开发环境》一文,这里不再赘述。

安装 libseccomp-dev

RunC 默认的编译配置是支持 seccomp 的,所以我们需要先安装 libseccomp-dev:

$ sudo apt install libseccomp-dev

seccomp 的全称为 secure computing mode,即安全计算模型,这是 Linux 内核提供的功能。我们可以通过它来限制容器中进程的行为。关于 seccomp 的更多内容,请参考 Seccomp security profiles for Docker。

获取 runC 的代码

先创建 $GOPATH/src/github.com 目录:

$ mkdir -p $HOME/go/src/github.com

通过 go get 命令就可以从 github 上下载到 runC 的代码,但是要保证事先安装了 git:

$ go get github.com/opencontainers/runc

然后进入 $HOME/go/src/github.com/opencontainers/runc 目录,并 checkout 最新的稳定状态的代码 tag v1.0.0-rc5:

$ cd $HOME/go/src/github.com/opencontainers/runc
$ git checkout v1.0.0-rc5

查看代码当前的状态:

$ git status

v1.0.0-rc5 是当前最新的版本。

编译并安装

$ make
$ sudo make install

如上图所示,runC 被安装在了 /usr/local/sbin/runc 目录。
可以通过 -v 选项查看一下版本号:

$ runc -v

至此,runC 就算是安装成功了。

准备 OCI bundle

RunC 是运行容器的运行时,它负责利用符合标准的文件等资源运行容器,但是它不包含 docker 那样的镜像管理功能。所以要用 runC 运行容器,我们先得准备好容器的文件系统。所谓的 OCI bundle 就是指容器的文件系统和一个 config.json 文件。有了容器的文件系统后我们可以通过 runc spec 命令来生成 config.json 文件。使用 docker 可轻松的生成容器的文件系统,因为 runC 本来就是 docker 贡献给社区的嘛!
下面我们准备一个运行 busybox 容器所需的文件系统:

$ docker pull busybox
$ mkdir -p /tmp/mycontainer/rootfs
$ cd /tmp/mycontainer
$ docker export $(docker create busybox) | tar -C rootfs -xvf -

现在 rootfs 目录下就是 busybox 镜像的文件系统,然后生成 config.json 文件:

$ runc spec

如果直接使用生成的 config.json,接下来的演示不会太流畅,所以简单起见,我们稍微修改一下刚刚生成的 config.json 文件。就是把 “terminal”: true 改为 false,把 “args”: [“sh”] 改为 “args”: [“sleep”, “30”]:

理解容器状态转移

在运行 busybox 容器前让我们先来看看 OCI 都定义了哪几种容器状态,以及这些状态是如何转移的。先看容器的状态:

  • creating:使用 create 命令创建容器,这个过程称为创建中。
  • created:容器已经创建出来,但是还没有运行,表示镜像文件和配置没有错误,容器能够在当前平台上运行。
  • running:容器里面的进程处于运行状态,正在执行用户设定的任务。
  • stopped:容器运行完成,或者运行出错,或者 stop 命令之后,容器处于暂停状态。这个状态,容器还有很多信息保存在平台中,并没有完全被删除。
  • paused:暂停容器中的所有进程,可以使用 resume 命令恢复这些进程的执行。

下图则是对容器不同状态间转移的一个粗略描述:

RunC 命令

要想了解 runC 都能干什么,最好是通过它提供的命令来操作容器。下面是笔者整理的 runC 命令的主要使用场景。

查看帮助

$ runc -h

查看子命令的帮助

$ runc help subcommand

使用 create 命令创建容器
进入到 /tmp/mycontainer 目录中:

$ cd /tmp/mycontainer

然后创建名为 mybusybox 的容器:

$ sudo runc create mybusybox

使用 list 命令查看当前存在的容器

$ sudo runc list

使用 state 命令查看容器的状态

$ sudo runc state mybusybox

注意图中的 “status”: “created”,当通过 create 成功创建了容器后,容器的状态就是 “created”。

使用 ps 命令看看容器内运行的进程

$ sudo runc ps mybusybox

此时 mybusybox 容器内有一个名为 init 的进程在运行。

使用 start 命令执行容器中定义的任务

$ sudo runc start

使用 start 命令启动容器后,让我们再用 ps 命令看看容器内运行了什么进程:

此时我们在 config.json 中定义的 sleep 进程在运行。再用 state 命令看看容器此时的状态,此时已经变成了 running!

使用 exec 命令在容器中执行命令
通过 exec 命令我们可以在处于 created 状态和 running 状态的容器中执行命令:

$ sudo runc exec mybusybox ls

当容器中的用户任务结束后,容器会变成 stopped 状态,这时就不能再通过 exec 执行其它的命令了。

使用 delete 命令删除容器
我们可以通过 delete 命令删除容器,当然,一般情况下是删除 stopped 状态的容器:

$ sudo runc delete mybusybox

使用 run 命令创建并运行容器
就像 docker run 命令一样,它会创建容器并运行容器中的命令:

$ sudo runc run mybusybox

当容器中的命令退出后容器随即被删除。

使用 kill 命令停止容器中的任务
如果要停止一个容器中正在运行的任务,可以使用 kill 命令:

$ sudo runc kill mybusybox

默认它会优雅的结束容器中的进程,但是碰到特殊情况,你就得使用终极信号 9:

$ sudo runc kill mybusybox 9

使用 pause 命令暂停容器中的所有进程
我们先启动容器 mybusybox,然后用 pause 命令暂停它:

$ sudo runc pause mybusybox

执行 pause 命令后,容器的状态由 running 变成了 paused。然后我们再通过 resume 命令恢复容器中进程的执行:

$ sudo runc resume mybusybox

此时容器的状态又恢复到了 running。

使用 events 命令获取容器的资源使用情况
events 命令能够向我们报告容器事件及其资源占用的统计信息:

$ sudo runc events mybusybox

rootless containers

前面我们运行的所有命令都是以 root 权限执行的。能不能以普通用户的权限运行容器呢?答案是可以的,并被称为 rootless。要想以 rootless 的方式运行容器,需要我们在生成容器的配置文件时就为 spec 命令指定 rootless 参数:

$ runc spec --rootless

并且在运行容器时通过 --root 参数指定一个存放容器状态的路径:

$ runc --root /tmp/runc run mybusybox

容器的热迁移操作

RunC 支持容器的热迁移操作,所谓热迁移就是将一个容器进行 checkpoint 操作,并获得一系列文件,使用这一系列文件可以在本机或者其他主机上进行容器的 restore 工作。这也是 checkpoint 和 restore 两个命令存在的原因。热迁移属于比较复杂的操作,目前 runC 使用了 CRIU 作为热迁移的工具。RunC 主要是调用 CRIU(Checkpoint and Restore in Userspace)来完成热迁移操作。CIRU 负责冻结进程,并将作为一系列文件存储在硬盘上。并负责使用这些文件还原这个被冻结的进程。

总结

RunC 作为标准化容器运行时的一个实现目前已经被 docker 内置为默认的容器运行时。相信随着 runC 自身的成熟和完善会有越来越多的大厂把 runC 作为默认的容器运行时。

参考:
Runc Github
OCI和runc容器标准化和docker
OCI标准和runC原理解读

【容器运行时-转载】RunC 是什么?相关推荐

  1. 【容器运行时】一文理解 OCI、runc、containerd、docker、shim进程、cri、kubelet 之间的关系

    参考 docker,containerd,runc,docker-shim 之间的关系 Containerd shim 进程 PPID 之谜 内核大神教你从 Linux 进程的角度看 Docker R ...

  2. 关于容器和容器运行时的那些事

    转载本文需注明出处:微信公众号EAWorld,违者必究. 前言: 容器,容器编排,微服务,云原生,这些无疑都是当下软件开发领域里面最热门的术语.容器技术的出现并迅速的广泛应用于软件开发的各个领域里,主 ...

  3. 3.Containerd容器运行时的配置浅析与知识扩充实践

    公众号关注「WeiyiGeek」 设为「特别关注」,每天带你玩转网络安全运维.应用开发.物联网IOT学习! 本章目录: 0x00 Containerd 容器运行时配置指南 如何配置 Container ...

  4. 课时 30:理解 RuntimeClass 与使用多容器运行时(贾之光)

    本文将主要分享以下三方面的内容: RuntimeClass 需求来源 RuntimeClass 功能介绍 多容器运行时示例 RuntimeClass 需求来源 容器运行时的演进过程 我们首先了解一下容 ...

  5. Docker的容器运行时组件Containerd

    不久前,Docker宣布开源他们的容器运行时组件Containerd(发音是container-D).目前的Containerd版本是0.2.4,Docker计划在2017年第二季度基于Open Co ...

  6. 1.Containerd容器运行时初识与尝试

    0x00 前言简述 1.基础介绍 2.专业术语 3.架构简述 0x01 安装配置 1.Ubuntu安装Containerd.io流程 0x02 简单使用 1.镜像拉取与运行 2.创建和使用网络 3.与 ...

  7. 浅析容器运行时奥秘——OCI标准

    导语 容器技术火起来了以后,Docker的容器镜像和容器运行时已然成为行业的标准.此后,为了推进容器生态的健康发展.在Linux基金会的主导下,Docker和各大云厂商Google, Amazon, ...

  8. linux低级格式化命令_低级Linux容器运行时的历史

    linux低级格式化命令 在Red Hat,我们喜欢说:"容器是Linux,Linux是容器". 这就是这个意思. 传统容器是系统上的进程,通常具有以下三个特征: 1.资源限制 2 ...

  9. 云原生钻石课程 | 第1课:容器运行时技术深度剖析

    点击上方"程序猿技术大咖",关注并选择"设为星标" 回复"加群"获取入群讨论资格! 本篇文章来自<华为云云原生王者之路训练营>钻 ...

最新文章

  1. TVM vs TensorRT比较
  2. 弹性碰撞后速度方向_$1.1.1 弹性碰撞经典例题1——力学及运动学
  3. 华为机考回忆版(三:自己的)
  4. 16线激光雷达配置教程
  5. 阿里强化学习入选MIT十大突破 “新技术”
  6. CF刷刷水题找自信 2
  7. 【NOIP2014】【Luogu2118】比例简化(枚举)
  8. Python入门--字典元素的操作,key的判断(in not in),字典元素删除(del),字典元素的增加,清空(clear()),修改
  9. Julia : global、local 以及 作用域问题
  10. 宗地图绘制要求和规范_国内土地市场宗地图的绘制标准制图规范-【领仕网】...
  11. vue-video-player文档_vue使用video和vue-video-player并且可实现视频铺满呦
  12. 计算机按键 shift的作用,Shift键的作用大全 Shift是什么意思
  13. flutter 生成图片保存到手机相册
  14. 博客实现浏览量统计次数
  15. nginx配置详细说明
  16. 分享:刚入行的朋友如何找到程序员工作,并成为优秀游戏程序员?
  17. python-树-BST_Traversal-二叉搜索树的遍历
  18. matlab pca 主元 贡献,主元分析(PCA)原理
  19. 报错AttributeError: ‘NoneType‘ object has no attribute ‘shape‘
  20. [Machine Learning] 方向导数梯度(Directional Derivative Gradient)

热门文章

  1. 【数据科学】数据分析的思维训练
  2. 利用DNS隧道绕过上网认证
  3. bread是可数还是不可数_bread是可数还是不可数
  4. 【n次归并操作】瑞士轮
  5. 苹果m2芯片生态兼容性调研(java全栈架构师需求)
  6. 解类魔方算法(以C和JAVA为基础)
  7. 利用R语言如何画出广州房价地图
  8. C/C++ plog日志简单用法
  9. 九上仁爱英语计算机作文,仁爱英语九上英语作文.doc
  10. Windows Live Essentials Wave3 QFE 官方各组件独立安装包