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

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

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

假设我这样做了

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

    !/ bin / bash服务memcached启动服务redis-server start ….服务apache2启动while:do:done

在我的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 

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

当一个Google为他们准备的时候,会发现很多类似的问题。 除了上面我再次提出的论点之外,其中一个最常见的理由就是“这是Dockerdevise工作的方式”。 我想知道的

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

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

容器在一个进程上的开销是一些额外的内核资源来pipe理名字空间,文件系统和控制组以及Docker守护进程中的一些pipe理结构,尤其是处理stdoutstderr

引入命名空间是为了提供隔离,以便一个容器不会干扰任何其他容器。 如果5个容器组成一个不需要隔离的单元,那么你可以使用--net=container来共享networking名称空间。 目前没有共享cgroup的function,AFAIK。

你的build议有什么问题:

  • 这不是“Docker的方式”。 这对你来说可能并不重要。
  • 你必须维护脚本才能使它工作,担心stream程重启等等,而不是使用为任务devise的编排器
  • 您将不得不pipe理文件系统中的冲突,例如两个进程需要不同版本的库,或者它们都写入相同的输出文件
  • stdoutstderr将被混合为五个进程

@布赖恩的答案是坚实的,特别是在一个容器的开销很低的情况下。

也就是说,你至less应该阅读https://phusion.github.io/baseimage-docker/中的参数,这使得容器拥有多个进程。 如果没有他们,docker工作人员可以轻松规定:

  • 过程监督
  • cron工作
  • 系统日志

baseimage-docker运行一个init进程,除了容器中的主进程之外,还启动了一些进程。

出于某种目的,这是一个好主意,但也要注意,例如每个容器有一个cron守护进程和一个syslog守护进程会增加一些开销。 我预计,随着docker生态系统的成熟,我们将看到更好的解决scheme,不需要这个。