我应该在Docker容器中运行init进程吗?

我最近研究了一些有关Docker的最佳实践,并就如何处理init进程提出了不同的意见。

正如在这里指出的那样,init进程应该运行。 我可以按照这样的想法,一个容器应该build模一个进程而不是整个操作系统。

另一方面,如这里所述,如果我忽略像syslog这样的基本OS服务,可能会出现问题。

如何处理这些案件往往没有绝对的答案。 你能分享一些关于这个话题的经验或更多的见解吗? 对我来说,两人似乎合法。

如何处理这些案件往往没有绝对的答案。 你能分享一些关于这个话题的经验或更多的见解吗? 对我来说,两人似乎合法。

发现。 这个问题没有绝对的答案。

既然如此,我认为单容器单进程模型有很大的好处,因为这真的鼓励你创build可组合的容器(比如乐高积木:你可以把它们放在不同的组合中来解决一个问题)并且是可扩展的 (你可以在不费力的情况下启动一个特定服务的更多实例)。 通过不做疯狂的事情,比如在你的容器中运行一个ssh守护进程,你不鼓励在“适当的位置”编辑东西,而且希望更有可能依靠Docker文件来生成你的图像,这会导致一个更强大,可重复的过程。

另一方面,有一些应用程序不适合这种模式。 例如,如果你有一个应用程序分叉许多subprocess,并且没有正确的wait() ,你最终会收集一些僵尸进程。 你可以运行一个完整的init过程来解决这个问题,或者你可以运行一些简单的东西(免责声明:我写的) 或者这个 。

有些应用程序是真正紧密耦合的,尽pipe可以通过自由应用Docker卷和--net=container:...在单独的容器中运行它们,但是让它们在同一个容器中运行更容易。

loginDocker是特别具有挑战性的。 在应用程序中运行某个容器内的某种日志收集器可以解决这个问题,但也有其他解决scheme。 Logspout是一个有趣的,但我也一直在考虑在容器内运行systemd以便利用journald进行日志logging。 所以,虽然我仍然为每个容器运行一个应用程序进程,但我也有一个init进程和一个journald进程。

因此,最终,这取决于具体情况:无论是根据您的需求还是您尝试运行的特定应用程序的需求。 即使在每个集装箱都无法进行单个处理的情况下,devise集装箱以提供单一服务仍然具有我在第一段中提到的许多优点。