首页 > 解决方案 > Docker 作为“功能”(根据请求创建一个 Docker)

问题描述

有没有一种简单的方法可以为每个请求创建一个 docker 容器的 istance?

我有一个 Docker 容器,它需要很长时间来计算数学算法。运行时,不能并行处理其他请求。Lambda Functions 会是最好的解决方案,但是容器需要下载超过 1GB 的数据,并且需要至少 10 个内核和 5GB 内存才能执行,因此 Lambda 成本太高。

我们有一个大集群(1000 个内核,0.5TB RAM),我正在考虑使用 NGINX 负载均衡器或 Kubernetes 裸机。是否可以按照每个请求创建一个实例的方式进行配置(类似于 Lambda 函数)?

标签: dockernginxdocker-swarm

解决方案


您可能需要将 HTTP 服务与后端处理分离。如果作业需要几分钟或更长时间才能运行,大多数浏览器和其他 HTTP 客户端将在它完成之前超时,因此它的 HTTP 端需要以某种方式启动作业并立即返回某种成功消息。

完成此操作后,您可能会发现像 RabbitMQ 这样的作业队列是一种有用的基础设施技术。同样,这将作业队列与实际运行它们的机制分离。在 Docker/Kubernetes 空间中,您将启动一些持久的工作人员,这些工作人员都听队列并按照它出现在那里的方式工作。您不一定会为每个工作启动一名工人;或者您可能只有一个启动其他 Docker 容器或 Kubernetes 作业的工作人员;但是如果工作积压的时间太长,您可以启动额外的工作人员。

在纯 Docker 空间中,理论上可以使用 Docker API 来启动其他容器。但是,这样做可以让您的进程无限地访问主机的根级别;如果你在 HTTP 服务器的上下文中运行它,你需要非常小心安全考虑。Kubernetes 也有一个 API,从安全的角度来看,这可能更好:您可以设置一个服务帐户,该帐户仅具有启动作业的权限,并为每个到达的入站作业启动一个作业。(安全性仍然很重要,但恶意输入要 root 主机要困难得多。)


推荐阅读