我们有一个相当复杂的 Rails 应用程序,即将部署到单个物理主机上。该主机有 8 个核心和 128GB 内存。
该应用程序已实现 Docker 化,拥有 4 种类型的容器
- Rails inc. 网络服务器
- Postgres 数据库
- Redis 数据库
- 工人容器(Resque)
预计 Rails 和 Worker 容器将通过在 docker-machine 中引入更多容器来实现扩展。
在开发环境中,内存分配给整个docker-machine:
docker-machine create -d virtualbox --virtualbox-memory 8192 default
是否可以控制单个容器所限制的内存量?
例如,为 Postgres 分配 16GB,但将 Rails 容器限制为 4GB。应该为运行 docker-machine 的服务器主机分配什么样的最小内存,这是否可行?
编辑
相关问题:
编辑2
这个答案https://serverfault.com/a/645888/210752表示容器将根据需要分配内存。这并非我在开发环境中的经验(默认情况下,docker-machine 分配了 2GB)。
答案1
正如您在第二次编辑中对问题的回答中提到的,容器与虚拟机不同,您通常不会像虚拟机那样为它们保留内存。因为它们都在同一个操作系统上运行,所以它可以根据需要将内存分配给不同的进程,就像它们不在容器中运行一样。也就是说,所有进程的内存都是池化的,与容器无关。
您在上例中使用 docker-machine 设置的是“虚拟”主机的总内存池。在您的生产案例中,它将是整个 128 GB(除非您还计划使用 docker-machine 或虚拟机对其进行分段)。
然而,容器也是利用内核的cgroups(控制组)功能,可让您为整个容器系统配置资源管理。这不允许您为容器“保留”内存,但您可以为所有容器内存设置上限,这样就不会占用其他容器可以使用的内存(例如,在发生泄漏或错误时)。
使用 Docker,根据所使用的容器后端,您可以设置基本的内存限制,如下所示:
- 运行 docker 的默认 libcontainer 时,通过使用-m或者-记忆选项
- 运行旧版 LXC 提供程序时,通过使用 LXC 选项运行容器lxc.cgroup.cpuset.memory=使用量--lxc配置
您可以在这里找到有关 Docker 中 cgroups 使用的更多信息: https://www.cloudsigma.com/manage-docker-resources-with-cgroups/
本文还包含有关 cgroups 功能介绍的幻灯片。