无论什么程序都有可能因为某些原因而停止运行,可以通过--restart标志。让Docker重新启动该容器。--restart 标志会检查容器的退出代码,并据此决定是否重启容器。
例如,即使把docker进程重启后,该容器也会对应的重启,没指定该参数的容器则不会重启。
[root@VM-0-16-centos ~]# docker run --restart=always --name daemon_wdf -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
root@VM-0-16-centos ~]# systemctl restart docker
[root@VM-0-16-centos ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c3064d39a44 ubuntu "/bin/sh -c 'while t…" About an hour ago Up 23 seconds daemon_wdf
116db8f4f780 ubuntu "/bin/sh -c 'while t…" 2 days ago Exited (137) 24 seconds ago daemon_dave
如果--restart 被设置成always ,则无论容器的退出代码是什么,docker都会自动重启容器。另外还可以设为on-failure,这样只有档推出代码为非0才会重启,另外该参数还能设置一个可选的重启次数。
--restart=on-failure:5
上面的例子即为,当退出代码非0,则会尝试重启5次。
引申:
1、Docker容器的重启策略如下:
- no,默认策略,在容器退出时不重启容器
- on-failure,在容器非正常退出时(退出状态非0),才会重启容器
- on-failure:3,在容器非正常退出时重启容器,最多重启3次
- always,在容器退出时总是重启容器
- unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
2. Docker容器的退出状态码
docker run的退出状态码如下:
- 0,表示正常退出
- 非0,表示异常退出(退出状态码采用chroot标准)
- 125,Docker守护进程本身的错误
- 126,容器启动后,要执行的默认命令无法调用
- 127,容器启动后,要执行的默认命令不存在
- 其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码