在现有cgroup中启动容器

htrmnn0y  于 2021-06-21  发布在  Mesos
关注(0)|答案(1)|浏览(417)

我希望编写一个定制的mesos执行器,它允许为我的rails应用程序请求1cpu(1024个共享),然后在前面“插入”nginx。在这个过程中,我实际上希望使用相同的共享1024cpu共享启动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它是在为先前启动的rails容器创建的预先存在的cgroups下启动的。
我需要考虑的另一件事是,虽然我希望rails和nginx共享1024个cpu共享,但我不想知道另一个,也不想访问彼此的数据,除非我故意从rails或其他地方共享了一个/public卷。
如有任何建议,我们将不胜感激!

vcirk6k6

vcirk6k61#

docker还不支持这个。
这里有一个可能的解决方法。警告:这是一个非常黑客。我不建议在生产中使用它,但它可以让您了解所涉及的内容。
我们将使用mesos钩子(或docker spotter之类的工具)在容器启动时触发自动操作。
我们还将使用一个单独的、手动创建的cgroup和适当的cpu共享分配。
当该工具检测到两个容器中的一个刚刚启动时,它会将其所有进程移动到这个特殊的cgroup。由于所有子进程都是在其父进程的控制组中创建的,因此所有将来的进程也将位于该cgroup中。
但是,请注意,存在一个潜在的争用条件:如果在将现有进程从原始cgroup移动到“静态”cgroup时在这些容器中创建了新进程,则新进程可能不会自动移动。你可能得重新扫描 tasks 多次归档以确保您移动了所有内容。
更好的实现应该在docker本身;也许可以通过允许创建“容器容器”(不运行进程但只是在那里对其他容器进行分组的容器),然后将一个容器放在另一个容器下。或者,一种类似于 --volumes-from ,但是为了资源。这将允许启动一个容器,但会指示docker在现有容器下创建cgroup。

相关问题