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 container
docker说明书,并为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脚本(作为
CMD
或ENTRYPOINT
运行)正确监控。 如果有什么不成功的话,你最终会失败的容器 - 努力让所有东西在容器内正确运行,例如数据库,Redis等应该在应用程序之前运行和设置。
- 没有办法更新只是一个组件,没有取消一切。
- 没有办法垂直扩展:您将需要两个前端性能的原因与一个数据库运行? 这种方法没有机会
- 每个图像必须由您自己开发和维护。 没有机会使用供应商的图像
- 如果一个组件需要更新,则必须更新整个事物
我最近的任务完全一样,我决定去第二次,原因如下:
优点:
- 你可以使用供应商的图像(例如postgres,wordpress等),无需制作自己的图像
- 垂直缩放:需要web服务器,使用该图像的两个容器
缺点:
- 如果手工完成,则更笨拙一点。
我真的推荐第二种方法。 有了像提到的docker-compose
这样的工具,你就可以在一个docker-compose.yml
configuration的不同容器中“构build”你的应用
如果你使用像https://github.com/jwilder/nginx-proxy这样的工具,那么即使是反向代理也是一件简单的事情,你可以在一台主机上运行X个不同的软件。
这样我们就为我们公司设立了jenkins,ruby,cms等等。 希望这可以帮助你做出决定。