docker基础组件之runc
/ / 点击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 | mkdir -p /app/tmp/myc/rootfs && cd /app/tmp/myc |
可以修改
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