Docker 资源限制
不加限制时,单个容器可能吃掉宿主机全部 CPU 与内存,拖垮其他服务。本章讲内存、CPU 限制参数与 docker stats 观测方法,并给出中间件容器的配置建议。
内存限制
-m/--memory 限制容器可用内存上限,超出后内核触发 OOM 直接杀掉进程,容器以 137 退出:
docker run -d -m 512m --name web myapp
docker inspect --format '{{.HostConfig.Memory}}' web
# 输出:536870912(单位是字节,即 512MB)
docker inspect --format '{{.State.OOMKilled}}' web # 输出:true 表示被 OOM 杀掉
--memory-swap 表示「内存 + 交换分区」的总上限:只设 -m 不设它时,可用交换默认与内存上限相同;设 -1 表示交换不限;它的值不能小于 -m:
docker run -d -m 512m --memory-swap 1g --name web myapp # 内存 512M,交换最多再 512M
docker run -d -m 512m --memory-swap -1 --name web myapp # 交换空间不设限
CPU 限制
--cpus 限制可用的 CPU 核数(支持小数),--cpu-shares 是相对权重、只在争抢 CPU 时生效:
docker run -d --cpus 1.5 --name api myapp # 最多占用 1.5 个核
docker run -d --cpu-shares 512 --name low myapp # 权重低于默认 1024,忙时让路
docker update --cpus 2 api # 运行中的容器可动态调整
实时占用 docker stats
docker stats 实时展示每个容器的 CPU、内存、网络与磁盘 IO:
docker stats
# 输出:CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM %
# a1b2c3d4 web 1.2% 210MiB / 512MiB 41.02%
docker stats --no-stream myapp # 只看当前一次快照,适合脚本
默认值与配置途径
什么都不设时,容器理论上可使用宿主机全部空闲资源;daemon.json 不直接提供内存/CPU 的全局默认上限,逐容器限制是常态。Compose 用等价简写字段声明同一组限制:
services:
mysql:
image: mysql:8.0
cpus: "2.0"
mem_limit: 1g
memswap_limit: 2g
中间件建议:MySQL 这类内存敏感服务给 12 GB 起步并留足交换缓冲,Redis 128512 MB 即可,Java 应用按 -Xmx 再留约 25% 余量。
小结
-m/--memory 与 --cpus 是最常用的两道闸:先按业务估量定上限,再用 docker stats 观测实际占用、按需 docker update,避免单容器「吃独食」拖垮整机。