如何在 docker compose 版本 3 中指定内存和 CPU 限制

Posted

技术标签:

【中文标题】如何在 docker compose 版本 3 中指定内存和 CPU 限制【英文标题】:How to specify Memory & CPU limit in docker compose version 3 【发布时间】:2017-07-09 18:31:46 【问题描述】:

我无法为版本 3 中指定的服务指定 CPU 和内存限制。

对于版本 2,它可以与服务下的 mem_limitcpu_shares 参数一起正常工作。但是在使用版本 3 时它会失败,除非我使用 swarm 模式,否则将它们放在 deploy 部分似乎不值得。

有人可以帮忙吗?

    version: "3"
    services:
      node:
        build:
         context: .
          dockerfile: ./docker-build/Dockerfile.node
        restart: always
        environment:
          - VIRTUAL_HOST=localhost
        volumes:
          - logs:/app/out/
        expose:
          - 8083
        command: ["npm","start"]
        cap_drop:
          - NET_ADMIN
          - SYS_ADMIN

【问题讨论】:

提供在 docker-compose 项目中创建的相关问题的链接:github.com/docker/compose/issues/4513 【参考方案1】:

我知道这个话题有点老了,似乎过时了,但无论如何我都可以使用这些选项:

    deploy:
      resources:
        limits:
          cpus: '0.001'
          memory: 50M

当使用 3.7 版本的 docker-compose 时

对我来说有帮助的是使用这个命令:

docker-compose --compatibility up

--compatibility 标志代表(取自文档):

如果设置,Compose 将尝试将 v3 文件中的部署密钥转换为 他们的非 Swarm 等价物

觉得太好了,我不必将 docker-compose 文件恢复到 v2。

【讨论】:

有趣的是,这个选项有一个note:“转换是“尽力而为”的尝试,不应依赖于生产部署。” 对于设计不佳的程序 docker-compose,这是一个很好的解决方案。 docker-compose 正在努力成为它不是的样子,一个生产级编排器:github.com/docker/compose/issues/4513 如果容器 RAM/CPU > Docker for Windows/Mac 可用,您的资源约束将不会生效。要更改此设置,请转到 Docker for Mac/Windows 首选项->资源并进行相应调整。 为什么在这里使用非整数 cpus: '0.001'?是不是类似于“一个或没有”? 来自@four43 的感谢链接仍然是金色的:github.com/docker/compose/issues/4513 –【参考方案2】:
deploy:
  resources:
    limits:
      cpus: '0.001'
      memory: 50M
    reservations:
      cpus: '0.0001'
      memory: 20M

更多:https://docs.docker.com/compose/compose-file/compose-file-v3/#resources

在你的具体情况下:

version: "3"
services:
  node:
    image: USER/Your-Pre-Built-Image
    environment:
      - VIRTUAL_HOST=localhost
    volumes:
      - logs:/app/out/
    command: ["npm","start"]
    cap_drop:
      - NET_ADMIN
      - SYS_ADMIN
    deploy:
      resources:
        limits:
          cpus: '0.001'
          memory: 50M
        reservations:
          cpus: '0.0001'
          memory: 20M

volumes:
  - logs

networks:
  default:
    driver: overlay

注意:

没有必要公开,默认情况下它将在您的堆栈网络上公开。 必须预先构建图像。无法在 v3 中构建 “重新启动”也已弃用。您可以在部署下使用重启和失败操作 您可以使用独立的单节点“swarm”,v3 大多数改进(如果不是全部)都是针对 swarm 的

另请注意: Swarm 模式下的网络不桥接。如果您只想在内部连接,则必须连接到网络。您可以 1)在其他撰写文件中指定外部网络,或者必须使用 --attachable 参数创建网络(docker network create -d overlay My-Network --attachable) 否则你必须像这样发布端口:

ports:
  - 80:80

【讨论】:

1.我能够使用版本 3 构建图像。 2. v3 的方法似乎与 v2 完全不同,而不是升级。 3. Deploy 似乎只在 swarm 模式下工作。我收到警告 - “警告:某些服务(节点)使用 'deploy' 键,这将被忽略。Compose 不支持部署配置 - 使用 docker stack deploy 部署到 swarm。” @viveky4d4v 正如 Compose 格式 v3 文档所述,如果您不使用 Swarm,deploy 将被忽略。除非您使用 Swarm,否则真的没有理由使用 v3 格式。 如果开始一个新的部署,我会从 v3 开始。即使我只有一个主机。因此,您可以稍后进行扩展,一旦您理解了这个概念,您将需要相同的时间。 嗨@Connor,当我编辑答案时,我所做的只是更正了一个断开的链接。和你一样,我无法理解这里的“仅限内部”是什么意思。 @Berndinox 你知道如何设置docs.docker.com/v17.12/config/containers/resource_constraints/… 中提到的memory-swap 选项吗?我没有看到如何在docker-compose.yml (docs.docker.com/v17.12/compose/compose-file/#resources) 中设置它的示例。非常感谢。【参考方案3】:

Docker Compose 不支持 deploy 键。只有当您在 Docker Stack 中使用版本 3 YAML 文件时,它才会受到尊重。

当您将deploy 密钥添加到您的docker-compose.yml 文件然后运行docker-compose up -d 时会打印此消息

警告:某些服务(数据库)使用“部署”键,这将是 忽略。 Compose 不支持“部署”配置 - 使用 docker stack deploy 部署到集群。

文档 (https://docs.docker.com/compose/compose-file/#deploy) 说:

指定与部署和运行相关的配置 服务。这仅在使用 docker 部署到 swarm 时生效 堆栈部署,并被 docker-compose up 和 docker-compose 忽略 运行。

【讨论】:

特别是文档说如果你想这样做,使用 v2 或部署到 swarm。 使用 docker-compose 3.7,您可以添加 --compatibility 标志,它会将 3.x 文件中的部署限制转换为非 swarm 执行。例如docker-compose --兼容性提升 这是@DavidThomas 提到的--compatibility 标志的文档链接:docs.docker.com/compose/compose-file/compose-versioning/… 感谢您指出这一点...但问题仍然悬而未决:如何在 docker compose 文件中简单地为每个容器应用内存限制? @987654323 @ 可能会提供一些背景知识...但毕竟需要在docker-compose 旁边运行另一个应用程序来简单地限制硬件资源绝对不是最佳选择...【参考方案4】:

我有其他经历,也许有人可以解释一下。

也许这是错误(我认为这是一个功能),但是,我可以在 docker-compose 中使用部署限制(内存限制)而无需 swarm,悬停 CPU 限制不起作用,但复制可以。

$> docker-compose --version
docker-compose version 1.29.2
$> docker  --version
Docker version 20.10.12
version: '3.2'

services:
  limits-test:
    image: alexeiled/stress-ng
    command: [
     '--vm', '1', '--vm-bytes', '20%', '--vm-method', 'all', '--verify', '-t', ' 10m', '-v'

    ]
    deploy:
      resources:
        limits:
          cpus: 0.50
          memory: 1024M

Dokcer 统计数据

b647e0dad247   dc-limits_limits-test_1   0.01%     547.1MiB / 1GiB     53.43%    942B / 0B   0B / 0B     3

【讨论】:

以上是关于如何在 docker compose 版本 3 中指定内存和 CPU 限制的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 docker-compose 的 api 版本

如何将 docker-compose 升级到最新版本

docker-compose参数

在 docker-compose 中声明变量

如何在Docker环境下使用composer

如何在 .NET Core 中获取 Docker 版本