Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Docker中运行的多进程应用程序(如Postgres)会发生什么情况?_Docker - Fatal编程技术网

在Docker中运行的多进程应用程序(如Postgres)会发生什么情况?

在Docker中运行的多进程应用程序(如Postgres)会发生什么情况?,docker,Docker,据我所知,Docker鼓励容器中的单个进程 这是如何工作的,如何影响Postgres等在查询时可以使用多个进程的应用程序 docker是将Postgres限制为只使用一个进程,还是使其能够运行多个进程?如果是,如何实现?在技术层面上,docker创建容器时,会在该容器中启动单个进程。在容器的进程名称空间中,Docker启动的单个进程的进程ID为1,其中包含相应的权利和责任。当该进程退出时,容器也会退出 启动子流程的流程没有任何特殊限制。如果您有像PostgreSQL、Python多处理或Apac

据我所知,Docker鼓励容器中的单个进程

这是如何工作的,如何影响Postgres等在查询时可以使用多个进程的应用程序


docker是将Postgres限制为只使用一个进程,还是使其能够运行多个进程?如果是,如何实现?

在技术层面上,docker创建容器时,会在该容器中启动单个进程。在容器的进程名称空间中,Docker启动的单个进程的进程ID为1,其中包含相应的权利和责任。当该进程退出时,容器也会退出

启动子流程的流程没有任何特殊限制。如果您有像PostgreSQL、Python多处理或Apache这样的启动多个子进程工作者的工具,那么这些工具可以正常工作。这些并没有打破容器不能做多件事的设计规则

需要注意的一件事是,这些子流程本身是否启动子流程。假设A启动B,B启动C,然后B退出。标准的Unix规则是C(孙子进程)将其父进程ID重置为1(初始化进程);在Docker上下文中,这是主容器进程。如果您没有为此做好准备,那么您的容器中可能会有僵尸进程或意外的
SIGCHLD
通知。一个常见的解决方案是将一个轻量级的专用init进程(
tini
)作为进程1运行,并让它作为其唯一的子进程启动主进程


相反,在技术层面上,您可以运行一个多进程管理器,如
supervisord
,或者,通过一些努力,运行一个重型厨房水槽初始化系统,如
systemd
,作为主容器进程。这确实打破了“只做一件事”的设计规则。这些init进程负责监视它们的子进程、捕获日志输出以及Docker通常会做的其他事情,这意味着如果您需要删除并重新创建容器(一项非常常规的维护任务),那么您就要使用容器中的每个进程。

在技术层面,Docker创建容器时,会在该容器中启动单个进程。在容器的进程名称空间中,Docker启动的单个进程的进程ID为1,其中包含相应的权利和责任。当该进程退出时,容器也会退出

启动子流程的流程没有任何特殊限制。如果您有像PostgreSQL、Python多处理或Apache这样的启动多个子进程工作者的工具,那么这些工具可以正常工作。这些并没有打破容器不能做多件事的设计规则

需要注意的一件事是,这些子流程本身是否启动子流程。假设A启动B,B启动C,然后B退出。标准的Unix规则是C(孙子进程)将其父进程ID重置为1(初始化进程);在Docker上下文中,这是主容器进程。如果您没有为此做好准备,那么您的容器中可能会有僵尸进程或意外的
SIGCHLD
通知。一个常见的解决方案是将一个轻量级的专用init进程(
tini
)作为进程1运行,并让它作为其唯一的子进程启动主进程


相反,在技术层面上,您可以运行一个多进程管理器,如
supervisord
,或者,通过一些努力,运行一个重型厨房水槽初始化系统,如
systemd
,作为主容器进程。这确实打破了“只做一件事”的设计规则。这些init进程负责监视它们的子进程、捕获日志输出以及Docker通常会做的其他事情,这意味着如果您需要删除并重新创建容器(一项非常常规的维护任务),那么您就要将容器中的每个进程都带在一起。

在a、B、C示例中,如果B启动C且B从不存在,则僵尸进程或任何其他问题是否仍然会发生?如果B成功**等待**(2)s其子进程,则没有问题。在a、B、C示例中,如果B启动C且B从不存在,则僵尸进程或任何其他问题是否仍然会发生?如果B成功**等待**(2)s其子进程,则没有问题。