关键不是在docker engine层统一设限,而是通过单个容器或服务级资源限制实现精细化管控:deploy.resources中limits为硬上限(超限即kill),reservations为swarm下调度预留;run命令支持-m和--cpus临时限制;engine本身无全局cpu/内存配额功能。
要防止 docker 容器耗尽宿主机系统资源,关键不是在 docker engine 层统一设限,而是通过 单个容器或服务级的资源限制 来实现精细化管控。docker engine 本身不提供全局 cpu/内存“总配额”功能,它的角色是执行和 enforcement——把你在容器启动时声明的 limits 转为内核 cgroups 规则。
用 deploy.resources 在 Compose 中设硬限制
这是生产环境最推荐的方式,适用于 docker-compose.yml(需 version ≥ 3.8):
- limits 是硬上限:超出即被 kill(如内存超限触发 OOM Killer,CPU 超出则被节流)
- reservations 是调度预留:Swarm 模式下用于资源预占;独立 Compose 中仅作文档参考,不生效
- 示例配置确保 nginx 不吃光整机资源:
services:
web:
image: nginx
deploy:
resources:
limits:
cpus: '0.75'
memory: 768M
用 run 命令临时限制单个容器
适合调试、测试或一次性运行场景:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
-
docker run -m 512m --cpus 0.5 nginx:限制最多用 512MB 内存、0.5 个 CPU 核心 -
-m等价于--memory,支持单位:b/k/m/g(如1g) -
--cpus是小数形式的 CPU 时间片配额,非逻辑核心数(0.5 = 50% 的单核时间) - 注意:
--memory-swap若未显式设置,会默认等于--memory,即禁用 swap;设为-1才允许使用无限 swap
避免常见误区:Engine 层没“全局配额”开关
Docker Engine(dockerd)配置文件 /etc/docker/daemon.json 不支持设置全局限制。它能调的只有:
- 默认 ulimit(如
"default-ulimits": {"nofile": {"Name": "nofile", "Hard": 65536, "Soft": 65536}}) - 存储驱动、日志大小、镜像加载行为等,但不包含 CPU/memory 总用量控制
- 强行在宿主机上用 systemd 对 dockerd 进程本身设限(如
MemoryLimit=4G)是危险操作——可能直接导致 daemon 崩溃,连带所有容器退出
真正兜底:靠 Linux 内核和宿主机管理
当多个容器未设限或设限过宽时,需从系统层补防:
- 用
systemd-run --scope -p MemoryMax=6G -p CPUQuota=75% /bin/bash启动一个受控 shell,再在其中运行 docker 命令(适合临时应急) - 对整个 Docker 工作目录(如
/var/lib/docker)挂载时启用quota或project quota,防磁盘写满 - 监控工具(如 cAdvisor + Prometheus)持续采集各容器 real-time usage,配合告警及时干预










