Daemon执行流程
创建syncPipe用于跨namespace的通信
execdriver.Run创建一个exec.Cmd对象来执行dockerinit命令
exec.Cmd.Args代表dockerinit的执行参数,native表示execdriver类型,pipe表示同步管道的文件描述符,root表示容器- 配置文件container.json和state.json所在目录,args表示用户指定的命令
Exec.Cmd.SysProcAttr携带需要为进程创建新namespace参数Cloneflags,包括NEWNS、NEWUTS、NEWIPC、NEWPID、NEWNET
调用exec.Cmd.Start()启动dockerinit进程
调用namespaces.SetupCgroups为dockerinit配置cgroup(cpu、iops、memory、freezer)
调用namespaces.InitializeNetworking为dockerinit创建网络栈
调用syncPipe.SendToChild(networkState)将需要dockerinit完成的剩余网络配置发给dockerinit
调用syncPipe.ReadFromChild与dockerinit同步
Dockerinit执行流程
从参数中读取root配置文件所在目录
从path.Join(root, “container.json”)中读取daemon传过来的execdriver.Command对象,获取容器的配置信息
调用mount.InitializeMountNamespace完成挂载资源的初始化,包括rootfs根文件系统,挂载点Volume,设备文件
调用namespaces.FinalizeNamespace完成剩余的配置,包括关闭除0/1/2以外的文件句柄,为容器创建新的用户ID、组ID,切换到工作目录
调用syscall.Exec将容器主进程的执行权交给用户程序