在一个docker容器中运行多个应用程序

时间:2014-12-27 05:56:42

标签: docker

这个问题是我继续探索Docker的一部分,并在某些方面跟进我的earlier questions之一。我现在已经了解了如何通过将一堆Docker容器链接在一起来获得完整的应用程序堆栈(实际上是一个迷你VPS)。例如,可以创建一个堆栈,为Apache + PHP5提供一堆扩展+ Redis + MemCached + MySQL,它们都运行在Ubuntu之上,有或没有额外的数据容器,以便于序列化用户数据。

一切都非常优雅。但是,我不得不怀疑......运行那个小VPS的5个容器(自从Apache + PHP5进入一个容器后,我计算5个而不是6个)。那么假设我有100个这样的VPS在运行?这意味着我有500个容器在运行!我理解这里的论点 - 很容易编写新的应用程序堆栈,更新堆栈的一个组件等。但是这样操作没有不必要的开销吗?

假设我这样做了

  • 将我的所有应用程序放在一个容器中
  • 写一个小shell脚本

    !/斌/庆典 服务memcached开始 服务redis-server启动 .... service apache2 start 而: 做   : 完成

在我的Dockerfile中我有

ADD start.sh /usr/local/bin/start.sh
RUN chmod +x /usr/local/bin/start.sh

....
ENTRYPOINT ["/bin/bash"]
CMD ["/usr/local/bin/start.sh"]

然后我把那个容器拿起来&运行

docker run -d -p 8080:80 -v /var/droidos/site:/var/www/html -v /var/droidos/logs:/var/log/apache2 droidos/minivps

我在做生意。现在,当我想以编程方式关闭该容器时,我可以通过执行一个单一的docker命令来完成。

当有一个谷歌为他们提供类似性质的问题时,有很多问题。除了上面提到的论点之外,对于每个容器一个应用程序方法给出的最普遍的原因之一是“这就是Docker设计工作的方式”。我想知道的是什么

  • 运行N个链接容器的x100实例有什么缺点 - 在主机上通过速度,内存使用等方式进行权衡?
  • 我在这里做了什么错了?

2 个答案:

答案 0 :(得分:16)

容器基本上是一个过程。在体积适中的Linux系统上运行500个进程没有技术问题,尽管它们必须共享CPU和内存。

容器相对于进程的成本是一些额外的内核资源,用于管理名称空间,文件系统和控制组以及Docker守护程序内部的一些管理结构,尤其是处理stdoutstderr

引入名称空间以提供隔离,因此一个容器不会干扰任何其他容器。如果您的5个容器组形成一个不需要此隔离的单元,那么您可以使用--net=container共享网络命名空间。目前没有共享cgroups AFAIK的功能。

你的建议有什么问题:

  • 它不是“Docker方式”。这可能对你不重要。
  • 你必须维护脚本以使其工作,担心进程重启等,而不是使用为任务设计的orchestrator
  • 您必须管理文件系统中的冲突,例如两个进程需要不同版本的库,或者它们都写入相同的输出文件
  • stdoutstderr将混合进行五个流程

答案 1 :(得分:4)

@Bryan的答案是可靠的,特别是与只运行一个进程的容器的开销有关。

那就是说,你至少应该阅读https://phusion.github.io/baseimage-docker/的参数,这就是容器有多个进程的情况。如果没有它们,docker可以轻松提供:

  • 流程监督
  • cron jobs
  • 系统日志

baseimage-docker运行一个init进程,除了容器中的主要进程外,还会触发一些进程。

出于某些目的,这是一个好主意,但也要注意,例如,每个容器有一个cron守护进程和一个syslog守护进程会增加一些开销。我希望随着码头生态系统的成熟,我们会看到更好的解决方案,并不需要这样做。