2

我正在寻找编写一个自定义的 Mesos 执行器,它允许为我的 rails 应用程序请求 1CPU(1024 个共享),然后在前面“插入”nginx。在这个过程中,我实际上想使用相同的共享 1024 cpu 共享来启动我的 rails 和 nginx 容器。

我知道 cgroups 是分层的,我应该能够做类似的事情

  Base(1024 shares)
  /              \
nginx(no limit)   rails(no limit)

或者

  rails(1024 shares)
         |
    nginx(no limit)

这样我仍然只使用了 1 个 CPU,但我的容器将共享资源并被链接。查看 cgroups 和 lxc 文档,我找不到任何明显的东西可以传递给 docker 的 -lxc-conf=[] 选项,这可以让我告诉 nginx,因为它开始在为先前启动的预先存在的 cgroup 下启动轨道容器。

我需要考虑的另一件事是,虽然我希望 rails 和 nginx 共享 1024 个 cpu 份额,但我不想知道对方或访问彼此的数据,除非我故意从 rails 共享 /public 卷或者其他的东西。

这里的任何建议将不胜感激!

4

1 回答 1

3

Docker 不支持这个(还)。

这是一个可能的解决方法。警告:这是一个非常hackish。我真的不建议在生产中使用它,但它可以让您了解所涉及的内容。

我们将使用 Mesos 挂钩(或类似Docker Spotter的工具)在容器启动时触发自动操作。

我们还将使用具有适当 CPU 份额分配的单独手动创建的 cgroup。

当该工具检测到两个容器之一刚刚启动时,它会将其所有进程移动到这个特殊的 cgroup。由于所有子进程都是在其父进程的控制组中创建的,因此所有未来的进程也将在该 cgroup 中。

但是请注意,存在潜在的竞争条件:如果在将现有进程从原始 cgroup 移动到“静态”cgroup 时在这些容器中创建了新进程,则新进程可能不会自动移动。您可能必须tasks多次重新扫描文件以确保您移动了所有内容。

更好的实现是在 Docker 本身中;也许通过允许创建“容器容器”(不运行进程但只是在那里对其他容器进行分组的容器),然后将一个容器放在另一个容器下面。或者,或者,类似于 的语法--volumes-from,但用于资源。这将允许启动一个容器,但指示 Docker 在现有容器下创建 cgroup。

于 2014-03-10T15:42:49.797 回答