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