不加资源限制跑容器是在给自己挖坑。一个容器内存泄漏,整台机器就挂了。这是我在生产环境踩过的坑,记下来。

内存限制

最重要的参数是 --memory--memory-swap

docker run -d \
  --memory="512m" \
  --memory-swap="512m" \
  my-app

--memory-swap 设置成和 --memory 一样可以禁用 swap,避免容器把宿主机 swap 打满。

CPU 限制

两种方式,推荐用 --cpus

# 限制最多使用 1.5 个 CPU 核心
docker run -d --cpus="1.5" my-app

# 老写法,cpuset 绑定具体核心
docker run -d --cpuset-cpus="0,1" my-app

在 docker-compose 里配置

services:
  app:
    image: my-app
    deploy:
      resources:
        limits:
          cpus: "1.0"
          memory: 512M
        reservations:
          memory: 256M

注意 deploy.resources 在 docker-compose v3 中只有 swarm 模式才生效,standalone 模式要用 mem_limitcpus

监控实际使用

# 实时查看所有容器资源用量
docker stats

# 只看特定容器
docker stats my-app --no-stream
← 返回