通常我们都习惯了使用Docker run来执行一个Docker容器,那么在我们执行Docker run之后,Docker到底都做了什么工作呢?本文通过追踪Docker run(Docker 1.9版本)的执行流程,借由对volume,network和libcontainer的使用和配置的介绍,对Docker run的原理进行了详细解读。
首先,用户通过Docker client输入docker run
来创建被运行一个容器。Docker client主要的工作是通过解析用户所提供的一系列参数后,分别发送了这样两条请求:
"POST", "/containers/create?"+containerValues
"POST", "/containers/"+createResponse.ID
这样client的工作也就完成了,很显然client做的事情很少,主要是负责给Docker daemon发送请求。不过,通过client所发送的两条请求,我们可以很自然的把docker run
的整个执行过程分成create与start两个阶段。下图对docker run
中各个关键事件的发生时间点分别进行了标注。下面我将分别从这个两个阶段并结合下图,对docker run
的执行流程进行介绍。
1 Create阶段
这阶段Docker daemon的主要工作是对client提交的POST表单进行分析整理,获得具有可移植性的配置参数结构体config和不可移植的配置结构体hostconfig。然后daemon会调用daemon.newContainer函数来创建一个基本的container对象,并将config和hostconfig中保存的信息填写到container对象中。当然此时的container对象并不是一个具体的物理容器