我们有一个相当复杂的 Rails 应用程序,即将部署到单个物理主机上。主机有 8 个内核和 128GB 内存。
该应用程序是 dockerised,具有 4 种类型的容器
- 铁路公司 网络服务器
- 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)。
正如您在第二次编辑中对问题的回答中提到的,容器与虚拟机不同,因为您通常不会像使用虚拟机那样为它们保留内存。因为它们都运行在同一个操作系统上,它可以根据需要将内存分配给不同的进程,就像它们不是在容器中运行一样。也就是说,内存是为所有进程池化的,而不考虑容器。
您在上述示例中使用 docker-machine 设置的是“虚拟”主机的总内存池。在您的生产案例中,它将是整个 128 GB(除非您还计划使用 docker-machine 或 VM 对其进行分段)。
但是,容器也是利用内核的cgroups(控制组)功能的好方法,它允许您为整个容器系统配置资源管理。这不会让您为容器“保留”内存,而是您可以为所有容器内存设置上限,这样就不会占用可用于其他容器的内存(例如,在发生泄漏或错误的情况下) )。
使用 Docker,根据使用的容器后端,您可以设置基本内存限制,如下所示:
您可以在此处找到有关 Docker 中 cgroups 使用的更多信息: https ://www.cloudsigma.com/manage-docker-resources-with-cgroups/
这篇文章还包含介绍 cgroups 功能的幻灯片。