Docker容器:服务与完整应用程序

时间:2014-06-12 18:29:33

标签: docker

我正在与自己就如何思考和使用Docker容器进行辩论。

从文献和示例看来,容器应该真正提供服务或堆栈的一部分。例如,容器可能运行MySQL,Apache或redis等等。我能理解为什么这很干净,而且很有道理。

在我们的场景中,我们希望在同一台服务器上托管多个完全独立的Web应用程序(电子商务商店,wordpress站点,静态网站,node.js应用程序),我们希望使用Docker。因此,对于我来说,每个容器完全是自容器更有意义,整个堆叠本身就是例如我可能运行的几个wordpress容器中的每一个都有自己的LAMP安装。

将one-container-one-service模型应用于此场景似乎非常复杂 - 每个应用程序都依赖于系统中的其他容器,而这些容器又将依赖于其他容器。如果您需要特定服务的多个版本,该怎么办?

虽然这似乎是要走的路,但它似乎也可能非常低效?我不是LXC如何工作的专家,但即使一切都是集装箱化的,系统上运行的所有那些apache2工作者和mysqld都会出现所有相关的开销 - 是否存在性能问题?

有没有人有任何想法?

3 个答案:

答案 0 :(得分:3)

我更喜欢每个应用一个容器。如果您将每项服务放在一个图像/容器中,您就会有一些优势:

  • 您可以轻松编写新堆栈,使用Apache而不是Nginx。
  • 您可以重复使用组件,例如我使用每个应用程序部署相同的Logstash映像来收集日志。
  • 您可以使用Docker Index(现在称为Docker Hub)中的预定义服务。如果您需要设置Memcached服务,您只需提取图像即可。
  • 您可以控制每项服务,例如停止或更新它。如果您想要更新您的应用,只需重建一张图片,只需上传/下载一张图片。

由于LXC和Docker似乎效率很高,我不介意使用多个容器。这就是Docker的设计目标。而且我认为你会有一个合理的数字,比方说< 100个容器。所以它应该不是问题。

答案 1 :(得分:1)

我同意@Thomasleveil,而且我想提及FLOSS Weekly episode 330原始Docker的作者和现在的CTO指出同样的事实, Docker只是一个构建块。教育自己并使用它,只要它符合您的需求。很多人都使用Docker两种方式 - 每个容器的进程数和每个容器的应用程序。两种方式各有利弊。

但我也想警告不要使用Supervisor作为PID1进程来管理容器中的多个进程。如果您打开supervisord.org,您将看到的第一件事就是:

  

与其中一些程序不同,它[Supervisor]并不意味着作为“进程ID 1”替代init。相反,它旨在用于控制与项目或客户相关的流程,并且意味着在启动时像任何其他程序一样启动。

这意味着使用Supervisor,您将遇到phusionminit's author所描述的僵尸流程问题。此外,Supervisor只管理前台进程,因为它将它们作为子进程生成,并且不管理子进程的子进程。所以忘记education-unit并弄清楚如何在前台运行所有内容。

我设法通过上述minitMonit解决了这个问题。需要euid因为Monit也无法担任PID1的角色(但计划在2015年使用,请参阅#176)。 Monit很好,因为它允许表达受监视的服务依赖性(比如,在数据库未启动之前不启动应用程序)并且可以按原样处理守护进程,监视内存,CPU,并且具有Web UI以查看正在发生的事情。除了the dockerfile之外,我在Debain Wheezy上使用了这种方法:

EducationUnit::find()->groupBy('version_vid')->orderBy('version_date DESC');

这是Monit的/etc/init.d/mysql start

minit

答案 2 :(得分:0)

Docker只是一个工具,使用它最适合您的需求。

没有什么能阻止您在Docker容器中运行多个进程。 一种方法是使用this Docker article中描述的supervisord启动流程。

您还可以查看该用例的Phusions's approach。他们强调在Docker容器中运行多个进程时可能出现的问题,并提供有助于正确设置事物的Docker镜像(Phusion/baseimage)。