Docker 实战:如何限制容器的内存使用大小

一、为什么要限制容器内存?

在使用 Docker 部署服务时,如果不加限制,某个容器可能因为内存泄漏或负载过高,导致主机内存被耗尽,拖垮其他容器甚至整个系统。

因此,在生产环境中,限制容器内存使用量(Memory Limit) 是一项关键的资源控制措施。


二、Docker 中的内存限制参数

Docker 基于 Linux 的 cgroups(控制组) 机制实现资源隔离。

和内存相关的主要参数如下:

参数 说明
--memory-m 限制容器最大可使用的物理内存
--memory-swap 限制容器可使用的总内存(物理内存 + swap)
--oom-kill-disable 是否禁用 OOM Killer(不建议在生产中关闭)

三、基础用法示例

1. 限制容器最大内存为 512MB

bash 复制代码
docker run -d --name myapp -m 512m nginx

此命令表示容器最多使用 512MB 内存。超过限制时,系统会触发 OOM 机制终止容器。


2. 同时限制内存与 swap

bash 复制代码
docker run -d --name myapp -m 512m --memory-swap 1g nginx

说明:

  • 物理内存上限:512MB
  • 总内存(含 swap)上限:1GB
  • 超出时系统自动使用 swap 空间

⚠️ 若 --memory-swap--memory 值相同,表示禁止使用 swap


四、查看容器的内存使用情况

使用以下命令可实时查看容器的资源使用:

bash 复制代码
docker stats

输出示例:

复制代码
CONTAINER ID   NAME     MEM USAGE / LIMIT
a1b2c3d4e5f6   myapp    120.5MiB / 512MiB

也可通过以下命令查看详细配置:

bash 复制代码
docker inspect myapp | grep Memory

五、容器 OOM(内存不足)行为

当容器内存达到限制时,Docker 会触发 OOM Killer(Out Of Memory Killer),强制终止进程。

此时容器的退出码为 137

bash 复制代码
docker ps -a

输出示例:

复制代码
Exited (137) 10 seconds ago

表示该容器因内存超限被系统杀死。


六、在 Docker Compose 中限制内存

如果使用 docker-compose.yml 启动容器,可以这样定义:

yaml 复制代码
version: '3.8'
services:
  web:
    image: nginx
    deploy:
      resources:
        limits:
          memory: 512M

💡 注意:deploy.resources.limits 仅在 Docker Swarm 模式 下生效。

普通 Compose 可使用旧语法:

yaml 复制代码
services:
  web:
    image: nginx
    mem_limit: 512m

七、最佳实践建议

  1. 所有生产容器都应设置内存限制,防止资源耗尽。
  2. 根据服务特性预留一定内存冗余,避免频繁触发 OOM。
  3. 内存敏感型服务(如 Redis、Java)应重点监控。
  4. 配合 docker stats 做长期资源趋势分析。
  5. 结合 --cpus 参数同时控制 CPU 资源,更均衡。

八、总结对照表

目标 命令或配置示例
限制最大内存 -m 512m
限制总内存(含 swap) --memory-swap 1g
禁止使用 swap --memory-swap=512m
查看运行状态 docker stats
Compose 配置 mem_limit: 512m

合理配置容器内存限制,是 Docker 运维中保障稳定性与资源隔离性 的关键。

建议在上线前就设置好各服务的资源边界,让系统运行更安全、更高效。

相关推荐
考虑考虑6 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯6 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路10 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
Java陈序员12 小时前
企业级!一个基于 Java 开发的开源 AI 应用开发平台!
spring boot·agent·mcp
像我这样帅的人丶你还13 小时前
Java 后端详解(五):Redis 缓存
java·后端·全栈
plainGeekDev15 小时前
GreenDAO → Room
android·java·kotlin
lichenyang45320 小时前
Docker 学习笔记(五):Docker Compose,用一个 YAML 启动前端、后端和 MongoDB
docker
lichenyang45320 小时前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang45320 小时前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang45320 小时前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器