# 重启策略

Docker 容器的重启策略如下：

* `no`：默认策略，在容器退出时不重启容器。启动容器时候不添加参数 `--restart` 即可。
* `on-failure`：在容器非正常退出时（退出状态非0），才会重启容器。
* `always`：只要容器退出就重启容器。
* `unless-stopped`：在容器退出时总是重启容器，但是 Docker 守护进程启动之前就已经停止运行的容器不包括在内。

## Docker 容器退出状态码

Docker 容器也有退出状态码，类似 Linux 命令。Docker 容器的重启策略就是基于状态码。具体如下：

* 0：表示容器正常退出。例如 stop 容器。
* 非0：表示容器退出异常（退出状态码采用 chroot 标准）。例如执行 `docker run` 失败后的容器退出。
* 125：Docker 守护进程本身有错误。
* 126：容器启动后，要执行的默认命令无法调用
* 127：容器启动后，要执行的默认命令不存在。
* 其他命令状态码：容器启动后在容器内部执行命令，该命令退出时的返回状态码，就作为容器的退出状态码。

## 获取退出码

### 使用 docker ps -a

如下所示：`Exited(1) 33 minutes ago`，1 就是这个容器的退出状态码。

```shell
docker ps -a | grep nginx
3e64cad716c0   192.168.100.20:5000/mynginx:latest   "nginx"   36 minutes ago   Exited (1) 33 minutes ago    nginx-demo
```

### 使用inspect命令

`inspect` 命令是用来获取容器的命令，配合其他参数就能获取容器的退出状态码。如下所示

```shell
docker inspect 3e64cad716c0 --format='{{.State.ExitCode}}'
```

## --restart 参数说明

* `--restart` 选项通常只用于 `detached` （后台运行模式）模式的容器。
* `--restart` 选项不能与 `--rm` 选项同时使用。因为 `--rm` 选项只适用于 foreground 模式的容器。
* 在 `docker ps` 查看容器时，对于使用了 `--restart` 选项的容器，其可能的状态只有 Up 或 Restarting 两种状态。
