runc
is a CLI tool for spawning and running containers on Linux according to the OCI specification.
容器运行时是指管理容器和容器镜像的软件。
如何使用
创建 OCI Bundle
OCI Bundle 指满足 OCI 标准的一系列文件,这些文件包含了运行容器所需要的所有数据,存放在一个共同的目录,包含一下两项:
config.json
容器运行的配置
rootfs
容器的文件系统
参考步骤
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# creater sample container directory
$ mkdir /ctnr
$ cd /ctnr
# create the rootfs
$ mkdir rootfs
# export busybox via Docker into the rootfs
$ docker export $(docker create busybox) | tar -C rootfs -xvf -
# check rootfs
$ ls rootfs
bin dev etc home proc root sys tmp usr var
# create template config.json
$ runc spec
$ ls
config.json rootfs
|
修改 config.json
以验证容器启动效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
{
"process": {
// 启用终端
"terminal": true,
"user": {
"uid": 0,
"gid": 0
}, // 将初始化命令调整为 sleep 以查看效果
"args": ["sleep 10"],
"env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"TERM=xterm"
],
"cwd": "/"
},
"root": {
"path": "rootfs",
"readonly": true
},
"linux": {
"namespaces": [
{
"type": "pid"
},
{
"type": "network"
},
{
"type": "ipc"
},
{
"type": "uts"
},
{
"type": "mount"
}
]
}
}
|
代码结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
// 基础配置信息
setupSpec(context)
// 创建容器
startContainer(context, spec, CT_ACT_CREATE, nil)
createContainer
// 平台容器相关配置
specconv.CreateLibcontainerConfig
// containerFacotry
loadFactory(context)
libcontainer.New(……)
factory.Create(id, config)
// 运行用户指定的应用程序,如 `sleep 5`
runner.run(spec.Process)
newProcess(*config, r.init)
r.container.Start(process)
c.createExecFifo()
c.start(process)
c.newParentProcess(process)
parent.start()
|
问题排查
Runc 启动失败
runc: symbol lookup error: runc: undefined symbol: seccomp_api_get
原因是缺少了 libseccomp-devel
,且版本必须高于 2.4。Lib libseccomp 2.4 added seccomp_api_get.
References