我已阅读关于容器重启策略的docker文档。 但是,我无法理解
on-failure
和unless-stopped
之间的区别。
我什么时候会使用其中一种而不是另一种?在什么情况下某个策略会导致启动容器而另一个策略则不会?
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
Docker 重启策略可以在所有可能的故障中保持容器处于活动状态,我们可以通过多种方式利用它,例如,如果我们有一个在容器上运行的 Web 服务器,并且即使在错误请求下也必须保持其活动状态,我们可以使用
unless-stopped
标志,它将保持服务器正常运行,直到我们手动停止它。
重新启动标志可以是以下任何一个:-
"no"
:- 这是默认值,并且永远不会重新启动容器。on-failure
:-每当遇到错误时,或者说,每当容器内运行的进程以非零退出代码退出时,它都会重新启动容器。退出代码:- 0 表示没有错误,我们有意终止进程,但任何非零值都是错误。always
:- 正如名称所示,无论退出代码是什么,它总是会重新启动容器。此外,即使我们手动停止它,它也会重新启动容器,但为此我们需要重新启动 docker 守护进程。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.