我无法为版本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

当前回答

我有其他的经历,也许有人能解释一下。

也许这是一个bug(我认为这是一个功能),但是,我能够在没有swarm的docker-compose中使用部署限制(内存限制),悬浮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

码头工人统计数据

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

编辑完毕,谢谢@Jimmix

其他回答

我认为在使用docker-compose和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"

我把它放在estest目录下文件名为es-compose。yaml。该文件设置CPU和内存限制。

如果你使用docker-compose启动。

docker-compose -f es-compose.yaml up

然后看看docker的统计数据

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

因此,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.

我认为这就是人们关注Docker stack/swarm的原因。然而,如果你只是切换到使用新的docker合成现在内置在docker CLI https://docs.docker.com/engine/reference/commandline/compose/。

docker compose -f es-compose.yaml up

再看看docker的统计数据

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

因此应用了这些限制。

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

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

当您将deploy键添加到docker-compose时,将打印此消息。然后运行docker-compose up -d

警告:某些服务(数据库)使用'deploy'键 忽略了。Compose不支持“部署”配置-使用docker堆栈部署部署到一个群。

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

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

不过你可以使用Docker Compose v2。给定下面的Docker组合,你可以使用deploy键来限制容器资源。

version: "3.9"
services:
  database:
    image: mariadb:10.10.2-jammy
    container_name: mydb
    environment:
      MYSQL_ROOT_PASSWORD: root_secret
      MYSQL_DATABASE: mydb
      MYSQL_USER: myuser
      MYSQL_PASSWORD: secret
      TZ: "Europe/Zurich"
      MARIADB_AUTO_UPGRADE: "true"
    tmpfs:
      - /var/lib/mysql:rw
    ports:
      - "127.0.0.1:3306:3306"
    deploy:
      resources:
        limits:
          cpus: "4.0"
          memory: 200M
    networks:
      - mynetwork

当你运行docker compose up -d(注意:在docker compose的版本2中,你调用docker二进制代码而不是docker-compose python应用程序),然后检查资源,你会看到内存被限制在200 MB。CPU限制不会被docker统计数据暴露。

❯ docker stats --no-stream
CONTAINER ID   NAME   CPU %     MEM USAGE / LIMIT   MEM %     NET I/O           BLOCK I/O         PIDS
2c71fb8de607   mydb   0.04%     198MiB / 200MiB     99.02%    2.67MB / 3.77MB   70.6MB / 156MB    18

我有其他的经历,也许有人能解释一下。

也许这是一个bug(我认为这是一个功能),但是,我能够在没有swarm的docker-compose中使用部署限制(内存限制),悬浮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

码头工人统计数据

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

编辑完毕,谢谢@Jimmix

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

更多:https://docs.docker.com/compose/compose-file/compose-file-v3/资源

在你的具体情况下:

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

注意:

Expose不是必需的,它将在堆栈网络中按默认值公开。 图像必须预先构建。不可能在v3中构建 “Restart”也不建议使用。您可以在“部署”下使用“故障时”操作重新启动 你可以使用一个独立的节点“swarm”,v3大多数的改进(如果不是全部的话)都是针对swarm的

还要注意: Swarm模式下的网络不桥接。如果只希望内部连接,则必须连接到网络。你可以1)在另一个合成文件中指定一个外部网络,或者必须使用——attectable参数来创建网络(docker network create -d overlay My-Network——attectable) 否则你必须像这样发布端口:

ports:
  - 80:80

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

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

当使用3.7版本的docker-compose时

在我的情况下,有用的是使用这个命令:

Docker-compose——兼容性上升

——兼容性标志代表(来自文档):

如果设置,Compose将尝试将v3文件中的部署键转换为 它们的非蜂群对等物

我认为这很棒,我不需要将docker-compose文件恢复到v2。