暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

了解docker容器重启策略,这一篇就够了!!!

码农说一说 2021-05-03
5045

前言

使用docker有挺长的时间了,容器启动时常用的参数来来回回还是那几个。是时候对那些似懂非懂的配置项做个深度解析了。so 现在就将docker容器的重启策略详细的讲解吧!

docker容器的重启策略有下面四种:

  • no
  • always
  • on-failure
  • unless-stopped

no
是默认的重启策略,docker容器如启动失败或意外停止后Docker Daemon不会尝试进行重启,除非手动启动容器,否则一直是stop的状态。

always
表示永远重启,它的先决条件是如果你使用docker stop
命令停止了容器则docker不会自行启动该容器,但如果执行docker stop
命令后重启了Docker Daemon则该容器会触发always
重启策略,进而启动容器。

on-failure
重启策略的触发标准是当Docker Daemon
检测到容器非正常停止后则会执行该重启策略。on-failure
要求传入一个整型参数表示重启次数,当重启次数>=
该整数值则不会予以重启。

unless-stopped
重启策略与always
很相似,唯一不同处在于unless-stopped
会在Docker Daemon
启动时会检测docker容器列表内的容器在上次停止时的状态,如果上一次容器停止时就是stop状态则不会启动该容器,否则启动该容器。

实践(放码过来)

OK~纸上得来终觉浅,绝知此事要躬行。我们用一个小的demo来模拟上面的四种重启策略,进而加深对他们的认知。使用一个shell脚本,脚本本身不会做任何事情,它存活20秒后则会非正常停止(容器状态会变更为stop),我们在装有docker的linux服务器上创建如下脚本。

#/bin/bash
sleep 20
exit 1

复制

创建Dockerfile,将shell脚本add到容器内并使用bash执行此脚本。Dockerfile内容如下:

FROM ubuntu
ADD test.sh /
CMD /bin/bash /test.sh

复制

执行命令docker build -t test-restart .
构建docker镜像。

现在准备工作均已完成,我们开始测试docker容器的重启策略。

no重启策略实践

测试用例的服务器上执行以下脚本:

docker run -d  --name=test-restart-no  test-restart

复制

容器创建完毕后通过docker ps
观察已启动的容器列表会发现test-restart-no
容器坚持了20秒后就停止了,且docker daemon并未重启该容器。说明no
策略很诚实,对得起它的命名。

结论:no
重启策略不管容器启动执行结果,失败也好成功也罢但凡容器状态变更为stop
也不会予以任何动作。

always策略

测试用例的服务器上执行以下脚本:

docker run -d  --restart=always  --name=test-restart-always  test-restart 

复制

通过docker ps |grep restart
监控test-restart-always容器发现当20秒到达后docker daemon会将此容器重新启动,因为可以无限重启,所以虽然每次容器的生命周期都只有20秒,但都可以重启,所以表面上看像是一直在启动。我们手动执行docker stop test-restart-always
停止容器。然后再执行systemctl restart docker
重启docker daemon。这时候发现之前手动停止的test-restart-always容器已经被自动启动了。

结论:always
重启策略会在容器非正常停止的基础下重新启动容器,如若我们手动停止了容器,则不会重启,但是当docker daemon重启后也会将设定了always策略的容器启动起来

on-failure策略

测试用例的服务器上执行以下脚本:

docker run -d --restart=on-failure:3 --name=test-restart-on-failure  test-restart 

复制

通过docker ps
脚本执行结果,我们发现test-restart-on-failure容器在运行20秒后就会意外关闭,然后会触发on-failure策略再次重启,当重启3次后容器再一次停止,这一次docker daemon没有再 重启该容器了。

结论:on-failure
的数值参数并不会在容器重启成功后重新计算,只要执行了重启,不论重启操作的结果如何docker daemon都会累加该重启次数与传入的参数值做比较。

unless-stopped策略

测试用例的服务器上执行以下脚本

docker run -d  --restart=unless-stopped --name=test-restart-unless-stopped  test-restart 

复制

上面的命令执行后的结果和always
策略一样,完全没有不同的感受,但我们执行docker stop test-restart-unless-stopped
停止了该容器,再重启docker daemo后发现容器test-restart-unless-stopped并没有重启,而容器test-restart-always却再次重启了。

结论:docker daemon会在每次启动后检查容器列表中重启策略为unless-stopped
的容器,如若这些容器在docker daemon上次停止时最后状态是stop则不启动该容器,否则启动该容器。这也是它与alwarys策略的根本区别!!





文章转载自码农说一说,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论