runc解读(一)
runc
源码解读
runc项目只是阅读源码有些地方不是很好理解,因此采用Delve一边调试一边查看源码的方式。
执行的命令示例:
dlv debug -- run --bundle /root/mycontainer/basic testcontainer
通过该方式可以进入debugger模式,可以设置断点,单步查看每个函数调用的效果,同时也方便查看当前操作系统的改变
runc spec
bundle
切换工作目录,执行的是os.Chdir(bundle)
该命令,主要是用来生成容器启动的config.json文件,所有的容器config.json初始相同,根据--rootless
再覆盖配置,重新生成config.json
run
runc run <container>
会生成state.json,该文件默认在/run/runc/<container>
下,也可以使用--root /tmp/runc
这个命令来改变存储位置。
后面会单独描述该命令的代码流程。
state
TODO
list
该命令可以查看目前启动的容器,该命令就是根据state.json来显示,因此如果启动容器的时候,指定了--root
,在list查询的时候,也需要加上该命令参数。
list.go只是对state.json的数据处理,没有过多关于底层实现。
- getContainers()
- 调用utils_linux/loadFactory(),根据
--root
参数生成实现libcontainer.Factory接口的结构体,linux的Factory对应的就是libcontainer/factory_linux.go中的LinuxFactory - 遍历
--root
指定路径下的目录 - 调用factory.Load(目录名),根据state.json来生成对应的容器结构体libcontainer/container_linux.go中linuxContainer
- annotations就是对应的state.Config.Labels的字段
- 后面只是对于format的显示处理