在许多博客文章中,以及一般的观点中,有句谚语说“每个容器都有一个过程”。
为什么会有这样的规则?为什么不在单个容器中运行ntp、nginx、uwsgi和更多的进程?
博客文章提到了这条规则:
发布于 2017-03-09 15:30:06
让我们暂时忘掉高层建筑和哲学上的争论吧。虽然在某些边缘情况下,单个容器中的多个函数可能是有意义的,但有一些非常实际的理由可以让您考虑遵循“每个容器一个函数”作为经验规则:
注意,我说的是函数,而不是进程。这种语言已经过时了。正式的码头文档已经搬走了从说“一个过程”改为推荐每个容器“一个关注点”。
发布于 2017-08-31 14:18:50
在几天前杀死了一个“两个进程”容器之后,我有一些痛苦之处,这使我不得不使用两个容器,而不是一个启动两个进程的python脚本:
发布于 2017-03-09 08:59:14
推荐来自于操作系统级虚拟化的目标和设计。
容器被设计为通过为进程提供自己的用户空间和文件系统来隔离其他进程。
这是chroot的逻辑发展,它提供了一个独立的文件系统,下一步是将进程与其他进程隔离开来,以避免内存覆盖,并允许从多个进程中无冲突地使用相同的资源(例如,TCP端口8080 )。
容器的主要兴趣在于它可以为流程打包所需的库,而不必担心版本冲突。如果您在同一个用户空间和文件系统中运行两个版本的相同库的倍数进程,则必须至少为每个进程调整LDPATH,以便首先找到适当的库,并且某些库不能这样调整,因为它们的路径在编译时是在可执行文件中硬编码的,有关更多细节,请参阅这个问题。
在网络级别,您必须配置每个进程以避免使用相同的端口。
在同一个容器中运行多个进程需要一些很大的调整,而且在一天结束时,如果您可以在同一个用户空间内运行多个进程,共享相同的文件集和网络资源,那么为什么不在主机本身上运行它们呢?
以下是我能想到的重大调整/陷阱的非详尽清单:
docker logs时,如果不能很容易地识别源,就会成为分析的噩梦。最后,当您有多个进程时,您正在复制一个OS,在本例中,使用硬件虚拟化听起来更符合这一需要。
https://devops.stackexchange.com/questions/447
复制相似问题