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

时间:2020-06-10 11:30:58

标签: docker

据我了解,Docker鼓励在容器中使用单个进程。

这如何工作并影响诸如Postgres之类的在查询时可以使用多个进程的应用程序?

泊坞窗是否将Postgres限制为仅使用一个进程,还是使它能够运行多个进程?

1 个答案:

答案 0 :(得分:4)

在技术层面上,当Docker创建容器时,它将在该容器中启动一个进程。在容器的进程名称空间中,Docker启动的单个进程具有进程ID 1,并具有相应的权利和责任。当该进程退出时,容器也会退出。

对该流程启动子流程没有任何特殊限制。如果您具有诸如PostgreSQL,Python多处理或Apache之类的功能,它们可以启动多个子进程工作程序,则这些程序可以正常工作。这些不会违反容器不应该做超过一件事的设计规则。

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

相反,在技术层面上,您可以运行诸如supervisord之类的多进程管理器,也可以运行诸如systemd之类的重量级厨房水槽初始化系统作为主要容器进程。这确实违反了“只做一件事情”的设计规则。这些init进程负责监视其子进程,捕获日志输出以及Docker通常会执行的其他操作,这意味着,如果您需要删除并重新创建容器(一项非常常规的维护任务),则需要处理每个进程。在容器中。

相关问题