接上次看的往下看
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的启动
上一篇: freebsd 中文设置
下一篇: Clojure安装mac开发环境
0 Responses so far.