对容器运行时runc的简单理解
1、容器运行时,传统意义上来说就是代表容器从拉取镜像到启动运行再到中止的整个生命周期
2、OCI标准:
Docker 公司与 CoreOS 和 Google 共同创建了 OCI (Open Container Initial),并提供了两种规范:
- 运行时规范(https://github.com/opencontainers/runtime-spec)
描述如何运行filesystem bundle
- 镜像规范(https://github.com/opencontainers/image-spec)
制定镜像格式、操作等
3、docker和runC的关系
runC是一个根据OCI标准创建并运行容器的命令行工具(CLI tool)。
Docker就是基于runC创建的,简单地说,runC就是docker中最为核心的部分,容器的创建,运行,销毁等等操作最终都将通过调用runc完成。而runC也有自己的客户端,后来被提取出来作为一个单独的工具和库。其实现了 OCI 规范,包含config.json文件和容器的根文件系统。
如何用runC,以最精简的方式创建并运行一个容器:
(https://blog.csdn.net/weixin_30883271/article/details/97419299)。
Docker、Google等公司开源了用于运行容器的工具和库 runc,在此之后,各种运行时工具和库也慢慢出现,例如 rkt、containerd、cri-o 等,然而这些工具所拥有的功能却不尽相同,有的只有运行容器(runc、lxc),而有的除此之外也可以对镜像进行管理(containerd、cri-o)。
low-level runtime
low-level runtime :关注如何与操作系统交互,创建并运行容器,使用 namespace 和 cgroup 实现资源隔离和限制。
先说Namespace,虚拟技术基本要求就是资源隔离,简单的说就是我独占当前所有的资源。比如我在 8080 端口起 web 服务器,不用担心其他进程端口占用。Linux 自带 namespace 就能达到这个目的。namespace 从2002 开始开发到现在已经快20年的历史了,到现在一共有6种 namespace:
-
mnt, 文件系统 pid, 进程 net, 网络 ipc, 系统进程通信 uts, hostname user, 用户
可以通过三个系统调用的方式
-
clone,创建新的进程和新的namespace,新创建的进程 attach 到新创建的 namespace
-
unshare,不创建新的进程,创建新的 namespace 并把当前进程 attach 上
-
setns, attach 进程到已有的 namespace 上
namespace: 资源的隔离
cgroups 是 control groups 控制组的意思, 可以通过文件系统来访问这些信息。一般cgroups 挂载在 /sys/fs/cgroup
目前常见的 low-level runtime有:
- lmctfy -- 是Google的一个项目,它是Borg使用的容器运行时
- runc -- 目前使用最广泛的容器运行时。
- rkt -- CoreOS开发的Docker/runc的一个流行替代方案,提供了其他 low-level runtimes (如runc)所提供的所有特性。
high-level runtime
- docker
- containerd
- rkt