通常,建议每个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容器的情况下实现应用程序隔离?
3条答案
按热度按时间czq61nw11#
你的第二种方法原则上是可取的。像docker compose这样的工具可能会帮助你解决链接的混乱。
42fyovps2#
每个容器可以运行多个进程。
您只需要使用一个能够管理所有这些进程生命周期结束的基础映像(请参阅“PID 1 zombie reaping issue“)。使用一个知道如何做到这一点的基础映像:
phusion/baseimage-docker
的然后,每个WebApp都有一个容器(以及所有依赖的进程)
检查是否可以将其中一些进程放在它们自己的容器中。
通常,NGiNX只能在一个额外的容器中运行,对所有其他Web应用程序进行反向代理,允许通过相同的URL访问它们(
url/discourse
将重定向到容器管理会话,url/plex
将重定向到plex的容器,等等)ffscu2ro3#
你就说:
这个更乱需要更多的组织和管理。
我觉得完全相反。以下是我的优点和缺点:
多进程:
优点
cons
CMD
或ENTRYPOINT
运行)正确监控。如果有什么失败了,你将以一个失败的容器结束我最近有完全相同的任务,我决定去第二次appraoch由于以下原因:
优点:
缺点:
我真的很推荐第二种方法。使用像上面提到的
docker-compose
这样的工具,您可以在一个docker-compose.yml
中配置的不同容器中“构建”应用程序如果你使用像https://github.com/jwilder/nginx-proxy这样的工具(我做了,工作起来很有魅力),即使是反向代理也是一件简单的事情,你可以在一台主机上运行X个不同的软件。
这样我们就建立了我们的Jenkins,redmine,cms和许多更多的东西,为我们的公司。希望这对你的决定有帮助。