docker daemon 源码分析

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 上.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值