在Docker群集中安排任务的最佳方法是什么?

时间:2017-04-07 14:54:59

标签: docker cron containers scheduler

目前,我在一台服务器上运行了一个应用程序。根据指定的规则设置了crontab,在某些时间运行任务。

现在,我正考虑将我的应用迁移到docker容器中,以便我能够独立运行我的应用的多个实例。我想知道该怎么做的是如何在多个泊坞容器中安排任务

让我们说我有一个php命令,每小时通过API从第三方应用程序获取新数据。目前,我会使用cron来安排它:0 */1 * * * php /some/path/index.php mycommand。可以在不同的频率上发起多个类似的命令。

我不能简单地将crontab打包到我的docker镜像中,因为当有5个容器运行时,命令将被启动5次。我想在运行容器计数时独立启动它一次。

实现这一目标的理想解决方案是什么?

2 个答案:

答案 0 :(得分:3)

您可以使用锁定机制,使用像redis这样的东西。基本上它会像这样工作。

脚本醒来,首先它是,尝试获取锁定。如果它获得锁定,那么它向前移动,如果其他东西有锁定,则退出。执行脚本执行的操作,然后释放锁定。

由于一次只能有一个脚本获取锁,因此只允许脚本运行一次。

在脚本完成时删除锁定很重要,并且还要向锁定添加TTL,这样如果脚本在释放锁定之前死亡,则锁定将在TTL到期后自动打开。

以下是一些有关如何将Redis用作分布式锁的文档。 https://redis.io/topics/distlock

答案 1 :(得分:1)

您的案例中的一个简单策略是使用具有不同角色的容器。例如,不是使用响应HTTP请求和运行cron的5个容器,而是只有4个容器运行应用程序,而另一个容器专门用于cron作业。

如果您需要扩展您的cron作业以添加更多节点,那么您需要一个分布式队列/锁定解决方案,如@Ken Cochrane所述。