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

时间:2015-03-12 22:51:34

标签: docker init

我最近研究了一些关于Docker的最佳实践,并就如何或是否处理init进程发表了不同意见。

正如here所指出的,init进程应该运行。我可以认为容器应该模拟单个进程而不是整个操作系统。

另一方面,如here所述,如果我忽略syslog等基本操作系统服务,可能会出现问题。

通常,如何处理这些案件可能没有绝对的答案。您能否分享一些关于此主题的经验或更多见解?对我来说,两者似乎都是合法的。

1 个答案:

答案 0 :(得分:10)

  

通常,如何处理这些问题可能没有绝对的答案   案例。您能否分享一些经验或更多见解   话题?对我来说,两者似乎都是合法的。

点亮。这个问题没有绝对的答案。

现在,尽管如此,我认为有很大的优势 到每个容器的单进程模型,因为那真的 鼓励您创建可组合的容器(如lego 块:您可以将它们组合在一起以不同的组合来解决问题 问题)那是可扩展的(你可以启动更多的实例) 没有太多努力的特殊服务)。不做疯了 比如你在容器里运行一个ssh守护进程 不鼓励编辑事物"到位"并希望 - 希望 - 成为 更有可能依靠Dockerfiles来生成你的图像 导致更强大,可重复的过程。

另一方面,有些应用程序不会借出 他们自己很适合这个模型。例如,如果你有 应用程序,它会分叉许多子进程并且不正确 对于他们来说,wait(),你最终得到了一系列僵尸进程。 您可以运行一个完整的init进程来解决这个问题 问题,或者你可以运行一些简单的like this(免责声明:我写的那个)or this

有些应用程序只是紧密耦合,而且它们是紧密耦合的 可以通过自由派在不同的容器中运行它们 应用Docker卷和--net=container:...,它更容易 只是为了让它们在同一个容器中运行。

登录Docker特别具有挑战性。运行一些类 容器内的日志收集器以及您的应用程序都可以 这个问题的一个解决方案,但也有其他解决方案。 Logspout很有意思 一,但我一直在寻找内部运行systemd 容器,以便使用journald进行日志记录。所以,同时 我还在为每个容器运行一个应用程序进程 有一个init进程和一个journald进程。

所以,最终,它实际上取决于具体情况:两者都取决于您的需求 以及您尝试运行的特定应用程序的需求。 即使在每个容器中没有单个进程的情况下也是如此 可能,设计容器以提供单个服务 赋予我在第一段中提到的许多优点。