我们可以在Docker中运行多进程程序吗?

我有一些代码使用这样的多进程:

import multiprocessing from multiprocessing import Pool pool = Pool(processes=100) result = [] for job in job_list: result.append( pool.apply_async( handle_job, (job) ) ) pool.close() pool.join() 

这个程序正在计算非常大的数据集。 所以我们需要多个进程来同时处理这个工作来提高性能。

我被告知,对于主机系统,一个docker集装箱只是一个过程。 所以我想知道如何在Docker中处理我的多进程?

以下是我的关心:

  1. 由于容器只是一个进程,我的多进程代码在进程中会变成multithreading吗?

  2. 表演会下降吗? 因为我使用多进程的原因是同时完成工作以获得更好的性能。

Docker包含了名字空间的进程ID,并完全支持内核运行多个进程。 在一个容器内部,你可以运行ps来查看隔离的进程列表(这通常只是你的shell和ps命令)。

用于运行单个应用程序的docker的描述是将应用程序隔离技术与那些您将在后台启动Web服务器,邮件服务器,ssh守护进程等更常见的OS虚拟化工具分离。

谨慎的几句话:

  • 一旦pid 1退出,您的容器就会结束,无论您的分支进程是否仍在运行。
  • 如果没有init,退出的父进程没有收到的进程将保持为僵尸(它们不会通过命名空间隔离来到主机init进程)。 如果这是一个问题( tini github repo ),那么可以运行一个tini应用程序作为入口点来清理这些应用程序。

是的,看看有关主pipe的文档https://docs.docker.com/engine/admin/using_supervisord/

您也可以使用守护进程工具http://cr.yp.to/daemontools.html

或s6 http://skarnet.org/software/s6/