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,避免单容器「吃独食」拖垮整机。

笔记加载中…