我无法为版本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
我有其他的经历,也许有人能解释一下。
也许这是一个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
>= 3.8版本可以做到这一点。下面是一个使用docker-compose >= 1.28的示例。x:
version: '3.9'
services:
app:
image: nginx
cpus: "0.5"
mem_reservation: "10M"
mem_limit: "250M"
它工作的证明(见MEM USAGE)列:
达到内存限制时的预期行为是容器被杀死。在这种情况下,设置重启: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
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