前言:
最近在搞Docker,需要仔细的去了解Docker源码,在网上找来找去都是旧版本的,很头疼,看了众多的有关博客和《docker源码分析》,总结一下。源码基于docker-ce17.9.0(docker-ce17.9.0(目前网上没有这个版本的),我主要是需要docker build跟docker run的流程,大致差不多,先将build流程码出。
简单了解 docker build 的作用:
用户可以通过一个 自定义的 Dockerfile 文件以及相关内容,从一个基础镜像起步,对于 Dockerfile 中的每一 条命令,都在原先的镜像 layer 之上再额外构建一个新的镜像 layer ,直至构建出用户所需 的镜像。
由于 docker build 命令由 Docker 用户发起,故 docker build 的流程会贯穿 Docker Client Docker Server 以及 Docker Daemon 这三个重要的 Docker 模块。所以咱也是以这三个 Docker 模块为主题,分析 docker build 命令的执行,其中 Docker Daemon 最为重要。
1、Docker Client 作为用户请求的人口,自然第一个接收并处理 docker build 命令。主要包括:定义并解析flag参数、获取Dockerfile相关内容。
流程:
runBuild()函数只是从Client解析docker build命令和参数,对于我不怎么需要,先不分析。(点击runBuild可以跳转到代码)
2、docker server 负责根据请求类型以及请求的 URL ,路由转发 Docker 请求至相应的处理方法。在处理方法中, Docker Server 会创建相应的 Job ,为 Job 置相应的执行参数并触发该 Job 的运行。在此,将参数信息配置到JSON数据中。
其中,initRouter 将build命令的路由器初始化,initRouter.NewRouter.initRoutes.NewPostRoute.
NewPostRoute()调用 postBuild()函数
3、通过参数信息配置(newImageBuildOptions) 构建选项数据(buildOption)
getAuthConfig()请求header名为X-Registry-Config,值为用户的config信息(用户认证信息)
4、配置好选项数据,将其作为参数,调用imgID:= br.backend.Build()
5、return newBuilder(ctx, builderOptions).build(source, dockerfile)
newBuilder()从可选的dockerfile和options创建一个新的Dockerfile构建器