Skip to content

MySQL Docker 生产级部署配置指南

作者: ryan 发布于: 8/20/2025 更新于: 8/20/2025 字数: 0 字 阅读: 0 分钟

一、核心要求

  1. 数据持久化 - 容器销毁后数据保留
  2. 配置文件优化 - 性能与可靠性参数调优
  3. 安全加固 - 网络隔离与权限控制
  4. 监控维护 - 备份与资源监控方案

二、目录结构规划

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

五、安全加固措施

  1. 远程访问控制

    sql
    CREATE USER 'admin'@'%' IDENTIFIED BY 'AdminPass!456';
    GRANT SELECT,INSERT ON appdb.* TO 'admin'@'%';
    REVOKE SUPER ON *.* FROM 'admin'@'%';  # 限制高危权限
  2. 备份策略

    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/

六、监控与维护

  1. 慢查询分析

    bash
    # 使用pt-query-digest分析
    docker run -it --rm -v /mydata/mysql/logs:/logs percona-toolkit \
      pt-query-digest /logs/slow.log
  2. Prometheus监控项

    指标监控目标
    mysql_global_status_Threads_connected活跃连接数
    mysql_global_status_Innodb_buffer_pool_read_requests缓冲池命中率
    mysql_global_status_Slow_queries慢查询计数

附:灾备恢复流程

  1. 停止MySQL:docker stop mysql-prod
  2. 覆盖数据目录:rsync -av /backup/full/last_backup/ /mydata/mysql/data/
  3. 启动容器:docker start mysql-prod

七、参数调整参考表

场景关键参数生产建议值
高并发读写innodb_thread_concurrencyCPU核心数×2
SSD存储innodb_io_capacity10000-20000
内存>64GBinnodb_buffer_pool_instances8-16
频繁DDL操作lock_wait_timeout300(秒)

通过 docker exec -it mysql-prod mysql -e "SHOW GLOBAL STATUS" 实时校验配置效果

MySQL 8需额外执行:

sql
-- 解决认证插件兼容问题
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密码';