docker重启策略在on-failure和unless-stopped之间有什么区别?

问题描述 投票:0回答:2

我已阅读关于容器重启策略的docker文档。 但是,我无法理解

on-failure
unless-stopped
之间的区别。

我什么时候会使用其中一种而不是另一种?在什么情况下某个策略会导致启动容器而另一个策略则不会?

docker docker-compose restart
2个回答
44
投票
如果退出代码指示失败,

on-failure
将重新启动,而
unless-stopped
的行为类似于
always
,并且将保持实例运行,除非容器停止。

您可以尝试使用 hello-world 来查看差异。

docker run --restart on-failure hello-world
将运行一次并成功退出,并且运行后续的
docker ps
将指示当前没有正在运行的容器实例。

但是,即使容器成功退出,

docker run --restart unless-stopped hello-world
也会重新启动容器,因此随后运行
docker ps
将向您显示重新启动的实例,直到您停止容器。

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                                  PORTS               NAMES
4d498ebd13a6        hello-world         "/hello"            2 seconds ago       Restarting (0) Less than a second ago                       modest_keldysh

33
投票

Docker 重启策略可以在所有可能的故障中保持容器处于活动状态,我们可以通过多种方式利用它,例如,如果我们有一个在容器上运行的 Web 服务器,并且即使在错误请求下也必须保持其活动状态,我们可以使用

unless-stopped 
标志,它将保持服务器正常运行,直到我们手动停止它。

重新启动标志可以是以下任何一个:-

  1. "no"
    :- 这是默认值,并且永远不会重新启动容器。
  2. on-failure
    :-每当遇到错误时,或者说,每当容器内运行的进程以非零退出代码退出时,它都会重新启动容器。退出代码:- 0 表示没有错误,我们有意终止进程,但任何非零值都是错误。
  3. always
    :- 正如名称所示,无论退出代码是什么,它总是会重新启动容器。此外,即使我们手动停止它,它也会重新启动容器,但为此我们需要重新启动 docker 守护进程。
  4. unless-stopped
    :- 它类似于
    always
    标志,唯一的区别是一旦手动停止容器,即使重新启动 docker 守护进程,它也不会自动重新启动,直到我们再次手动启动容器。

unless-stopped
on-failure
之间的区别是,第一个总是会重新启动,直到我们手动停止它,无论退出代码是什么,而另一个只会在真正失败时重新启动容器,即退出代码=非零。

一旦容器停止,其重新启动标志将被忽略,这是克服重新启动循环的一种方法。这就是为什么在

always
标志的情况下,一旦我们手动停止它,容器将不会重新启动,直到我们重新启动 docker 守护进程。

您可以通过创建一个简单的 redis-server 来轻松测试所有这些标志:

 docker run -d --restart=always --name redis-server redis  # start redis image
 docker container ls # test the status 
 docker stop redis-server # stop the container manually
 docker container ls # test the status again, got the redis-server did not restarted 
 sudo service docker restart # restart the docker daemon 
 # test the status again will find the container is again up and running
 # try the same steps by changing the restart flag with *unless-stopped*
 docker update --restart=unless-stopped redis-server # will update the restart flag of running container.
© www.soinside.com 2019 - 2024. All rights reserved.