我最近研究了一些关于Docker的最佳实践,并就如何或是否处理init进程发表了不同意见。
正如here所指出的,init进程应该不运行。我可以认为容器应该模拟单个进程而不是整个操作系统。
另一方面,如here所述,如果我忽略syslog等基本操作系统服务,可能会出现问题。
通常,如何处理这些案件可能没有绝对的答案。您能否分享一些关于此主题的经验或更多见解?对我来说,两者似乎都是合法的。
答案 0 :(得分:10)
通常,如何处理这些问题可能没有绝对的答案 案例。您能否分享一些经验或更多见解 话题?对我来说,两者似乎都是合法的。
点亮。这个问题没有绝对的答案。
现在,尽管如此,我认为有很大的优势 到每个容器的单进程模型,因为那真的 鼓励您创建可组合的容器(如lego 块:您可以将它们组合在一起以不同的组合来解决问题 问题)那是可扩展的(你可以启动更多的实例) 没有太多努力的特殊服务)。不做疯了 比如你在容器里运行一个ssh守护进程 不鼓励编辑事物"到位"并希望 - 希望 - 成为 更有可能依靠Dockerfiles来生成你的图像 导致更强大,可重复的过程。
另一方面,有些应用程序不会借出
他们自己很适合这个模型。例如,如果你有
应用程序,它会分叉许多子进程并且不正确
对于他们来说,wait()
,你最终得到了一系列僵尸进程。
您可以运行一个完整的init
进程来解决这个问题
问题,或者你可以运行一些简单的like
this(免责声明:我写的那个)or
this。
有些应用程序只是紧密耦合,而且它们是紧密耦合的
可以通过自由派在不同的容器中运行它们
应用Docker卷和--net=container:...
,它更容易
只是为了让它们在同一个容器中运行。
登录Docker特别具有挑战性。运行一些类
容器内的日志收集器以及您的应用程序都可以
这个问题的一个解决方案,但也有其他解决方案。
Logspout很有意思
一,但我一直在寻找内部运行systemd
容器,以便使用journald
进行日志记录。所以,同时
我还在为每个容器运行一个应用程序进程
有一个init
进程和一个journald
进程。
所以,最终,它实际上取决于具体情况:两者都取决于您的需求 以及您尝试运行的特定应用程序的需求。 即使在每个容器中没有单个进程的情况下也是如此 可能,设计容器以提供单个服务 赋予我在第一段中提到的许多优点。