Docker可以在运行时自动创建个性化/动态容器吗?



我正在开发一个允许用户提交python脚本的应用程序。这些python脚本将包含语言模型(LMs),应用程序将使用这些模型来计算某些指标。

我计划在Docker容器中运行这些脚本,以考虑可伸缩性和安全性问题。它们将起到"黑盒"的作用。它将接受输入并返回输出,而无需应用程序知道容器内部发生了什么。

现在,我只需要得到一个概念验证工作,我假设Docker允许用户不仅手动创建容器,而且还自动创建容器。经过几个小时的搜索,我相信我被证明是错的。我读过一个叫Kubernetes的东西,但我不确定这是否是我需要的。

所以我的问题很简单:是否可以只使用Docker来实现这一点,或者我需要学习其他工具,如Kubernetes来实现这一点?

我考虑过(只是为了概念验证)使用一个python程序来调用提交的代码,但是我不知道它如何从提交的代码的导入中安装必要的包。我也不知道如何保持代码运行,因为LM需要保持加载才能运行,如果script1.py调用script2.py,它将不会继续执行,直到script2.py完成运行,这意味着每次我需要调用其函数时都必须等待LM加载。此外,我已经有一个码头撰写。自动安装所有依赖项并将提交的python脚本装入容器的Yml文件,但必须手动运行。

如果您想查看容器化的一些代码:

这将创建一个带有脚本的容器,该脚本充当LM和服务器之间的中间人,并自动安装LM所需的依赖项。

FROM python:3.9
WORKDIR /usr/app/src
COPY communicator.py ./
COPY lm_submission.py ./
COPY requirements.txt ./
RUN pip3 install -r requirements.txt

这个docker-compose文件手动创建"服务器"。(向lm提供输入并等待输出的东西)和通信器(理论上,将有许多通信器运行多个lm和1个服务器)。此外,chatGPT_roberta_model参数将是一个变量名,根据正在运行的LM的名称而更改)。

version: '3.9'
services:
communicator:
build: .
command: sh -c "sleep 2s; python3 ./communicator.py chatGPT_roberta_model"
environment:
LISTEN_HOST: server
LISTEN_PORT: 5555
ports:
- '5556:5555'
depends_on:
- server
server:
build: ./server/
command: sh -c "python3 ./server.py"
environment:
SEND_HOST: server
SEND_PORT: 5555
ports:
- '5555:5555'

如果您使用正确的工具,那么准备POC所需的时间相对较少。

我建议你开始探索minikube,它是Kubernetes的精简版和可移植版本,非常适合这种类型的用例。

看这里:https://minikube.sigs.k8s.io/docs/start/

显然,这些公司有云提供商或大型Kubernetes集群来满足这些需求;Minikube更适合实验室使用。

(我说Kubernetes是因为,作为一个容器编排器,它肯定是最好的选择,并且最接近可能的生产用例)

然后找出关于Kubernetes部署和服务的资源,以便发布你的黑盒。应用程序。部署将允许您发布1个或多个pod(应用程序+操作系统+网络的实例),服务将允许您在K8s集群内部和/或外部访问应用程序。

https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

https://kubernetes.io/docs/concepts/services-networking/service/

然后可以通过以下几个简单的步骤来确保这些应用程序实例(pod)保持正常运行并始终对最终用户可用—>多容器pod命令睡眠k8

最后,我建议不要创建具有活动root用户的容器(如果可能的话),并防止用户通过SSH访问这些pod;当然,更好的解决方案可能是开发一个前端。

PS:如果你不知道如何生成Kubernetes清单,你可以简单地转换Docker Compose清单——>https://kubernetes.io/docs/tasks/configure-pod-container/translate-compose-kubernetes/

最新更新