Docker源码阅读6-创建server启动和containerd的启动

接上次看的往下看 cli.Pidfile 创建pid文件"/var/run/docker.pid" serverConfig := &apiserver.Config{ Logging: true, SocketGroup: cli.Config.SocketGroup, Version: dockerversion.Version, EnableCors: cli.Config.EnableCors, CorsHeaders: cli.Config.CorsHeaders, } 这几个默认值为 SocketGroup 为docker, EnableCors false, CorsHeaders 这个看EnableCors api := apiserver.New(serverConfig) 这个就是实例化了个Server,cfg为上边的serverConfig cli.api = api 返回一个, 初始化cfg为serverConfig,看起来所有请求的路由都在这里了 type Server struct { cfg *Config servers []*HTTPServer routers []router.Router routerSwapper *routerSwapper middlewares []middleware.Middleware } cli.Config.Hosts没有的话创建一个长度1的数组,有的话进入循环进行监听 listeners.Init wrapListeners(proto, ls) allocateDaemonPort(addr) api.Accept(addr, ls...) 监听地址, 根据hosts初始化的多个httpserver。 migrateKey 这个看起来好像是为了升级还是啥的。把之前配置文件目录的key.json移动到/etc/docker/下边,并把旧的删除 具体不知道为啥这么做 registryService := registry.NewService(cli.Config.ServiceOptions) 返回一个DefaultService newServiceConfig(options)里边,配置镜像仓库地址 containerdRemote, err := libcontainerd.New(cli.getLibcontainerdRoot(), cli.getPlatformRemoteOptions()...) 重头戏来了, getLibcontainerdRoot /var/run/docker/libcontainerd getPlatformRemoteOptions 里边好像就是设置了一些参数 libcontainerd.WithRemoteAddr 这个是设置了ContainerdAddr配置,containerd参数走这个,调用rpcAddr(addr)。 没设置 走libcontainerd.WithStartDaemon(true), 然后调用startDaemon(start) type RemoteOption interface { Apply(Remote) error } New里边先初始化remote eventTsPath getLibcontainerdRoot/event.ts option.Apply(r)这里应该就是真正设置参数到初始化的remote了。不知道为啥这么写 创建getLibcontainerdRoot也就是stateDir 700权限 如果没有rpcAddr 设置 stateDir/docker-containerd.sock startDaemon默认是true的所以肯定执行r.runContainerdDaemon() runContainerdDaemon里 pidFilename stateDir/docker-containerd.pid,下面判断pid文件是否正确,如果进程在运行赋值r.daemonPid,就返回结束了 如果没运行,先设置运行参数,然后执行命令启动docker-containerd setOOMScore oomScoreAdjPath := fmt.Sprintf("/proc/%d/oom_score_adj", pid) 好像就把参数那个数写文件里了,默认-500 写进程号 建了一个r.daemonWaitCh channel,container进程结束后,关闭这个channel。赋值r.daemonPid 总的来说就是启动container进程 使用grpc创建rpc连接 r.rpcConn = conn r.apiClient = containerd.NewAPIClient(conn) 返回 type aPIClient struct { cc *grpc.ClientConn } 就保存了rpc连接 getLastEventTimestamp就是看 stateDir/event.ts 文件,没数据就返回当前时间,如果有,里边保存的是序列号化的,反序列化一下返回 tsp, err := ptypes.TimestampProto(t)转了一下时间 r.restoreFromTimestamp = tsp go r.handleConnectionChange() 大体看了一下,就是开个协程进行rpc连接探测, 连续失败到三次,如果进程存在kill.<-r.daemonWaitCh,然后r.runContainerdDaemon()启动 r.startEventsMonitor(); 监控请求事件 发送了一个"/types.API/Events"请求, 然后开个协程有事件就处理事件 处理完更新事件时间 处理事件这里先不仔细看了。感觉看下去脑子回不来了. libcontainerd/remote_unix.go startEventsMonitor()标记一下,以后看 主要就是server的启动和containerd的启动

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply