docker集装箱内的多个线程

我需要在Docker容器内产生N个线程。 我将收到一个元素列表,然后将它分成块,每个线程将处理每个块。

所以我正在使用一个进程和N个线程的docker集装箱。 docker工人是不是很好的做法? 我想是的,因为我们有,例如,处理连接产生线程的apacha web服务器。

或者每个块都会产生N个容器? 如果是这样,那么做这个的正确方法是什么?

这样的容器与您需要执行的计算无关。 你正在发布的问题是我是否应该有多个进程正在执行我的处理,或者多个进程是由同一个进程进行处理?

容器只是一个在所需环境中运行应用程序的平台 。 期。 这意味着,您将在容器中运行一个进程来运行您的业务逻辑。 多个容器只是意味着多个进程,因为它build议, 你应该去多个线程,而不是多个进程产卵一个新的进程(在你的情况,作为容器)会吃掉更多的资源 ,也需要更多的内存等。最好只有一个容器可以产生多个线程来为你做这项工作。

但是,它也取决于启动容器的底层机器的configuration 。 如果由于底层硬件的多核function而产生多个具有多个线程的容器是有意义的,那么也应该这样做。

简短的回答:

运行你的程序作为一个单一的docker集装箱。 将Docker容器想象成一个轻量级的独立环境,类似于虚拟环境,您可以在其中运行程序/服务。 该服务可以运行从父程序启动的多个线程 – 它仍然是一个服务在一个docker集装箱上运行。

说明:

让我们假设你有一个程序产生线程,所以一些工作 – 这个程序可能是一个线程池做一些块的计算,或者它可能是一个Web服务器,如Apache。 它甚至可能是一些python代码实例化进程池做计算。 在所有这些情况下,所有的线程和进程都属于可以被认为是单个程序或服务的主进程。 这个单个程序是通过一个用户命令来触发的,这个命令将在Dockerfile的入口点执行。

例如,您可以使用docker hub docker hub ref上的官方apache映像运行apache服务器容器:

docker run -dit --name my-apache-app -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4 

这将运行Apache Web服务器作为一个单一的容器,无论它执行多less个线程,当操作员想要使用docker命令停止,重新启动,删除等时可以很容易地引用它。 而且这样更方便,因为我们不需要担心连接安装量,打开端口,连接多个集装箱,因此它们相互通信。

所以重点是你想为每个服务实例产生一个容器。 例如,如果您想启动父进程的重复实例。 在两台机器上运行apache作为负载平衡configuration的一部分,然后运行两个容器,每个主机上一个容器。

另外,如果您有一个用例需要在批处理系统中运行不同的作业,每个作业都需要安装特定的库,那么这种用例将从环境隔离中受益运行不同的容器。 但是这不是你问的问题,你的问题特别提到了一个Web服务器产生线程和进程利用线程做块工作,并为这些情况下,你产生一个单一的服务/程序容器。