如何使用docker来运行多个开源Web应用程序?

时间:2015-10-26 03:39:21

标签: docker

通常建议每个docker容器运行一个进程。如果您尝试运行需要不同类型工具的单个Web应用程序,这是有道理的。

例如,开源Web应用程序kanboard使用

  • MySQL的
  • 阿帕奇
  • PHP5
  • 内存缓存

现在,如果这是我要运行的唯一Web应用程序,那么在每个容器中运行每个工具以利用docker 每个容器一个进程是有意义的。

但是说,我只想运行多个Web应用程序,而不是只运行一个Web应用程序,

  • kanboard
  • EtherPad的
  • owncloud
  • dockuwiki
  • 话语

现在我如何使用docker隔离这些Web应用程序?我问的原因是因为上面提到的每个应用程序可能都有自己的,

  • 后端数据存储(mysql,postgres,sqlite)
  • 缓存存储(memcache,redis)
  • 并发任务管理(celery,queues,RQ,SHARQ)
  • 网络服务器(nginx,apache)
  • 搜索服务器(lucene,sphinx,opensearchserver)

有两种方法可以使用docker来运行这些Web应用程序。我知道的两种方式,

  • 在单个容器中运行每个应用程序及其所有依赖项。一个用于kanboard,一个用于以太网,等等。
  • 坚持one process per container的码头工人的格言,并为mysql,postgres,sqlite,memcache等创建一个,并为每个应用程序代码本身创建一个,并使用docker linking将相关容器链接在一起。这更麻烦。需要更多的组织和管理。

我的问题是,还有其他办法吗?如果我不选择上述哪个选项以及为什么?

或许我使用错误的工具(码头工具箱)来完成工作?也许还有另一种方法可以在不使用docker容器的情况下完成应用程序隔离?

3 个答案:

答案 0 :(得分:0)

每个容器可以运行多个进程 您只需使用能够管理生命终结的所有流程的基础映像(请参阅“PID 1 zombie reaping issue”)。使用知道如何执行此操作的基本映像:phusion/baseimage-docker

然后,每个webapp(包含其所有相关进程)将有一个容器

检查你是否可以在他们自己的容器中放入一些这些进程。

通常,NGiNX只能运行一个额外的容器,对所有其他Web应用程序进行反向代理,允许通过相同的URL访问它们(url/discourse将重定向到容器管理话语,url/plex到plex的那个,等等)

答案 1 :(得分:0)

原则上,您的第二种方法是首选。像docker compose这样的工具可以帮助您解决链接的混乱问题。

答案 2 :(得分:0)

你说:

  

这更麻烦。需要更多的组织和管理。

我认为这反过来是完全的。以下是我的优点和缺点:

多进程:

<强>优点

  • 每个应用程序一个Dockerimage / -container

<强>缺点

  • 您确实需要确保初始脚本(以CMDENTRYPOINT运行)正确监控每个进程。如果有任何失败,你最终会得到一个失败的容器
  • 努力让所有东西在容器内正确运行,例如应该在应用程序之前运行并设置数据库,redis等。
  • 无法在不删除所有内容的情况下更新一个组件。
  • 无法垂直扩展:出于运行一个数据库的性能原因,您需要两个前端?这种方法没有机会
  • 每张图片都必须由您自己开发和维护。没有机会使用供应商图像
  • 如果一个组件需要更新,则必须更新整个内容

我最近完成了同样的任务,由于以下原因,我决定去第二个appraoch:

的优点:

  • 您可以使用供应商图片(例如postgres,wordpress等),无需制作自己的图片
  • 垂直缩放:需要网络服务器,使用该图像的两个容器

缺点:

  • 如果手工完成,会更笨拙。

我真的推荐第二种方法。使用上述docker-compose之类的工具,您可以在一个docker-compose.yml

中配置的不同容器中“构建”您的应用

如果你然后使用像https://github.com/jwilder/nginx-proxy这样的工具(我做过,就像魅力一样),即使反向代理也很简单,你可以在一台主机上运行X不同的软件。

通过这种方式,我们为公司设置了jenkins,redmine,cms和更多东西。希望这可以帮助您做出决定。