基于Docker运行的MySQL8如何降低内存占用

基于Docker运行MySQL 8时,如何通过自定义配置文件关闭性能概览、缩减InnoDB缓冲池等方式,将内存占用降至100MB以下,适用于开发和低负载场景。

对于个人开发、测试或低负载应用,默认配置的 MySQL 8 在 Docker 中会占用过多内存(通常在 300MB-500MB 或更高)。通过一份简单的自定义配置文件,我们可以轻松地将其内存占用降低到 100MB 以下。

核心原理

MySQL 8 的内存消耗主要来自两个方面:

  1. InnoDB 缓冲池 (innodb_buffer_pool_size): 这是内存大户,用于缓存数据和索引,默认值为 128MB。对于低负载场景,这个值过大了。
  2. 性能概览 (Performance Schema): MySQL 8 默认开启的性能监控工具,它会预分配大量内存,即便在空闲时也是如此。关闭它可以立即释放可观的内存。 我们的优化策略就是:关闭性能概览,并大幅缩减 InnoDB 缓冲池大小。

操作步骤

第一步:创建自定义配置文件

在你的 docker-compose.yml 文件所在的目录旁边,创建一个用于存放 MySQL 配置的文件夹,例如 mysql-config。

my-project/
├── docker-compose.yml
└── mysql-config/        <-- 新建这个目录

在 mysql-config 目录中,新建一个配置文件,命名为 low-memory.cnf,并填入以下内容:

[mysqld]
# ==============================================================================
# 核心优化:这两项是降低内存占用的关键
# ==============================================================================

# 1. 禁用性能概览 (Performance Schema),可节省大量基础内存
performance_schema = OFF

# 2. 缩减 InnoDB 缓冲池
# 默认 128M,对于请求极少的场景,32M 甚至 16M 足够。可按需调整。
innodb_buffer_pool_size = 32M

# ==============================================================================
# 推荐的其他低内存优化项
# ==============================================================================

# 减少 InnoDB 日志文件大小
innodb_log_file_size = 16M

# 限制最大连接数,防止过多连接消耗内存
max_connections = 50

# 减少表缓存数量
table_open_cache = 200
table_definition_cache = 200

# MyISAM 引擎的索引缓冲区,保留一个较小的值即可
key_buffer_size = 8M

第二步:修改 docker-compose.yml 文件

编辑你的 docker-compose.yml 文件,为 mysql 服务添加 volumes 配置,将我们刚才创建的 low-memory.cnf 文件挂载到容器的配置目录中。

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: my_mysql_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_strong_password
      MYSQL_DATABASE: my_app_db
    ports:
      - "3306:3306"
    volumes:
      # 1. 挂载自定义配置文件
      - ./mysql-config/low-memory.cnf:/etc/mysql/conf.d/low-memory.cnf

      # 2. 挂载数据目录,确保数据持久化
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:
    # 使用 docker managed volume 来持久化数据

关键解释:

  • ./mysql-config/low-memory.cnf:/etc/mysql/conf.d/low-memory.cnf: 这一行将你本地的配置文件映射到了容器内部。MySQL 容器启动时,会自动加载 /etc/mysql/conf.d/ 目录下的所有 .cnf 文件,从而让我们的配置生效。
  • mysql_data:/var/lib/mysql: 这是数据持久化的最佳实践,确保你的数据库内容在容器删除重建后依然存在。

第三步:重启容器并验证效果

在 docker-compose.yml 文件所在的目录下,执行以下命令来重新创建并启动 MySQL 容器,使其加载新配置。

docker-compose up -d

容器启动后,你可以通过 docker stats 命令来查看内存占用情况。

# 查看名为 my_mysql_db 的容器资源占用
docker stats my_mysql_db

你会看到 MEM USAGE 一栏的内存占用显著降低,通常会从几百 MB 下降到几十 MB。 总结:通过创建一个简单的配置文件并将其挂载到容器中,我们就能有效控制 Docker 中 MySQL 8 的内存占用,使其更适合资源有限的开发和测试环境。