4

这是参考https://docs.docker.com/config/containers/resource_constraints/#limit-a-containers-access-to-memory。我已经创建了工作容器,使用 Raspbian Jessie Lite(本质上是无 GUI 的 Debian Jessie)在 Raspberry Pi(64 位)上运行 Docker 版本 18.05.0-ce。

该文档声称您可以在docker run命令上传递内存/cpu 标志。但是当我尝试类似的东西时docker run -it --name test --memory=512m container_os,它会说:

WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap

如果我传递基于 cpu 的标志,例如--cpuset-cpus. 这显然意味着我没有为 Docker 安装这些不同的 cgroup 来正确管理资源,对吧?

现在参考https://docs.docker.com/config/containers/runmetrics/#control-groups,我阅读了关于 cgroups 的部分,但这对我理解情况并没有太大帮助。因此,与其只是尝试随机的内核命令,有经验的人有没有一步一步地解释如何以正确的方式做到这一点?

4

1 回答 1

5

经过相当多的研究,我想通了,以防万一其他人也有同样的问题。

参考https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt,这对于理解 cgroups 非常有帮助,具有所有适当支持的内核应该安装了大多数 docker 的 cgroups默认。如果没有,有一个命令可以这样做:

来自第 2.1 节 - 基本用法

"要挂载具有所有可用子系统的 cgroup 层次结构,请键入:

mount -t cgroup xxx /sys/fs/cgroup

"xxx" 不会被 cgroup 代码解释,但会出现在 /proc/mounts 中,因此可能是您喜欢的任何有用的标识字符串。

注意:某些子系统在没有用户输入的情况下无法工作。例如,如果启用了 cpusets,则用户必须为每个创建的新 cgroup 填充 cpus 和 mems 文件,然后才能使用该组。”

然而,对于这种特殊情况,尝试挂载单个 cgroup,例如 cpuset,会导致错误提示“cpuset 特殊设备不存在”。这是因为 Raspbian Jessie 8 的开发人员没有将内核配置为默认支持 Docker 用于资源管理的 cgroup。这可以通过键入命令轻松确定docker info,并在输出底部看到:

WARNING: No swap limit support WARNING: No cpu cfs quota support WARNING: No cpu cfs period support WARNING: No cpuset support

这些是 Docker 管理容器的内存和 CPU 资源所需的所有 cgroup。测试你的内核是否支持像 cpuset 这样的东西很容易。如果文件/proc/filesystems有一个条目nodev cpuset,那么这意味着你的内核支持 cpuset,但如果你正在阅读这个,那么它可能意味着它只是没有在你的内核中配置。然而,这将需要内核重新配置和重建,这并不容易。

使用正确的内核配置,它会像 Docker Docs 中那样自动运行。

于 2018-07-10T15:34:12.940 回答