低配置服务器2核2G跑Docker容器时如何合理分配资源给MySQL和Redis?

在低配置服务器(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 rundocker-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.resourcesdocker-compose 中需要使用 docker compose up(新版),旧版 docker-compose 可能不支持,可改用 mem_limitcpuset 等字段。


🛠️ 三、关键优化配置

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 生效)。

📊 四、监控与调优

  1. 查看资源使用情况

    docker stats
  2. 避免 swap 使用

    # 查看 swap 使用
    free -h

    建议关闭 swap 或限制使用,防止卡顿。

  3. 日志监控

    • 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 资源限制 + 合理配置文件,确保系统稳定运行

这样可以在有限资源下实现基本可用的后端服务组合。如负载增长,建议升级配置或拆分服务。