MySQL Docker 生产级部署配置指南
作者: ryan 发布于: 8/20/2025 更新于: 8/20/2025 字数: 0 字 阅读: 0 分钟
一、核心要求
- 数据持久化 - 容器销毁后数据保留
- 配置文件优化 - 性能与可靠性参数调优
- 安全加固 - 网络隔离与权限控制
- 监控维护 - 备份与资源监控方案
二、目录结构规划
bash
# 创建宿主机挂载目录(生产环境建议使用独立磁盘)
sudo mkdir -p /mydata/mysql/{data,conf,logs,backup}
目录 | 容器映射路径 | 作用 |
---|---|---|
/data | /var/lib/mysql | 数据库核心文件 (必须持久化) |
/conf | /etc/mysql/conf.d | 自定义配置文件 |
/logs | /var/log/mysql | 慢查询/错误日志 |
/backup | /backup | 备份存储目录 |
三、配置文件优化
文件路径/mydata/mysql/conf/my.cnf
ini
[mysqld]
# 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 性能优化 (根据服务器内存调整)
innodb_buffer_pool_size = 8G # 物理内存70-80%
innodb_log_file_size = 2G # 提高写入性能
max_connections = 1024 # 并发连接数
thread_cache_size = 100 # 线程池优化
skip-name-resolve = ON # 禁用DNS解析加速连接
# 数据可靠性
innodb_flush_log_at_trx_commit = 1 # ACID保障
sync_binlog = 1 # Binlog实时落盘
# 日志管理
slow_query_log = 1 # 启用慢查询日志
long_query_time = 2 # 记录超过2秒的查询
log-error = /var/log/mysql/error.log
四、Docker启动命令
bash
docker run -d --name mysql-prod \
--restart=always \ # 异常退出自动重启
--memory=16g --cpus=4 \ # 资源限制
--network=mysql-net \ # 网络隔离
-p 3306:3306 \ # 端口映射(建议内网)
# 持久化卷挂载
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql/conf.d \
-v /mydata/mysql/logs:/var/log/mysql \
-v /mydata/mysql/backup:/backup \
-v /etc/localtime:/etc/localtime:ro \ # 同步宿主机时区
# 安全配置
-e MYSQL_ROOT_PASSWORD='V3ry$tr0ngP@ss!' \ # 12位以上复杂度
-e MYSQL_USER=app_user \
-e MYSQL_PASSWORD='App@Pass123' \
# 镜像版本
mysql:8.0.36 \
# 启动参数
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
五、安全加固措施
远程访问控制
sqlCREATE USER 'admin'@'%' IDENTIFIED BY 'AdminPass!456'; GRANT SELECT,INSERT ON appdb.* TO 'admin'@'%'; REVOKE SUPER ON *.* FROM 'admin'@'%'; # 限制高危权限
备份策略
bash# 每日全量备份 (添加到cron) docker exec mysql-prod sh -c 'mysqldump -uroot -p$MYSQL_ROOT_PASSWORD --all-databases' | gzip > /backup/full/$(date +%F).sql.gz # 每小时增量备份 docker exec mysql-prod mysqladmin flush-logs && \ cp $(ls -d /mydata/mysql/data/binlog.* | tail -n1) /backup/incremental/
六、监控与维护
慢查询分析
bash# 使用pt-query-digest分析 docker run -it --rm -v /mydata/mysql/logs:/logs percona-toolkit \ pt-query-digest /logs/slow.log
Prometheus监控项
指标 监控目标 mysql_global_status_Threads_connected
活跃连接数 mysql_global_status_Innodb_buffer_pool_read_requests
缓冲池命中率 mysql_global_status_Slow_queries
慢查询计数
附:灾备恢复流程
- 停止MySQL:
docker stop mysql-prod
- 覆盖数据目录:
rsync -av /backup/full/last_backup/ /mydata/mysql/data/
- 启动容器:
docker start mysql-prod
七、参数调整参考表
场景 | 关键参数 | 生产建议值 |
---|---|---|
高并发读写 | innodb_thread_concurrency | CPU核心数×2 |
SSD存储 | innodb_io_capacity | 10000-20000 |
内存>64GB | innodb_buffer_pool_instances | 8-16 |
频繁DDL操作 | lock_wait_timeout | 300(秒) |
通过
docker exec -it mysql-prod mysql -e "SHOW GLOBAL STATUS"
实时校验配置效果
MySQL 8需额外执行:
sql
-- 解决认证插件兼容问题
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密码';