这个问题是我继续研究Docker的一部分,并且在某些方面跟进了我先前的问题之一。我现在已经了解了如何通过将一堆Docker容器链接在一起来获得完整的应用程序堆栈(实际上是微型VPS)。例如,可以创建一个堆栈,为Apache+ PHP5提供一堆扩展名+ Redis + MemCached+MySQL,它们都在Ubuntu上运行,无论是否带有附加数据容器,都可以轻松地序列化用户数据。
一切都非常优雅。但是,我不禁感到奇怪。5个容器来运行那么小的VPS(因为Apache + PHP5进入一个容器,所以我算5个而不是6个)。那么,假设我有100个这样的VPS正在运行?这意味着我有500个容器在运行!我理解这里的论点- 编写新的应用程序堆栈,更新堆栈中的一个组件等都很容易。但是以这种方式操作没有不必要的开销吗?
假设我这样做了
!/ bin / bash服务memcached启动服务redis-server启动....服务apache2启动while:do:完成
在我的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命令来实现。
当一个Google为他们提供服务时,会发现许多类似性质的问题。除了上面提到的论点之外,针对每个容器一个应用程序的方法给出的最常见原因之一是“这就是Docker设计的工作方式”。我想知道什么
容器基本上是一个过程。在大小合适的Linux系统上运行500个进程没有技术问题,尽管它们将必须共享CPU和内存。
容器在整个过程中的成本是一些额外的内核资源来管理名称空间,文件系统和控制组,以及Docker守护程序内部的一些管理结构,尤其是用于处理stdout和stderr。
stdout
stderr
引入名称空间是为了提供隔离,这样一个容器就不会与其他任何容器发生干扰。如果5个容器的组构成一个不需要这种隔离的单元,则可以使用共享网络名称空间--net=container。目前没有共享cgroup AFAIK的功能。
--net=container
您的建议出了什么问题: