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

iecba09b  于 2023-08-03  发布在  Docker
关注(0)|答案(3)|浏览(139)

通常,建议每个Docker容器运行一个进程。如果你试图运行一个需要不同类型工具的Web应用程序,这是有意义的。
例如,开放源代码web应用程序kanboard使用

  • MySQL
  • Apache
  • php5
  • 内存缓存

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

  • 看板
  • 乙醚垫
  • 自有云
  • 多库维基
  • 话语

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

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

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

  • 在单个容器中运行每个应用程序沿着所有依赖项。一个用于Kanboard,一个用于Etherpad等等。
  • 遵循one process per container的dockers格言,为mysql,postgres,sqlite,memcache等创建一个,为每个应用程序代码本身创建一个,并使用docker linking将相关容器链接在一起。这个更乱需要更多的组织和管理。

我的问题是,是否还有其他办法?如果没有,我应该选择上面的哪一个选项,为什么?
或者我是否使用了错误的工具(Docker容器)来完成这项工作?也许有另一种方法可以在不使用Docker容器的情况下实现应用程序隔离?

czq61nw1

czq61nw11#

你的第二种方法原则上是可取的。像docker compose这样的工具可能会帮助你解决链接的混乱。

42fyovps

42fyovps2#

每个容器可以运行多个进程。
您只需要使用一个能够管理所有这些进程生命周期结束的基础映像(请参阅“PID 1 zombie reaping issue“)。使用一个知道如何做到这一点的基础映像:phusion/baseimage-docker
然后,每个WebApp都有一个容器(以及所有依赖的进程)
检查是否可以将其中一些进程放在它们自己的容器中。
通常,NGiNX只能在一个额外的容器中运行,对所有其他Web应用程序进行反向代理,允许通过相同的URL访问它们(url/discourse将重定向到容器管理会话,url/plex将重定向到plex的容器,等等)

ffscu2ro

ffscu2ro3#

你就说:
这个更乱需要更多的组织和管理。
我觉得完全相反。以下是我的优点和缺点:
多进程:

优点

  • 每个应用一个Dockerimage/容器
    cons
  • 你真的需要确保,每个进程都被你的init脚本(作为CMDENTRYPOINT运行)正确监控。如果有什么失败了,你将以一个失败的容器结束
  • 在容器内正确运行所有内容的艰苦工作,例如:数据库,redis等应该在应用程序之前运行和设置。
  • 没有办法只更新一个组件而不删除所有组件。
  • 无法垂直缩放:出于性能原因,您需要两个前端来运行一个数据库?这种方法没有机会
  • 每一个图像都必须由自己开发和维护。没有机会使用供应商映像
  • 如果一个组件需要更新,则必须更新整个组件

我最近有完全相同的任务,我决定去第二次appraoch由于以下原因:
优点:

  • 您可以使用供应商映像(例如postgres,wordpress,无论什么)不需要制作自己的一个
  • 垂直缩放:需要webservers,使用两个容器的图像

缺点:

  • 如果是手工的话会更笨拙

我真的很推荐第二种方法。使用像上面提到的docker-compose这样的工具,您可以在一个docker-compose.yml中配置的不同容器中“构建”应用程序
如果你使用像https://github.com/jwilder/nginx-proxy这样的工具(我做了,工作起来很有魅力),即使是反向代理也是一件简单的事情,你可以在一台主机上运行X个不同的软件。
这样我们就建立了我们的Jenkins,redmine,cms和许多更多的东西,为我们的公司。希望这对你的决定有帮助。

相关问题