docker-machine 内存分配

tv_*_*gar 5 memory docker

我们有一个相当复杂的 Rails 应用程序,即将部署到单个物理主机上。主机有 8 个内核和 128GB 内存。

该应用程序是 dockerised,有 4 种类型的容器

  • 铁路公司 网络服务器
  • Postgres 数据库
  • Redis 数据库
  • 工作容器(Resque)

预计 Rails 和 Worker 容器将通过在 docker-machine 中引入更多容器来扩展。

在开发环境中,内存分配给整个docker-machine:

docker-machine create -d virtualbox --virtualbox-memory 8192 default
Run Code Online (Sandbox Code Playgroud)

是否可以控制单个容器的内存限制?

例如,为 Postgres 分配 16GB,但将 Rails 容器限制为 4GB。应该为运行 docker-machine 的服务器主机分配什么样的最小内存,这甚至可能吗?

编辑

相关问题:

如何处理 Docker 内存管理?

Docker + Apache,内存使用情况如何?

编辑 2

这个答案https://serverfault.com/a/645888/210752表明容器将根据需要分配内存。这不是我在开发环境中的经验(默认情况下,docker-machine 分配了 2GB)。

小智 4

正如第二次编辑中问题的答案中提到的,容器与虚拟机不同,因为您通常不会像虚拟机那样为它们保留内存。因为它们都运行在同一个操作系统上,所以它可以根据需要将内存分配给不同的进程,就像它们没有在容器中运行一样。也就是说,无论容器如何,所有进程都会共享内存。

在上面的示例中,您使用 docker-machine 设置的是“虚拟”主机的总内存池。在您的生产案例中,它将是整个 128 GB(除非您还计划使用 docker-machine 或 VM 对其进行分段)。

然而,容器也是利用内核cgroups(控制组)功能的好方法,它允许您为整个容器系统配置资源管理。这不会让您为容器“保留”内存,而是可以为所有容器内存设置上限,这样容器就不会耗尽可用于其他容器的内存(例如,在发生泄漏或错误时) )。

使用 Docker,根据所使用的容器后端,您可以设置基本内存限制,如下所示:

  • 运行 docker 的默认 libcontainer 时,通过使用-m-memory选项运行容器
  • 运行旧版 LXC 提供程序时,通过使用--lxc-conf的 LXC 选项lxc.cgroup.cpuset.memory =amount运行容器

您可以在此处找到有关 Docker 中 cgroup 使用的更多信息: https: //www.cloudsigma.com/manage-docker-resources-with-cgroups/

本文还包含介绍 cgroup 功能的幻灯片。