如何在 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_limit
和 cpu_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 限制的主要内容,如果未能解决你的问题,请参考以下文章