如何在Docker Compose版本3中指定内存和CPU限制


110

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

在版本2中,可以在服务下使用“ mem_limit”和“ cpu_shares”参数正常工作。但是在使用版本3时失败了,除非我使用群模式,否则将它们置于部署部分似乎不值得。

有人可以帮忙吗?

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

3
提供指向在docker
Guillaume

Answers:


90

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

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

使用3.7版本的docker-compose时

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

docker-compose --compatibility up

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

如果设置,则Compose将尝试将v3文件中的部署密钥转换为其等效的非Swarm密钥

认为这很好,我不必将docker-compose文件还原回v2。


4
有趣的是,该选项有一个注释:“转换是“尽力而为”的尝试,不应将其用于生产部署。”
bartolo-otrit

2
对于设计不良的程序docker-compose来说,这是一个很好的解决方案。docker-compose正在努力成为非生产级协调员:github.com/docker/compose/issues/4513
four43

1
如果容器RAM / CPU>适用于Windows / Mac的Docker可用,您的资源约束将不会生效。要更改此设置,请转到Docker for Mac / Windows首选项->资源并进行相应调整。
8bitme

58
deploy:
  resources:
    limits:
      cpus: '0.001'
      memory: 50M
    reservations:
      cpus: '0.0001'
      memory: 20M

更多: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

注意:

  • 公开不是必需的,默认情况下,它将在堆栈网络中公开。
  • 图像必须预先构建。无法在v3内进行构建
  • 也不建议使用“重新启动”。您可以通过失败操作在部署下使用重新启动
  • 您可以使用独立的一个节点“ swarm”,v3的大多数改进(如果不是全部)都适用于群集

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

ports:
  - 80:80

6
1.我能够使用版本3构建映像。<br/> 2.似乎v3的方法与v2完全不同,而不是升级。<br/> 3.部署似乎仅在集群模式下有效。我收到警告-<br/>“警告:某些服务(节点)使用'deploy'键,该键将被忽略docker stack deploy
。Compose

23
@ viveky4d4v如Compose格式v3 doc所述,deploy如果您不使用Swarm ,则会被忽略。除非您使用Swarm,否则实际上没有理由使用v3格式。
Dan Lowe

2
如果要开始新的部署,我将从v3开始。即使我只有一个主机。因此,您有了以后扩展的可能性,而一旦您理解了这个概念,您将花费相同的时间。
Berndinox

1
嗨,@ Connor,当我编辑答案时,我所做的只是纠正了断开的链接。像您一样,我无法解读“仅限内部使用”在这里的含义。
杰伊·泰勒

3
@Berndinox您是否偶然知道如何设置docs.docker.com/v17.12/config/containers/resource_constraints/…中memory-swap提到的选项?我没有在(docs.docker.com/v17.12/compose/compose-file/#resources)中看到如何设置它的示例。非常感谢。docker-compose.yml
瑞安

49

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 stack deploy部署到集群时才生效,而被docker-compose up和docker-compose run忽略。


2
尤其是文档说,如果您要执行此操作,请使用v2或部署以进行集群。
ic_fl2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.