当前位置: 首页 > 面试题库 >

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

鲜于允晨
2023-03-14
问题内容

这个问题是我继续研究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个链接的容器中运行x100html" target="_blank">实例的缺点是-通过主机上的速度,内存使用情况等进行权衡?
  • 我在这里所做的事情有什么问题?

问题答案:

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

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

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

您的建议出了什么问题:

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


 类似资料:
  • 问题内容: 从部署旨在在台式机上的用户上运行的应用程序的角度来看,我正在努力将自己的头全放在Docker上。我的应用程序只是一个Flask Web应用程序和mongo数据库。通常,我将同时安装在VM中,并将主机端口转发到来宾Web应用程序。我想尝试一下Docker,但不确定使用多个程序的含义。文档说只能有ENTRYPOINT,所以我怎么拥有Mongo和我的flask应用程序。还是需要将它们放在单独

  • 我试图从部署一个打算在桌面用户上运行的应用程序的角度来理解Docker。我的应用程序只是一个烧瓶网络应用程序和mongo数据库。通常情况下,我会在虚拟机中安装这两个程序,并将主机端口转发给来宾网络应用程序。我想尝试一下Docker,但我不确定我是如何使用多个程序的。文档说只能有ENTRYPOINT,所以我怎么才能拥有Mongo和我的烧瓶应用程序。或者它们需要在不同的容器中,在这种情况下,它们如何相

  • 我们有一个公开REST API的现有java应用程序。当它收到超文本传输协议请求时,它使用Runtime.getRuntime(). exe启动另一个java进程。 我们正在将此应用程序迁移到docker,我们希望将这些服务、一个容器中的REST应用程序和另一个容器中的其他组件分开。 有没有办法,REST应用程序可以在另一个docker容器中启动另一个应用程序?

  • 我想在Docker容器中启动两个不同的服务,并在其中一个退出后立即退出容器。我查看了supervisor,但找不到如何让它在一个托管应用程序退出后立即退出。它试图重启它们多达三次,就像标准设置一样,然后什么也不做。主管是否能够做到这一点,或者是否有其他工具可以做到这一点?如果还有一种方法可以让两个托管程序都写入到stdout,并标记它们的应用程序名,则会有好处,例如:

  • 其基本思想是运行带有音频和ui的应用程序(vlc、firefox、skype…) 我在使用pulseaudio搜索docker容器,但我找到的所有容器都在TCP上使用pulseaudio流。(应用程序的安全沙箱) https://gist.github.com/hybris42/ce429de428e5af3a344a https://github.com/jlund/docker-chrome-

  • null 转发每个进程的输出 监视是否有子进程死亡,并在此情况下重新启动整个容器 在缩放/停止/重新启动等时优雅地关闭所有进程。