内存限制与 OOM
容器内存限制防止内存耗尽导致宿主不稳定,下面介绍配置方法。
--memory 参数
Bash
# 限制 512MB 内存
docker run -d --memory=512m my-app
# 限制 1GB 内存
docker run -d --memory=1g my-app
# 限制 256MB,swap 512MB
docker run -d --memory=256m --memory-swap=512m my-app
--memory限制容器物理内存,--memory-swap限制内存 + swap 总量。
--memory-swap
Bash
# 内存 512MB,swap 256MB(总计 768MB)
docker run -d --memory=512m --memory-swap=768m my-app
# 不限制 swap(不推荐)
docker run -d --memory=512m --memory-swap=-1 my-app
OOM Killer
触发条件
容器内存超过限制时,Linux OOM Killer 会终止容器进程:
Bash
# 查看容器是否被 OOM 杀死
docker inspect my-app | grep -A 5 "OOMKilled"
# 输出
"OOMKilled": true
禁用 OOM Killer
Bash
# 不推荐:禁用 OOM Killer
docker run -d --memory=512m --oom-kill-disable my-app
# 容器超限时不会被杀死,可能阻塞宿主
禁用 OOM Killer 可能导致宿主内存耗尽,谨慎使用。
Compose 配置
YAML
version: '3.8'
services:
app:
image: my-app
deploy:
resources:
limits:
memory: 512M
reservations:
memory: 256M
查看内存使用
Bash
# 实时监控
docker stats my-app
# 输出
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM %
abc123 my-app 1.5% 256MiB / 512MiB 50%
# 查看容器内存限制
docker inspect my-app | grep -A 5 "Memory"
# 输出
"Memory": 536870912, # 512MB
"MemorySwap": 1073741824, # 1GB
"MemoryReservation": 268435456 # 256MB
更新限制
Bash
# 运行时更新内存限制
docker update --memory=1g my-app
docker update --memory-swap=2g my-app
最佳实践
- 所有容器内存限制总和应小于宿主内存
- 预留 20% 宿主内存给系统和 Docker Daemon
- Java 容器配置
-XX:+UseContainerSupport识别限制 - Node.js 配置
--max-old-space-size限制堆大小
要点总结
--memory限制容器物理内存,--memory-swap限制内存 + swap- 超限时 OOM Killer 终止容器,可禁用但不推荐
- Compose 通过
deploy.resources.limits.memory配置 docker stats实时监控内存使用- Java/Node.js 需配置 JVM/Node 参数识别容器限制
📝 发现内容有误?点击此处直接编辑