首页 > 解决方案 > 如何为每个 Web 服务请求创建一个 docker 容器?

问题描述

我有一个非常繁重的批处理(一个名为“ run_simulation.py”的python脚本),我几乎无法控制它,它可以由单个用户通过web api启动,但它从磁盘读取和写入,因此它不会处理并行请求.

现在,我想为每个请求实例化一个 docker 容器,以便可以并行处理所有请求,这样做的方法是什么?这对 Docker 是否可行?负责实例化容器并将http请求传递给它的模块是什么?

标签: web-servicesdocker

解决方案


通常你不会这样做。这样做有两个很好的理由:如果您根据请求无条件地启动一个容器,那么很容易将您的系统淹没在这些后台作业中,以至于无法进行;并且允许您启动更多 Docker 容器的设置还将为您提供对主机的无限根级访问权限,这在接受网络请求的进程中是您不希望的。

一个更好的方法是建立一个作业队列系统。 RabbitMQ很流行并且是开源的,但绝不是唯一的选择。当您收到需要后台工作的请求时,您将作业添加到队列中并立即返回。同时,您有一些工作进程从队列中接受作业并完成工作。

这给您带来了一些好处。您可以控制可以并行完成的工作量(通过控制工作容器的数量)。如果您需要通过设置第二台服务器(甚至更多)来完成更多工作,它们都可以连接回同一个队列服务器,而无需复杂的多主机容器设置。如果您的工作人员崩溃(或被 OOM 杀死),他们的工作将返回到队列中,并且可以被其他工作人员拾取并重试。如果您认为 Docker 不适合您,或者您需要不同的编排器(Nomad、Kubernetes),您可以运行完全相同的设置而无需更改任何代码,只需更改部署配置。


推荐阅读