在《Docker实战入门教程(一)》和《Docker实战入门教程(二)》中,运行应用容器后,如果容器意外停止(无论人为或应用异常出错等情况下),那么应用将变得不可使用,这样看来,Docker的容器技术是不是如此脆弱呢?!答案当然是否定的!!

d341f013716a5ad35d0871d68adef56d.png

事实上,Docker容器技术是“打不死的小强”,原因是Docker提供了容器的重新启动策略,此策略控制容器在退出时或Docker重新启动时是否自动启动容器。

重启策略配置

要为容器配置重新启动策略,在使用docker run命令时使用--restart标志。

--restart标志的值包括如下几种:

1.no

容器退出时,不自动重启容器。这是默认值。

2.on-failure[:max-retries]

当容器以非零状态码(正常退出时状态码为0)退出时,重新启动。max-retries为最大重试次数(可选),限制Docker守护程序尝试的重新启动重试次数。如不指定最大重试次数,默认为不断重试。

3.always

无论退出状态如何,始终重新启动容器。Docker守护程序将无限期地尝试重新启动容器。无论容器的当前状态如何,容器也将始终在守护程序启动时启动。

4.unless-stopped

类似always,无论退出状态如何,重新启动容器。区别在:如果容器在Docker守护程序停止之前已经处于停止状态,那么守护程序启动时,容器不会重新启动。

以下是几个示例:

docker run --restart=always redis

运行redis容器,配置的重启策略是always,这样,如果容器redis无论什么情况停止了,Docker将自动重新启动redis容器。

docker run --restart=on-failure:10 redis

运行redis容器,配置的重启策略是on-failure:10,在容器异常退出时,Docker将自动尝试重新启动redis容器,最多尝试10次。如果redis容器以非零退出状态退出连续10次以上,Docker将中止尝试重新启动容器。

重启策略机制

1.重启策略仅在容器成功启动后生效。成功启动意味着容器启动后,状态为UP至少10秒以上并且Docker已开始监视。这种机制,其实是Docker防止没有启动的容器进入重启循环。

2.如果手动停止容器,则会忽略其重新启动策略,直到Docker守护程序重新启动或手动重新启动容器。这是防止重启循环的另一种措施。

3.容器每次重新启动之前,都会添加一个不断增加的延迟(前一个延迟的两倍,从100毫秒开始),以防止堵塞服务器。这意味着守护进程将等待100 ms,然后等待200 ms、400 ms、800 ms、1600 ms等,直到on-failure的次数限制,或者人工停止容器(docker stop)和强制删除容器(docker rm -f)。如果容器成功重新启动(容器启动并运行至少10秒),则延迟将重置为其默认值100 ms。

4.容器启动参数--restart和--rm不能同时出现在一条命令中,否则会产生冲突。

5.容器重启时,连接的客户端将被强行断开。

6.重新启动策略仅适用于容器。群组服务的重新启动策略配置与容器的重启策略不同。本文暂不涉及。

容器退出代码

docker run 命令会提供有关容器无法运行的原因或退出原因的信息代码,以下是常见的几个代码:

1. 正常退出,代码为:0

2. 如果错误与Docker守护程序本身有关,代码为:125

7889c496dc47b0fd1e2ffeb29cd81eb5.png

3. 如果无法调用包含的命令,代码为:126

4730be62b19b13ebf327d11ce0a44fb3.png

4. 如果找不到包含的命令,代码为:127

8d860f70229666baf05165c768985583.png

今天的分享就到这里,欢迎大家关注,收藏,转发,评论。谢谢大家支持!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐