【问题标题】:How can docker be used to run multiple open source web applications?如何使用 docker 运行多个开源 Web 应用程序?
【发布时间】:2015-10-26 23:18:56
【问题描述】:

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

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

  • mysql
  • 阿帕奇
  • php5
  • 内存缓存

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

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

  • 看板
  • 以太垫
  • 拥有云
  • dokuwiki
  • 话语

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

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

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

  • 在单个容器中运行每个应用程序及其所有依赖项。一个用于kanboard,一个用于etherpad,依此类推。
  • 遵守one process per container的dockers dictum,为mysql、postgres、sqlite、memcache等创建一个,为每个应用程序代码本身创建一个,并使用docker linking将相关容器链接在一起。这更乱。需要更多的组织和管理。

我的问题是是否有其他方法?如果没有我应该选择以上哪个选项,为什么?

或者我是否使用了错误的工具(docker 容器)来完成这项工作?或许还有另一种不使用 docker 容器来实现应用程序隔离的方法?

【问题讨论】:

    标签: docker


    【解决方案1】:

    原则上首选您的第二种方法。 docker compose 之类的工具可能会帮助您解决链接的混乱问题。

    【讨论】:

      【解决方案2】:

      您可以在每个容器中运行多个进程。
      您只需要使用能够管理所有这些生命周期结束的基本映像(请参阅“PID 1 zombie reaping issue”)。使用知道如何做到这一点的基础图像:phusion/baseimage-docker

      然后,每个 webapp 将拥有一个容器(及其所有依赖进程)

      检查您是否可以将其中一些进程放在它们自己的容器中。

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

      【讨论】:

        【解决方案3】:

        你说:

        这更混乱。需要更多的组织和管理。

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

        多进程:

        专业人士

        • 每个应用一个 Dockerimage/-container

        缺点

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

        我最近有完全相同的任务,由于以下原因,我决定去第二个方法:

        优点:

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

        缺点:

        • 如果手工操作会有点笨拙。

        我真的推荐第二种方法。使用上述docker-compose 之类的工具,您将使用单个docker-compose.yml 中配置的不同容器“构建”您的应用程序

        如果您随后使用https://github.com/jwilder/nginx-proxy 之类的工具(我使用过,效果很好),即使反向代理也是一件简单的事情,您可以在一台主机上运行 X 个不同的软件。

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

        【讨论】:

          猜你喜欢
          • 2021-01-12
          • 1970-01-01
          • 1970-01-01
          • 2015-07-16
          • 2019-05-31
          • 2019-06-23
          • 1970-01-01
          • 2014-11-26
          • 2017-05-29
          相关资源
          最近更新 更多