Skip to content

Latest commit

 

History

History
94 lines (68 loc) · 2.48 KB

容器重启策略.md

File metadata and controls

94 lines (68 loc) · 2.48 KB

概述

命令

通过--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()方法起容器.