定时启动docker容器

对于一些不稳定又难于定位的问题的服务,可以定时重启下,这是最简单的办法。

创建定时任务(centos7)

  1. 查看定时任务格式,输入如下命令:
# cd /etc
# cat crontab

可以看到以下内容


crond.png

编写如下:

  • 0 2 * * * /home/blue/do/rsyncfile_day.sh 每天凌晨2点0分开始执行
  • 0 2 1 4 * /home/blue/do/rsyncfile_day.sh 4月1号凌晨2点0分开始执行
  • 0 2 * */2 * docker exec dnmp_nginx_1 certbot renew 每隔两月凌晨2点执行更新
  1. 查看docker服务
    输入命令docker ps查看相关服务

    docker.png

  2. 创建定时任务
    命令行输入crontab -e会自动打开一个空文件

# crontab -e

然后输入需要重启的docket服务
如每隔5分钟重启下服务

*/5 * * * * docker restart yw-producer/container-id

重启定时任务

systemctl restart crond

然后通过日志观察系统定时重启。

  1. 查看定时任务文件
    在/var/spool/cron/下面
# cd /var/spool/cron
# ls

这里可以看到一个root文件,因为我用的root账号登录,所以生成了一个root文件。

通过cat命令可以看到这个文件的内容就是前面编辑的内容。
也可以使用crontab -l查看所有定时任务。

  1. 查看定时任务执行记录
    执行命令cat /var/spool/mail/root,可以查看执行记录
    image.png

    image.png

定时执行脚本

若需要定时执行某一段脚本,也可以通过上面的定时任务设置

如可以在容器中添加脚本并执行。

  1. 进入容器
docker exec -it crontab_task bash

进入后可以看到以下文件


image.png

新建2个文件如下
shell文件:

#!/usr/bin/env python
python /home/demo1.py

py文件:

#! /usr/bin/env python
if __name__ == '__main__':
   a = 1
   b = 1
   print(a+b)

接下来就是定时任务的设置了, crontab -e设置定时任务

*/1 * * * * docker restart crontab_task && docker exec crontab_task /bin/bash /home/demo.sh

重启定时任务并查看结果。

关于port is already allocated问题

是容器占用的port还没有完全释放
Docker 在启动容器时,报出了下面的错误:

docker: Error response from daemon: driver failed programming external connectivity on endpoint gateway_cc39fe5306c1 (cc39fe5306c1ba7633fa14b9bcddb66536153619bf57b84b30673e2328e9284g): Bind for 0.0.0.0:80 failed: port is already allocated.

查看进程,发现相关的容器并没有在运行,而 docker-proxy 却依然绑定着端口:

docker ps
ps -aux | grep -v grep | grep docker-proxy

删除所有容器,停止 doker 进程,然后删除 local-kv.db 这个文件,再启动 docker 就可以了。

docker rm $(docker ps -aq)
sudo service docker stop
sudo rm /var/lib/docker/network/files/local-kv.db
sudo service docker start