一尘不染

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

docker

这个问题是我继续研究Docker的一部分,并且在某些方面跟进了我先前的问题之一。我现在已经了解了如何通过将一堆Docker容器链接在一起来获得完整的应用程序堆栈(实际上是微型VPS)。例如,可以创建一个堆栈,为Apache+ PHP5提供一堆扩展名+ Redis + MemCached+MySQL,它们都在Ubuntu上运行,无论是否带有附加数据容器,都可以轻松地序列化用户数据。

一切都非常优雅。但是,我不禁感到奇怪。5个容器来运行那么小的VPS(因为Apache +
PHP5进入一个容器,所以我算5个而不是6个)。那么,假设我有100个这样的VPS正在运行?这意味着我有500个容器在运行!我理解这里的论点-
编写新的应用程序堆栈,更新堆栈中的一个组件等都很容易。但是以这种方式操作没有不必要的开销吗?

假设我这样做了

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

!/ 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设计的工作方式”。我想知道什么

  • 在N个链接的容器中运行x100实例的缺点是-通过主机上的速度,内存使用情况等进行权衡?
  • 我在这里所做的事情有什么问题?

阅读 2530

收藏
2020-06-17

共1个答案

一尘不染

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

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

引入名称空间是为了提供隔离,这样一个容器就不会与其他任何容器发生干扰。如果5个容器的组构成一个不需要这种隔离的单元,则可以使用共享网络名称空间--net=container。目前没有共享cgroup
AFAIK的功能。

您的建议出了什么问题:

  • 它不是“ Docker方式”。这对您可能并不重要。
  • 与使用为任务设计的协调器相反,您必须维护脚本才能使其正常工作,担心进程重新启动等。
  • 您将必须管理文件系统中的冲突,例如,两个进程需要不同版本的库,或者它们都写入同一输出文件
  • stdout并将stderr在五个过程中混合在一起
2020-06-17