上一篇咱们简单的分析了docker run命令在Docker daemon中的create实现,接下来咱们开始start的分析。源码基于Docker-ce17.09
1.1、流程:

func (s *containerRouter) postContainersStart(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
version := httputils.VersionFromContext(ctx)
//获取hostConfig配置信息
var hostConfig *container.HostConfig
// A non-nil json object is at least 7 characters.
//非nil 的json对象至少为7个字符。一系列检查
if r.ContentLength > 7 || r.ContentLength == -1 {
if versions.GreaterThanOrEqualTo(version, "1.24") {
return bodyOnStartError{}
}
if err := httputils.CheckForJSON(r); err != nil {
return err
}
c, err := s.decoder.DecodeHostConfig(r.Body)
if err != nil {
return err
}
hostConfig = c
}
//解析form表单
if err := httputils.ParseForm(r); err != nil {
return err
}
//获得与键关联的值
checkpoint := r.Form.Get("checkpoint")
checkpointDir := r.Form.Get("checkpoint-dir")
//调用ContainerStart进一步启动容器,下面详细分析
if err := s.backend.ContainerStart(vars["name"], hostConfig, checkpoint, checkpointDir); err != nil {
return err
}
w.WriteHeader(http.StatusNoContent)
return nil
}