【问题标题】:Running multiple applications in one docker container在一个 docker 容器中运行多个应用程序
【发布时间】:2014-12-27 05:56:42
【问题描述】:

这个问题是我继续探索 Docker 的一部分,并且在某些方面是对我的earlier questions 之一的跟进。我现在明白了如何通过将一堆 Docker 容器链接在一起来获得完整的应用程序堆栈(实际上是一个迷你 VPS)。例如,可以创建一个堆栈,为 Apache + PHP5 提供一系列扩展 + Redis + MemCached + MySQL,所有这些都运行在 Ubuntu 之上,有或没有额外的数据容器,以方便序列化用户数据。

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

假设我这样做了

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

    !/bin/bash 服务 memcached 启动 服务 redis 服务器启动 …… 服务 apache2 启动 尽管: 做 : 完成

在我的 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 实例有哪些缺点 - 在主机上通过速度、内存使用等进行权衡?
  • 我在这里所做的有什么问题?

【问题讨论】:

标签: docker


【解决方案1】:

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

容器相对于进程的成本是一些额外的内核资源来管理命名空间、文件系统和控制组,以及 Docker 守护程序内部的一些管理结构,特别是处理stdoutstderr

引入命名空间是为了提供隔离,因此一个容器不会干扰任何其他容器。如果您的 5 个容器组形成一个不需要这种隔离的单元,那么您可以使用 --net=container 共享网络命名空间。目前没有共享 cgroups 的功能,AFAIK。

你的建议有什么问题:

  • 这不是“Docker 方式”。哪个对您来说可能并不重要。
  • 您必须维护脚本以使其正常工作,担心进程重启等问题,而不是使用专为该任务设计的编排器
  • 您必须管理文件系统中的冲突,例如两个进程需要不同版本的库,或者它们都写入同一个输出文件
  • stdoutstderr 将混合用于五个进程

【讨论】:

  • 感谢您的回答。我想知道你是否可以澄清两件事:1. 文档说“告诉 Docker 将这个容器的进程放在里面......并且两个容器上的进程将能够通过环回接口相互连接。”这是否意味着使用 --net apache 我将能够访问在本地主机上的另一个容器中运行的 memcached?使用每个容器一个应用程序的路由,您仍然需要编写脚本来启动和链接容器 + 脚本来关闭和删除所有容器。所以一个中的六个和另一个的六个?
  • 1.是的,当您使用--net=another_container 时,它们被放置在相同的网络命名空间中,具有相同的虚拟以太网设备和环回设备。他们可以互相交谈,但您默认获得的--net=bridge 也是如此。共享网络值得注意的一点是它们共享 IP 地址和端口。并且使用更少的系统资源,这就是您所要求的。
  • 2.有很多工具可以从外部控制 Docker 容器 - 请参阅 stackoverflow.com/a/18287169/448734。因此,您不必自己编写这么多的脚本。请注意,这是一个快速发展的环境。
【解决方案2】:

@Bryan 的回答是中肯的,尤其是在只运行一个进程的容器的开销很低方面。

也就是说,您至少应该阅读https://phusion.github.io/baseimage-docker/ 的参数,这为容器具有多个进程提供了依据。没有它们,docker 可以轻松提供:

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

baseimage-docker 运行一个 init 进程,它会启动容器中除主进程之外的几个进程。

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

【讨论】:

    猜你喜欢
    • 2015-07-16
    • 1970-01-01
    • 2014-11-10
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多