通过--restart选项,可以设置容器的重启策略
docker run -d --restart=always ubuntu
查看容器重启次数
docker inspect -f "{{ .RestartCount }}" ubuntu
查看容器最后一次的启动时间
docker inspect -f "{{ .State.StartedAt }}" ubuntu
Docker容器的重启都是由Docker守护进程完成的,因此与守护进程息息相关。
Docker容器的重启策略如下:
- no,默认策略,在容器退出时不重启容器
- on-failure,在容器非正常退出时(退出状态非0),才会重启容器 on-failure:3,在容器非正常退出时重启容器,最多重启3次
- always,在容器退出时总是重启容器
docker run的退出状态码如下:
- 0,表示正常退出
- 非0,表示异常退出(退出状态码采用chroot标准)
- 125,Docker守护进程本身的错误
- 126,容器启动后,要执行的默认命令无法调用
- 127,容器启动后,要执行的默认命令不存在
- 其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码
在container结构体里面有定义一个restartManager,定义如下
\restartmanager\restartmanager.go
type restartManager struct {
sync.Mutex
sync.Once
policy container.RestartPolicy
restartCount int
timeout time.Duration
active bool
cancel chan struct{}
canceled bool
}
\vendor\src\github.com\docker\engine-api\types\container\host_config.go
type RestartPolicy struct {
Name string
MaximumRetryCount int
}
NewRunCommand()
-> runRun()
-> runconfigopts.Parse解析参数,然后把重启策略赋值给了hostConfig.RestartPolicy
-> createContainer()
-> ContainerCreate()创建容器
-> post一个请求
-> 如果失败,则pull镜像重试一次
-> client.ContainerStart()启动容器
-> 启动容器的时候,又把hostConfig中的重启策略赋值到了容器创建参数中(restartManager)。
调用时机:
当容器监控收到事件的时候: container.handleEvent() 中进入StateExit状态的时候,调用ctr.restartManager.ShouldRestart()函数判断是否需要重启,如果需要重启,则将状态置为StateRestart
后续判断是StateRestart状态的时候,起了一个goroutine,等待重启时间到了之后,调用了container.start()方法起容器.