在没有提供基本系统服务的情况下在Docker中运行单个进程是错误的吗?

在阅读了phusion / baseimage的介绍之后,我觉得从Ubuntu映像或任何其他官方发行版映像创build容器,并在容器内运行单个应用程序进程是错误的。

主要原因是:

  • 没有适当的init进程(处理僵尸和孤立进程)
  • 没有系统日志服务

基于这个事实,docker中心上的大多数官方docker图像似乎都是错误的。 例如,MySQL映像运行mysqld作为唯一的进程,除了通过mysqld写入到STDOUTSTDERR消息(通过docker logs可访问)之外,不提供任何日志loggingfunction。

现在问题出现在Docker容器中运行服务的适当方式。 在Docker容器中只运行一个应用程序进程而不提供像syslog这样的基本Linux系统服务是错误的吗? 它取决于容器内运行的服务的types吗?

请检查这个讨论在这个问题上的一个很好的阅读。 基本上,所罗门·海克斯(Solomon Hykes)和docker工(Docker)的正式派对线是,docker集装箱应尽可能接近单一stream程的微型服务器。 在一个“真实”的服务器上可能有很多这样的服务器。 如果一个进程失败,你应该启动一个新的docker集装箱,而不是尝试在容器内设置初始化等。 所以如果你正在寻找规范的最佳实践,答案是没有基本的Linux服务。 当你考虑许多在单个节点上运行的docker容器时,你真的希望他们都能运行他们自己的这些服务版本,这也是有道理的吗?

这就是说,在docker服务login的状态是着名的破碎 。 即使docker工人的所罗门·海克斯(Solomon Hykes)也承认正在进行的工作。 此外,您通常需要更多的实际部署灵活性。 我通常使用卷将我的日志挂载到主机系统上,并在主机虚拟机中运行日志循环守护进程等。 同样,我要么安装sshd,要么在容器中打开一个交互式shell,这样我就可以在不重新启动的情况下发出一些小命令,至less在我真的确定我的容器是密封的,不需要更多的debugging。

编辑:使用docker 1.3和exec命令不再需要“让交互式shell打开”。

这取决于您正在运行的服务的types。

Docker允许您“在任何地方构build,发布和运行任何应用程序”(来自网站)。 这告诉我,如果一个“应用程序”包含/需要多个服务/进程,那么应该在一个单一的Docker容器中运行。 如果用户不得不下载,然后运行多个Docker镜像来运行一个应用程序,那将是一件痛苦的事情。

作为一个方面的说明,分解您的应用程序成多个图像是受configuration漂移。

我可以看到为什么你想要一个docker容器限制到一个进程。 一个原因是正常运行时间。 在创buildDocker供应系统时,必须将容器的正常运行时间降至最低,以便横向缩放。 这意味着,如果我可以摆脱每个Docker容器的单个进程,那么我应该去做。 但是这并不总是可能的。

直接回答你的问题。 不,在Docker中运行单个进程并不是错误的。

HTH