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

viv*_*d4v 76 docker docker-compose

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

使用版本2,它可以在服务下使用"mem_limit"和"cpu_shares"参数.但它在使用版本3时失败,将它们置于部署部分似乎不值得,除非我使用swarm模式.

有人可以帮忙吗?

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
Run Code Online (Sandbox Code Playgroud)

Ber*_*nox 43

deploy:
  resources:
    limits:
      cpus: '0.001'
      memory: 50M
    reservations:
      cpus: '0.0001'
      memory: 20M
Run Code Online (Sandbox Code Playgroud)

更多:https://docs.docker.com/compose/compose-file/#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
Run Code Online (Sandbox Code Playgroud)

注意:

  • 不必要的暴露,将在您的堆栈网络上默认暴露.
  • 图像必须预先构建.在v3内构建不可能
  • "重启"也被解雇了.U可以在部署时使用重启失败操作
  • 您可以使用独立的一个节点"swarm",v3大多数改进(如果不是全部)都是针对swarm的

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

ports:
  - 80:80
Run Code Online (Sandbox Code Playgroud)

  • @ viveky4d4v正如Compose格式v3 doc所述,如果您不使用Swarm,则忽略`deploy`.除非您使用Swarm,否则没有理由使用v3格式. (14认同)
  • 1.我能够使用版本3构建图像.<br/> 2.似乎v3的方法与v2完全不同,而不像升级.<br/> 3.部署似乎只在群集模式下工作.我收到警告 - "警告:某些服务(节点)使用'deploy'键,这将被忽略.Compose不支持部署配置 - 使用`docker stack deploy`部署到swarm." (6认同)
  • 如果开始新的部署,我将从v3开始.即使我只有一个主持人.因此,一旦你理解了这个概念,你就有了后来扩展的可能性,并且它将需要相同的时间. (2认同)
  • @Berndinox您是否偶然知道如何设置https://docs.docker.com/v17.12/config/containers/resource_constraints/#limit-a-containers-access-to-中提到的`memory-swap`选项记忆?我没有在docker-compose.yml(https://docs.docker.com/v17.12/compose/compose-file/#resources)中看到如何设置它的示例。非常感谢。 (2认同)

saw*_*303 38

泊坞窗撰写不支持deploy关键.当您在Docker堆栈中使用版本3 YAML文件时,它才受到尊重.

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

警告:某些服务(数据库)使用"部署"密钥,该密钥将被忽略.Compose不支持"部署"配置 - 用于docker stack deploy部署到群组.

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

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

  • 感谢您指出这一点...但它仍然留下了一个悬而未决的问题:如何**简单地在 docker compose 文件中应用每个容器的内存限制?** [Swarm 模式概述](https://docs.docker .com/engine/swarm/) 可能会提供一些背景知识...但毕竟,除了“docker-compose”之外还需要运行另一个应用程序来简单地限制硬件资源,这绝对不是最佳选择... (7认同)
  • 以下是@DavidThomas提到的“--compatibility”标志的文档链接:https://docs.docker.com/compose/compose-file/compose-versioning/#compatibility-mode (4认同)
  • 尤其是文档说,如果您要执行此操作,请使用v2或进行部署。 (2认同)
  • 使用 docker-compose 3.7,您可以添加 --compatibility 标志,它将把 3.x 文件中的部署限制转换为非 swarm 执行。例如 docker-compose --compatibility up (2认同)
  • 与文档所说相反,我在[此处](https://github.com/docker/compose-cli/issues/1523)发现了一个已关闭的相关问题来支持`deploy.resource.limits`,尽管我不是确定这是 v2 还是 v3。奇怪的是,我可以在 v3.8(docker-compose v1.28.2、docker v20.10.12)中使用这些资源限制,而无需群或兼容模式,我不确定这是故意的还是文档已经过时了。 (2认同)
  • 诗。`cpus: "4.0"` 设置意味着 4 个 CPU 核心运行 100% CPU 负载最大(如果您有超线程,4 个核心实际上意味着只有 2 个核心)。所以“4”不是物理 CPU。在大多数系统(具有 HT)中,这个“4.0”意味着 2 个物理核心正在 100% 运行。这是很多!即使使用具有 16 个“核心”(8 核心 + HT)的 Ryzen 7 设置,这个“4.0”也非常高。 (2认同)

sec*_*vfr 31

这可以通过 version >=实现3.8。这是使用 docker-compose >= 的示例1.28.x

version: '3.9'

services:
  app:
    image: nginx
    cpus: "0.5"
    mem_reservation: "10M"
    mem_limit: "250M"
Run Code Online (Sandbox Code Playgroud)

其工作证明(请参阅 MEM USAGE)列:

3.9 版本设置内存限制

达到内存限制时的预期行为是容器被杀死。在这种情况下,无论是设置restart: always还是调整您的应用程序代码。

Docker compose v3 中的限制和重新启动设置现在应使用以下命令进行设置(restart: always也已弃用):

deploy:
  restart_policy:
    condition: on-failure
    delay: 5s
    max_attempts: 3
    window: 120s
  resources:
    limits:
      cpus: '0.50'
      memory: 50M
    reservations:
      cpus: '0.25'
      memory: 20M
Run Code Online (Sandbox Code Playgroud)

  • 请注意,官方 [Compose 规范](https://github.com/compose-spec/compose-spec/blob/master/spec.md) 说:`mem_reservation` 已弃用:使用deploy.reservations.memory (5认同)

Rig*_*igi 24

我知道这个话题有点老,看起来很陈旧,但是无论如何我都可以使用这些选项:

    deploy:
      resources:
        limits:
          cpus: '0.001'
          memory: 50M
Run Code Online (Sandbox Code Playgroud)

使用3.7版本的docker-compose时

对我而言,有用的是使用以下命令:

docker-compose --compatibility up

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

If set, Compose will attempt to convert deploy keys in v3 files to their non-Swarm equivalent
Run Code Online (Sandbox Code Playgroud)

觉得很棒,我不必将docker-compose文件还原回v2。

  • 对于设计不佳的程序 docker-compose,这是一个很好的修复。docker-compose 太努力地想要成为一个生产级编排器:https://github.com/docker/compose/issues/4513 (11认同)
  • 为什么在这里使用非整数 _cpus: '0.001'_ ?是“一个还是没有”之类的东西吗? (3认同)
  • 有趣的是,此选项有一个[note](https://github.com/docker/compose/pull/5684):“该转换是“尽力而为”的尝试,不应依赖于生产部署。” (2认同)
  • 如果容器 RAM/CPU &gt; Docker for Windows/Mac 可用,您的资源限制将不会生效。要更改此设置,请转到 Docker for Mac/Windows 首选项 -&gt; 资源并进行相应调整。 (2认同)
  • 来自 @four43 的感谢链接仍然是黄金链接:https://github.com/docker/compose/issues/4513 – (2认同)

Jam*_*udd 15

docker-compose我认为这里使用and docker compose(带有空格)存在混淆。如果您还没有安装 compose 插件,可以使用https://docs.docker.com/compose/install进行安装。

这是一个刚刚运行 Elasticsearch 的示例撰写文件

 version: "3.7"
 services: 
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.15.2
    restart: always
    ports:
      - "9222:9200"
    deploy:
      resources:
        limits:
          cpus: "4"
          memory: "2g"
    environment:
      - "node.name=elasticsearch"
      - "bootstrap.memory_lock=true"
      - "discovery.type=single-node"
      - "xpack.security.enabled=false"
      - "ingest.geoip.downloader.enabled=false"
Run Code Online (Sandbox Code Playgroud)

我把它放在一个名为 的目录中,estest该文件名为es-compose.yaml. 该文件设置 CPU 和内存限制。

如果您使用docker-compose例如启动

docker-compose -f es-compose.yaml up
Run Code Online (Sandbox Code Playgroud)

然后看docker stats你看

CONTAINER ID   NAME                     CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O        PIDS
e3b6253ee730   estest_elasticsearch_1   342.13%   32.39GiB / 62.49GiB   51.83%    7.7kB / 0B        27.3MB / 381kB   46
Run Code Online (Sandbox Code Playgroud)

所以CPU和内存资源限制被忽略。在启动过程中您会看到警告

WARNING: Some services (elasticsearch) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm.
Run Code Online (Sandbox Code Playgroud)

我认为这就是人们关注 Docker stack/swarm 的原因。但是,如果您只是切换到使用docker composedocker CLI 中内置的较新版本https://docs.docker.com/engine/reference/commandline/compose/例如

docker compose -f es-compose.yaml up
Run Code Online (Sandbox Code Playgroud)

再看看docker stats你会发现

CONTAINER ID   NAME                     CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O        PIDS
d062eda10ffe   estest-elasticsearch-1   0.41%     1.383GiB / 2GiB       69.17%    8.6kB / 0B        369MB / 44MB     6
Run Code Online (Sandbox Code Playgroud)

因此,已应用限制。

在我看来,这比 swarm 更好,因为它仍然允许您将容器构建为 compose 项目的一部分,并通过文件轻松传递环境。我建议尽可能删除docker-compose并切换到使用较新的版本docker compose