1 今天主要研究的事docker daemon 这个守护进程。这个daemon 在docker中扮演什么样的角色呢?
docker daemon 通过server 模块接受 client 的命令请求,然后根据不同的请求类型,创建出不同的job,在docker engine 中运行。docker 根据不同的docker driver 来完成不同的docker job 返回结果。
其中这个docker server 又可以大致分为三个部分:http server,router,以及route handlers。
2上次我们知道docker 入口函数main 当中在初始化的过程中
c := cli.New(clientCli, daemonCli)这里需要一个daemonCli实例是这样的类型
var daemonCli cli.Handler在docker/daemon.go当中是这么定义的
daemonCli cli.Handler = NewDaemonCli()
所以我们来研究一下这个NewDaemonCli函数,这个函数最后返回的是 一个初始化的daemon cli对象,包含daemon confing和docker registry config,但是config值的设定在CmdDaemon()中。
我们再来看一下CmdDaemon()函数,// CmdDaemon is the daemon command, called the raw arguments after `docker daemon`.这句话是说在运行docker daemon命令行之后被调用。
我么看一下这个函数的主要流程是什么:
1 启动api server: api := apiserver.New(serverConfig)
2 初始routers :initRouters(api, d)
3 如果遇到错误,发出信号,做清理工作,将apiserver 关闭,并将自身这个收魂进程关闭
signal.Trap(func() { api.Close() <-serveAPIWait shutdownDaemon(d, 15) if pfile != nil { if err := pfile.Remove(); err != nil { logrus.Error(err) } } })4 发信号说自己已经初始化完毕notifySystem()
5 初始化完毕之后,处理api ,等待处理的结束
3 关于initRouters
func initRouters(s *apiserver.Server, d *daemon.Daemon) { s.AddRouters(container.NewRouter(d), image.NewRouter(d), network.NewRouter(d), systemrouter.NewRouter(d), volume.NewRouter(d), build.NewRouter(dockerfile.NewBuildManager(d))) }用daemon实例来初始化不同类型的router 添加到apiserver 上.