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的显示处理