首先说明一下在控制台输入docker start
命令后的主要流程:
- postContainersStart (api/server/router/container_routes)
-
ContainerStart (daemon/start.go)
- GetContainer #根据名字获取景象
- validateState #检查container的状态
-
daemon.containerStart # 进行请求
- container.Lock() #上锁
-
daemon.conditionalMountOnStart
#待补充详细过程
- daemon.initializeNetworking #(daemon/container_operations) #初始化网络
在这里,网络模式有
container
,host
,default
模式- if IsContainer #如果网络模式是
container
,需要获取需要加入容器的网络配置 - if IsHost #如果网络模式是
host
,hostName设置成主机名字,网络配置与宿主机相同
- if IsContainer #如果网络模式是
- daemon.createSpec (daemon/oci_linux.go) #应该是设置具体性能配置的,比如cpu速率等
- daemon.getLibcontainerdCreateOptions #得到创建容器的选择,应该是启动容器时,需要在容器内执行的命令
- daemon.containerd.Create (libcontainerd/client_daemon) #创建啥玩意
- daemon.containerd.Start (libcontainerd/client_daemon) #启动啥玩意
- container.SetRunning #设置容器的状态为running
- daemon.setStateCounter #设置daemon的计数
- daemon.initHealthMonitor #初始化容器监控
- daemon.LogContainerEvent #日志记录容器启动