我正在寻找一个自定义的Mesos执行器,它允许为我的rails应用程序请求1CPU(1024个共享),然后在前面“插入”nginx。在这个过程中,我实际上想要使用相同的共享1024 cpu共享来启动rails和nginx容器。
我知道cgroup是分层的,我应该可以做类似
的事情 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共享,但我不想要了解另一个或者可以访问彼此的数据,除非我故意共享一个/ public从轨道或其他东西的音量。
这里的任何建议都将不胜感激!
答案 0 :(得分:3)
Docker不支持此功能。
这是一种可行的解决方法。 警告:这是一个非常hackish。我不建议在生产中使用它,但它可以让你了解所涉及的内容。
我们将使用Mesos钩子(或Docker Spotter之类的工具)在容器启动时触发自动操作。
我们还将使用单独的手动创建的cgroup以及相应的CPU份额分配。
当工具检测到两个容器中的一个刚刚启动时,它会将其所有进程移动到此特殊cgroup。由于所有子进程都是在其父进程的控制组中创建的,因此所有未来进程也将位于该cgroup中。
但是,请注意,存在潜在的竞争条件:如果在将现有进程从原始cgroup移动到“静态”进程时在这些容器中创建了新进程,则可能不会自动移动新进程。您可能需要多次重新扫描tasks
文件以确保移动所有内容。
更好的实现将在Docker本身;也许通过允许创建“容器容器”(不运行进程但只是将其他容器分组的容器)然后将容器放在另一个容器下。或者,替代地,语法类似于--volumes-from
,但是对于资源。这将允许启动容器,但指示Docker在现有容器下创建cgroup。