这个问题是我继续探索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设计工作的方式”。我想知道的是什么
答案 0 :(得分:16)
容器基本上是一个过程。在体积适中的Linux系统上运行500个进程没有技术问题,尽管它们必须共享CPU和内存。
容器相对于进程的成本是一些额外的内核资源,用于管理名称空间,文件系统和控制组以及Docker守护程序内部的一些管理结构,尤其是处理stdout
和stderr
。
引入名称空间以提供隔离,因此一个容器不会干扰任何其他容器。如果您的5个容器组形成一个不需要此隔离的单元,那么您可以使用--net=container
共享网络命名空间。目前没有共享cgroups AFAIK的功能。
你的建议有什么问题:
stdout
和stderr
将混合进行五个流程答案 1 :(得分:4)
@Bryan的答案是可靠的,特别是与只运行一个进程的容器的开销有关。
那就是说,你至少应该阅读https://phusion.github.io/baseimage-docker/的参数,这就是容器有多个进程的情况。如果没有它们,docker可以轻松提供:
baseimage-docker运行一个init进程,除了容器中的主要进程外,还会触发一些进程。
出于某些目的,这是一个好主意,但也要注意,例如,每个容器有一个cron守护进程和一个syslog守护进程会增加一些开销。我希望随着码头生态系统的成熟,我们会看到更好的解决方案,并不需要这样做。