docker容器定时自动重启

群晖下我使用的人人影视的镜像是 auska/docker-rrshareweb 和LEDE下用的一样

但有个bug,我也不知道怎么回事。运行该镜像1~2天后,CPU占用率奇高,重启才能恢复。

于是就想着每天凌晨2点重启一次人人影视的容器,解决其CPU占用高的问题。

以下方法同样适用于LEDE,而且LEDE的定时任务(crontab)在WEB端很好管理,就不再啰嗦。

切换到root

登录SSH,输入

sudo -i

输入群晖密码即可切换到root身份

获取容器ID(CONTAINER ID)

docker ps -a

如上图所示,83cbcb1a5766 即为人人影视的容器ID,重启该容器命令则为

注:容器ID均不一样,不要复制下面的,请按步骤自行获取

docker restart 83cbcb1a5766

添加定时任务

两种方法

1.WEB端

按下图顺序,添加一个定时任务,每6个小时执行重启,添加完保存即可生效

2.直接编辑crontab

群晖下并不能像其他Linux系统一样,直接使用 crontab -e 来管理定时任务

不过可以使用shell下的vi\vim编辑工具来编辑管理定时任务,

群晖的crontab格式为:

minute hour mday month wday who command

所以每天凌晨2点执行重启人人docker容器的crontab规则为

0 2 * * * root docker restart 83cbcb1a5766

vi/vim的使用方法不再啰嗦

vim /etc/crontab

也可以使用WinSCP软件直接编辑该文件

使定时任务生效

将群晖的crontab服务重启一下就可以了

synoservice -restart crond

Docker容器无法被stop or kill问题

问题过程

某环境一个mysql容器无法被stop or kill or rm

sudo docker ps | grep mysql 查看该容器

7844250860f8 mysql:5.7.22   "/.r/r docker-entr..."   41 minutes ago   Up 8 minutes   r-dlrel-mysql-1-66df8f33

使用docker stop / docker kill / docker rm -f 等命令处理后,容器立马自动重启

立即查看容器,运行时间为:Up Less than a second,说明容器立马启动了

7844250860f8  mysql:5.7.22   "/.r/r docker-entr..."   42 minutes ago  Up Less than a second   r-dlrel-mysql-1-66df8f33

kill该容器对应的物理进程,依然自动重启

获取物理进程方式:1.docker inspect中的 State.Pid字段为物理进程ID; 2.ps 命令

查看容器restart policy,策略为no,即不会自动重启

如果需要更新运行中容器的restart策略,可以使用该命令:docker update –restart=no my-container

"RestartPolicy": {
    "Name": "no",
    "MaximumRetryCount": 0
},

程序员之间神奇的问题解决方式

你是否出现过这种场景:

  • 百思不得其解的问题,当走到同事面前,刚把问题说清楚,自己就恍然大悟了
  • 问题明明很简单,但程序运行就是出问题,然后找个同事帮忙检查下基础配置,自己又顿悟了。

这次我属于第一种,刚把问题说完,立马想起:擦,是容器编排工具Rancher在做调度,容器挂了之后会自动重启

登录rancher一看,果然如此,”乌龙”问题。虽这次不是问题,但Docker确实有无法stop的问题,资料也很多。

拓展阅读: Docker Restart Policy

解决过程中了解了很多Docker Restart Policy知识和Bug,这篇文章写的简单易懂:Ensuring Containers Are Always Running with Docker’s Restart Policy

这里仅做下记录,学习下Docker的四种Restart Policy。

no

no是默认策略,在任何情况下都不会restart容器

on-failure

on-failure表示如果容器 exit code异常时将restart,如果容器exit code正常将不做任何处理。

sudo docker run -d --name testing_restarts --restart on-failure:5 testing_restarts
85ff2f096bac9965a9b8cffbb73c1642bf7b64a2173bbd145961231861b95819

on-failure:max-retries,max-retries表示最大重启次数。

on-failure的好处是:如果容器以正常exit code终止,将不会 restart

always

无论容器exit code是什么,都会自动restart。列举几个场景:

  • 容器以非正常状态码终止(如应用内存不足导致终止)
  • 容器被正常 stopped,然后机器重启或Docker服务重启
  • 容器在宕机在正常运行,然后重启机器或Docker服务重启

以上情况always侧露都会restart容器,但是如果是 on-failure和no策略,机器被重启之后容器将无法restart。

###unless-stopped

unless-stoppedalways 基本一样,只有一个场景 unless-stopped有点特殊:

如果容器正常stopped,然后机器重启或docker服务重启,这种情况下容器将不会被restart