一、为什么要限制容器内存?
在使用 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
七、最佳实践建议
- 所有生产容器都应设置内存限制,防止资源耗尽。
- 根据服务特性预留一定内存冗余,避免频繁触发 OOM。
- 内存敏感型服务(如 Redis、Java)应重点监控。
- 配合
docker stats做长期资源趋势分析。 - 结合
--cpus参数同时控制 CPU 资源,更均衡。
八、总结对照表
| 目标 | 命令或配置示例 |
|---|---|
| 限制最大内存 | -m 512m |
| 限制总内存(含 swap) | --memory-swap 1g |
| 禁止使用 swap | --memory-swap=512m |
| 查看运行状态 | docker stats |
| Compose 配置 | mem_limit: 512m |
合理配置容器内存限制,是 Docker 运维中保障稳定性与资源隔离性 的关键。
建议在上线前就设置好各服务的资源边界,让系统运行更安全、更高效。