启动dockerinit
dockerinit是daemon启动容器运行的第一个进程,类似linux的init进程
初始化容器的Network资源、Mount资源、设置用户、设置环境变量等在daemon进程中做不到事情
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同步