Docker容器无法被stop or kill问题的解决方法
Dockerversion1.13.1
问题过程
某环境一个mysql容器无法被stoporkillorrm
sudodockerps|grepmysql查看该容器
7844250860f8mysql:5.7.22"/.r/rdocker-entr..."41minutesagoUp8minutesr-dlrel-mysql-1-66df8f33
使用dockerstop/dockerkill/dockerrm-f等命令处理后,容器立马自动重启
立即查看容器,运行时间为:UpLessthanasecond,说明容器立马启动了
7844250860f8mysql:5.7.22"/.r/rdocker-entr..."42minutesagoUpLessthanasecondr-dlrel-mysql-1-66df8f33
kill该容器对应的物理进程,依然自动重启
获取物理进程方式:1.dockerinspect中的State.Pid字段为物理进程ID;2.ps命令
查看容器restartpolicy,策略为no,即不会自动重启
如果需要更新运行中容器的restart策略,可以使用该命令:dockerupdate–restart=nomy-container
"RestartPolicy":{ "Name":"no", "MaximumRetryCount":0 },
程序员之间神奇的问题解决方式
你是否出现过这种场景:
- 百思不得其解的问题,当走到同事面前,刚把问题说清楚,自己就恍然大悟了。
- 问题明明很简单,但程序运行就是出问题,然后找个同事帮忙检查下基础配置,自己又顿悟了。
这次我属于第一种,刚把问题说完,立马想起:擦,是容器编排工具Rancher在做调度,容器挂了之后会自动重启。
登录rancher一看,果然如此,”乌龙”问题。虽这次不是问题,但Docker确实有无法stop的问题,资料也很多。
拓展阅读:DockerRestartPolicy
解决过程中了解了很多DockerRestartPolicy知识和Bug,这篇文章写的简单易懂:EnsuringContainersAreAlwaysRunningwithDocker'sRestartPolicy
这里仅做下记录,学习下Docker的四种RestartPolicy。
no
no是默认策略,在任何情况下都不会restart容器
on-failure
on-failure表示如果容器exitcode异常时将restart,如果容器exitcode正常将不做任何处理。
sudodockerrun-d--nametesting_restarts--restarton-failure:5testing_restarts 85ff2f096bac9965a9b8cffbb73c1642bf7b64a2173bbd145961231861b95819
on-failure[:max-retries],max-retries表示最大重启次数。
on-failure的好处是:如果容器以正常exitcode终止,将不会restart
always
无论容器exitcode是什么,都会自动restart。列举几个场景:
- 容器以非正常状态码终止(如应用内存不足导致终止)
- 容器被正常stopped,然后机器重启或Docker服务重启
- 容器在宕机在正常运行,然后重启机器或Docker服务重启
以上情况always侧露都会restart容器,但是如果是on-failure和no策略,机器被重启之后容器将无法restart。
unless-stopped
unless-stopped和always基本一样,只有一个场景unless-stopped有点特殊:
如果容器正常stopped,然后机器重启或docker服务重启,这种情况下容器将不会被restart
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。