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

一般build议每个docker集装箱运行一个进程。 如果您正在尝试运行需要不同types工具的单个Web应用程序,这是有道理的。

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

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

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

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

  • kanboard
  • EtherPad的
  • owncloud
  • dockuwiki
  • 演讲

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

  • 后端数据存储(mysql,postgres,sqlite)
  • caching存储(memcache,redis)
  • 并发任务pipe理(芹菜,队列,RQ,SHARQ)
  • web服务器(nginx,apache)
  • search服务器(lucene,sphinx,opensearchserver)

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

  • 在一个容器中运行每个应用程序及其所有依赖关系。 一个用于kanboard,一个用于etherpad等等。
  • 坚持one process per containerdocker说明书,并为mysql,postgres,sqlite,memcache等创build一个,为每个应用程序代码本身创build一个,并使用docker linking链接将相关的容器链接在一起。 这比较乱。 需要更多的组织和pipe理。

我的问题是,如果有任何其他的方式? 如果不能select上述哪个选项,为什么?

或者,也许我使用错误的工具(docker集装箱)的工作? 也许有另外一种方法来完成应用程序隔离而不使用docker容器?

您可以为每个容器运行多个进程。
您只需使用能够pipe理所有这些stream程即将结束的基础映像(请参阅“ PID 1僵尸收割问题 ”)。 使用一个基本的图像知道如何做到这一点: phusion/baseimage-docker

然后你将有一个容器每个Web应用程序(及其所有依赖进程)

检查你是否可以在自己的容器中将这些进程的一些共同点。

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

原则上,您的第二种方法是优选的。 像泊坞窗撰写工具可能会帮助你打击链接的混乱。

你说:

这比较乱。 需要更多的组织和pipe理。

我认为这是完全相反的。 这是我的优点和缺点:

多进程:

利弊

  • 一个Dockerimage / – 容器每个应用程序

缺点

  • 您确实需要确保每个进程都可以通过您的init脚本(作为CMDENTRYPOINT运行)正确监控。 如果有什么不成功的话,你最终会失败的容器
  • 努力让所有东西在容器内正确运行,例如数据库,Redis等应该在应用程序之前运行和设置。
  • 没有办法更新只是一个组件,没有取消一切。
  • 没有办法垂直扩展:您将需要两个前端性能的原因与一个数据库运行? 这种方法没有机会
  • 每个图像必须由您自己开发和维护。 没有机会使用供应商的图像
  • 如果一个组件需要更新,则必须更新整个事物

我最近的任务完全一样,我决定去第二次,原因如下:

优点:

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

缺点:

  • 如果手工完成,则更笨拙一点。

我真的推荐第二种方法。 有了像提到的docker-compose这样的工具,你就可以在一个docker-compose.ymlconfiguration的不同容器中“构build”你的应用

如果你使用像https://github.com/jwilder/nginx-proxy这样的工具,那么即使是反向代理也是一件简单的事情,你可以在一台主机上运行X个不同的软件。

这样我们就为我们公司设立了jenkins,ruby,cms等等。 希望这可以帮助你做出决定。