OCI 标准

OCI(open container initiative)定义了容器运行时标准和容器镜像标准。docker的runC组件便是符合容器运行时标准的一个运行时实现。由于runC不涉及到镜像的管理,此处不对镜像标准做讨论。

容器运行时标准

运行时标准定义:github.com/opencontainers/runtime-spec
配置的根定义类型是Spec,主要定义了运行时的版本、运行时根目录、HostName、Process(容器启动命令、参数、环境变量等)、Mounts、Hooks、annotations以及不同平台的运行参数等信息。

runC操作示例

本地先创建一个实验目录,我的目录是:/app/tmp/myc。在该目录下创建目录rootfs作为容器运行时的根目录。此时rootfs目录是空的,为了正常运行,使用docker命令导出一个完整的容器目录。执行runc spec命令,生成OCI 标准容器运行时配置文件config.json

1
2
3
mkdir -p /app/tmp/myc/rootfs && cd /app/tmp/myc
docker export {{容器ID}} | tar xvf - -C rootfs
runc spec

可以修改process.args参数来修改容器启动命令,root参数可以指定容器根目录(默认根目录为rootfs)。

此处需修改 config.json参数process.terminal为false,否则会报错,terminal为true时需启动时配置额外参数:
[0000] cannot allocate tty if runc will detach without setting console socket cannot allocate tty if runc will detach without setting console socket

此时便可以启动容器了。runc create -b /app/tmp/myc testrunc
可以通过runc list查看容器状态为created,可以使用命令runc start testrunc来真正启动容器(注意,要保证配置文件中 process.args命令可执行,且后台运行,否则执行完就退出)。

容器运行时状态

容器运行时状态转换图:

graph TB;
    creating -->|success| created
    created -->|start failed| stopped
    created -->|start success| running
    running -->|err/exit/crash/kill|stopped
    running -->|pause|paused
    paused -->|resume|running