在2核2G云服务器上使用Docker部署应用时,需要精细规划内存分配。以下是具体建议:
一、系统基础预留
- 操作系统预留:预留512MB给宿主机系统进程
- Docker守护进程:预留100-150MB
- 系统缓存/缓冲:保留约200MB弹性空间
二、容器内存分配策略
1. 单应用场景(推荐)
应用容器:1.2-1.3GB
JVM应用需额外注意:-Xmx设置为800MB-1GB
2. 多容器微服务场景
反向XX(Nginx):64-128MB
主应用:800MB-1GB
数据库(如PostgreSQL):256-384MB
监控/日志XX:64-128MB
3. 关键配置示例
# docker-compose.yml示例
services:
app:
deploy:
resources:
limits:
memory: 1g # 硬限制
reservations:
memory: 800m # 软保留
environment:
- JAVA_OPTS=-Xmx800m -Xms256m # JVM内存设置
三、优化建议
1. 容器层面
- 使用Alpine基础镜像减小体积
- 设置
--memory-swap=0禁用交换(或限制为内存的50%) - 启用OOM Killer优先级:
--oom-score-adj
2. 应用层面
- 调整应用堆内存(JVM:
-Xmx,Node.js:--max-old-space-size) - 启用应用缓存时使用内存缓存而非磁盘
- 数据库连接池限制在合理范围(如20-30连接)
3. 监控与调整
# 监控命令
docker stats --no-stream
free -h
cat /sys/fs/cgroup/memory/memory.usage_in_bytes
四、部署方案示例
方案A:Web应用 + 数据库
Nginx: 80MB (限制100MB)
Node.js应用: 800MB (限制1GB)
PostgreSQL: 384MB (限制512MB)
监控栈: 128MB
总计:~1.4GB + 系统预留
方案B:Java单体应用
Java应用:-Xmx1024m -Xms512m
容器限制:1.3GB
剩余内存:系统使用+弹性缓冲
五、注意事项
- 避免过度分配:所有容器
memory.limit总和应≤1.8GB - 设置重启策略:
restart: unless-stopped应对OOM - 使用内存警告:通过监控设置85%使用率告警
- 数据库考虑:内存紧张时考虑使用云数据库或SQLite
六、紧急措施
- 配置交换空间:
fallocate -l 1G /swapfile - 设置OOM优先级:关键服务
--oom-kill-disable(慎用) - 日志轮转:防止日志占满空间
核心原则:保持总分配内存≤物理内存的85%,为系统突发负载留出缓冲空间。根据实际监控数据逐步调整,优先保证核心服务的稳定性。
CLOUD技术笔记