对于个人开发、测试或低负载应用,默认配置的 MySQL 8 在 Docker 中会占用过多内存(通常在 300MB-500MB 或更高)。通过一份简单的自定义配置文件,我们可以轻松地将其内存占用降低到 100MB 以下。
核心原理
MySQL 8 的内存消耗主要来自两个方面:
- InnoDB 缓冲池 (innodb_buffer_pool_size): 这是内存大户,用于缓存数据和索引,默认值为 128MB。对于低负载场景,这个值过大了。
- 性能概览 (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 的内存占用,使其更适合资源有限的开发和测试环境。