在低配置服务器(2核CPU、2GB内存)上运行 Docker 容器时,合理分配资源给 MySQL 和 Redis 至关重要,否则容易导致系统内存耗尽或性能下降。以下是一些建议和最佳实践:
🧩 一、总体资源分配建议
| 组件 | CPU 分配 | 内存分配 | 备注 |
|---|---|---|---|
| MySQL | 1 核 | 800MB ~ 1.1GB | 主要数据存储,需稳定 |
| Redis | 共享剩余 CPU | 300MB ~ 500MB | 高速缓存,可调优 |
| 系统 + Docker 开销 | – | 400MB ~ 600MB | 留给 OS 和容器管理 |
✅ 总计:约 2GB 内存,2 核 CPU,留有余地避免 OOM。
⚙️ 二、Docker 资源限制设置(使用 docker run 或 docker-compose.yml)
方法 1:使用 docker run
# 启动 MySQL
docker run -d
--name mysql
--cpus="1.0"
--memory="1100m"
-e MYSQL_ROOT_PASSWORD=yourpassword
-v mysql-data:/var/lib/mysql
mysql:8.0
# 启动 Redis
docker run -d
--name redis
--cpus="0.5"
--memory="500m"
-v redis-data:/data
redis:7-alpine
redis-server --maxmemory 400mb --maxmemory-policy allkeys-lru
方法 2:使用 docker-compose.yml
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: yourpassword
volumes:
- mysql-data:/var/lib/mysql
ports:
- "3306:3306"
deploy:
resources:
limits:
cpus: '1.0'
memory: 1100M
restart: unless-stopped
redis:
image: redis:7-alpine
container_name: redis
command: redis-server --maxmemory 400mb --maxmemory-policy allkeys-lru
volumes:
- redis-data:/data
ports:
- "6379:6379"
deploy:
resources:
limits:
cpus: '0.5'
memory: 500M
restart: unless-stopped
volumes:
mysql-data:
redis-data:
🔔 注意:
deploy.resources在docker-compose中需要使用docker compose up(新版),旧版docker-compose可能不支持,可改用mem_limit和cpuset等字段。
🛠️ 三、关键优化配置
1. MySQL 优化(my.cnf 配置挂载)
为节省内存,禁用不必要的功能:
[mysqld]
skip-name-resolve
innodb_buffer_pool_size = 512M
key_buffer_size = 32M
max_connections = 50
query_cache_type = 0
query_cache_size = 0
table_open_cache = 200
tmp_table_size = 32M
max_heap_table_size = 32M
performance_schema = off
挂载到容器:
-v ./my.cnf:/etc/mysql/conf.d/my.cnf
2. Redis 优化
强制设置内存上限和淘汰策略,防止内存溢出:
--maxmemory 400mb --maxmemory-policy allkeys-lru
allkeys-lru:当内存满时,淘汰最近最少使用的 key。- 若数据可丢弃,也可用
volatile-lru(只对设置了过期时间的 key 生效)。
📊 四、监控与调优
-
查看资源使用情况
docker stats -
避免 swap 使用
# 查看 swap 使用 free -h建议关闭 swap 或限制使用,防止卡顿。
-
日志监控
- MySQL 错误日志:检查是否因内存不足重启
- Redis 日志:关注
evicted_keys是否频繁
✅ 五、其他建议
- 不要在同一台机器部署应用服务(如 Node.js/PHP),除非非常轻量。
- 使用
alpine版本镜像(如redis:alpine)减少基础开销。 - 定期备份数据库,防止 OOM 导致数据损坏。
- 如非必要,关闭 MySQL 的 performance_schema、event_scheduler 等。
🚫 六、常见错误避免
- ❌ 不设内存限制 → 容器吃光内存,系统 kill 进程
- ❌
innodb_buffer_pool_size设置过大(如 >1G)→ MySQL 启动失败或系统卡死 - ❌ Redis 不设
maxmemory→ 内存耗尽触发 OOM killer
✅ 总结
在 2核2G 环境下,推荐配置:
- MySQL:1核 CPU,1GB 内存,优化配置,
innodb_buffer_pool_size=512M - Redis:共享 CPU,500MB 内存,设置
maxmemory=400mb+ LRU 策略 - 使用 Docker 资源限制 + 合理配置文件,确保系统稳定运行
这样可以在有限资源下实现基本可用的后端服务组合。如负载增长,建议升级配置或拆分服务。
PHPWP博客