前言
使用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策略的根本区别!!