两套完整 docker-compose:测试环境 MySQL8 / 生产环境 MySQL8

区分核心差异:资源限制、日志策略、持久化、网络、备份、安全、性能参数 统一使用官方 mysql:8.0 镜像,可自行指定精确小版本如 mysql:8.0.40

一、测试环境 docker-compose.test.yml(本地开发/测试服务器)

特点

  1. 资源宽松,无严格限制,方便调试
  2. 对外直接映射端口,本地客户端可直连
  3. 数据持久化但支持一键清空
  4. 日志输出控制台,方便看SQL报错
  5. 简单弱密码,初始化测试库
  6. 不做高可用、不限制连接数
  7. 配置宽松,慢查询日志开启用于调试

目录结构

  1. mysql-test/
  2. ├── docker-compose.test.yml
  3. ├── conf/
  4. │ └── my.cnf # 测试专用配置
  5. ├── init/
  6. │ └── init.sql # 自动建库建表脚本
  7. └── data/ # 数据持久化目录
  8. └── .env # 环境配置文件

安装&.env

  1. apt -y install docker-compose # 1.29.2-1
  2. # 当前29服务器的docker版本是Docker version 29.6.1, build 8900f1d
  3. 新建 .env 文件,直接写原始密码不用转义:
  4. MYSQL_ROOT_PWD=xxx
  5. MYSQL_DATABASE=xxx
  6. MYSQL_USER=xxx
  7. MYSQL_USER_PWD=xxx

1. docker-compose.test.yml

  1. version: "3.8"
  2. services:
  3. mysql-test:
  4. image: mysql:8.0.40
  5. env_file: .env
  6. container_name: mysql8-test
  7. # 开机重启策略
  8. restart: unless-stopped
  9. # 端口映射 宿主机:容器
  10. ports:
  11. - "23309:3306"
  12. # 环境变量初始化
  13. environment:
  14. TZ: Asia/Shanghai
  15. MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PWD}
  16. MYSQL_DATABASE: ${MYSQL_DATABASE}
  17. MYSQL_USER: ${MYSQL_USER}
  18. MYSQL_PASSWORD: ${MYSQL_USER_PWD}
  19. # 挂载配置、初始化脚本、数据卷
  20. volumes:
  21. - ./conf/my.cnf:/etc/mysql/conf.d/my.cnf
  22. - ./init:/docker-entrypoint-initdb.d
  23. - ./data:/var/lib/mysql
  24. # 测试环境资源限制宽松
  25. deploy:
  26. resources:
  27. limits:
  28. cpus: "1.5"
  29. memory: 2G
  30. # 网络(简单桥接)
  31. networks:
  32. - test-net
  33. networks:
  34. test-net:
  35. driver: bridge

2. conf/my.cnf 测试配置

  1. [mysqld]
  2. # 字符集
  3. character-set-server=utf8mb4
  4. collation-server=utf8mb4_unicode_ci
  5. # 时区
  6. default-time_zone = '+8:00'
  7. # 连接数(测试放大)
  8. max_connections = 500
  9. # 慢查询日志 调试用
  10. slow_query_log = ON
  11. slow_query_log_file = /var/lib/mysql/slow.log
  12. long_query_time = 1
  13. # binlog 测试可关闭提升速度
  14. skip-log-bin
  15. # 缓冲池 1G内存分配300M
  16. innodb_buffer_pool_size = 300M
  17. innodb_log_file_size = 128M
  18. # 兼容客户端
  19. default_authentication_plugin=mysql_native_password
  20. [mysql]
  21. default-character-set=utf8mb4

3. init/init.sql 示例初始化

  1. CREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARACTER SET utf8mb4;
  2. USE test_db;
  3. CREATE TABLE IF NOT EXISTS demo(
  4. id INT PRIMARY KEY AUTO_INCREMENT,
  5. name VARCHAR(50) NOT NULL
  6. );
  7. GRANT ALL ON test_db.* TO 'test_user'@'%';
  8. FLUSH PRIVILEGES;

测试环境启停命令

  1. # 启动
  2. docker-compose -f docker-compose.test.yml up -d
  3. # 停止旧容器
  4. docker-compose -f docker-compose.test.yml down
  5. # 重新后台启动
  6. docker-compose -f docker-compose.test.yml up -d
  7. # 查看日志
  8. docker-compose -f docker-compose.test.yml logs -f mysql-test
  9. # 销毁并清空所有数据(重置测试环境)
  10. docker-compose -f docker-compose.test.yml down -v
  11. 如果之前启动过容器,./data 里面生成了 mysql 库文件,容器判定 “已初始化完成”,直接忽略 init 脚本。
  12. # 停止并删除数据卷/本地data目录
  13. docker-compose -f docker-compose.test.yml down -v
  14. # 删除本地data文件夹
  15. rm -rf ./data
  16. # 重新启动,这次会执行init.sql
  17. docker-compose -f docker-compose.test.yml up -d

导入sql数据库数据

  1. docker exec -it 0b90 bash

二、生产环境 docker-compose.prod.yml(线上正式服务)

生产关键改动点

  1. 不对外暴露端口,仅容器内网互通,禁止公网直连数据库
  2. 严格资源限制,防止MySQL吃光宿主机内存
  3. 开启binlog用于主从/备份,优化redo/undo日志
  4. 强密码、严格权限、关闭弱认证
  5. 日志持久化到文件,轮转策略
  6. 数据目录挂载宿主机高性能磁盘,权限管控
  7. 关闭调试日志,优化innodb性能参数
  8. 重启策略更严谨,增加健康检查自动自愈
  9. 网络隔离,仅内部服务网段访问

目录结构

  1. mysql-prod/
  2. ├── docker-compose.prod.yml
  3. ├── conf/
  4. │ └── my.cnf
  5. ├── logs/ # 生产日志单独挂载
  6. └── data/ # 独立高速磁盘挂载

1. docker-compose.prod.yml

  1. version: "3.8"
  2. services:
  3. mysql-prod:
  4. image: mysql:8.0.40
  5. container_name: mysql8-prod
  6. restart: always
  7. # 生产禁止端口映射到宿主机!只能内网容器访问
  8. # ports: 删掉,外部不能直连数据库
  9. # 健康检查,容器异常自动重启
  10. healthcheck:
  11. test: ["CMD", "mysqladmin", "ping", "-uroot", "-p${MYSQL_ROOT_PASSWORD}"]
  12. interval: 10s
  13. timeout: 5s
  14. retries: 3
  15. start_period: 30s
  16. environment:
  17. TZ: Asia/Shanghai
  18. # 生产务必使用复杂密码,不要硬编码,可改用 .env 文件读取
  19. MYSQL_ROOT_PASSWORD: "Prod@Mysql#2026_Secret"
  20. MYSQL_DATABASE: business_db
  21. MYSQL_USER: biz_user
  22. MYSQL_PASSWORD: "Biz@Pass#666_Strong"
  23. # 挂载:配置、数据、日志分离
  24. volumes:
  25. - ./conf/my.cnf:/etc/mysql/conf.d/my.cnf:ro # 只读挂载配置防止篡改
  26. - ./data:/var/lib/mysql
  27. - ./logs:/var/log/mysql
  28. # 严格资源限制,根据服务器内存调整
  29. deploy:
  30. resources:
  31. limits:
  32. cpus: "4"
  33. memory: 6G
  34. reservations:
  35. cpus: "2"
  36. memory: 4G
  37. # 专属生产内网
  38. networks:
  39. prod-internal-net:
  40. ipv4_address: 172.28.0.10 # 固定内网IP,业务服务固定地址连接
  41. networks:
  42. prod-internal-net:
  43. driver: bridge
  44. ipam:
  45. config:
  46. - subnet: 172.28.0.0/16

2. conf/my.cnf 生产高性能安全配置

  1. [mysqld]
  2. # 基础字符集
  3. character-set-server=utf8mb4
  4. collation-server=utf8mb4_unicode_ci
  5. default-time_zone = '+8:00'
  6. # 连接控制
  7. max_connections = 1000
  8. wait_timeout = 600
  9. interactive_timeout = 600
  10. # Binlog 开启,用于备份、主从同步
  11. log_bin = mysql-bin
  12. binlog_format = ROW
  13. expire_logs_days = 7
  14. sync_binlog = 1
  15. # Innodb 生产核心调优(内存6G机器配置)
  16. innodb_buffer_pool_size = 4G
  17. innodb_log_file_size = 2G
  18. innodb_log_buffer_size = 64M
  19. innodb_flush_log_at_trx_commit = 1
  20. innodb_file_per_table = ON
  21. innodb_flush_method = O_DIRECT
  22. # 关闭调试慢日志,如需排查再临时开启
  23. slow_query_log = OFF
  24. # 安全:默认caching_sha2_password,禁用老旧native密码
  25. default_authentication_plugin=caching_sha2_password
  26. # 禁止本地文件导入导出,防安全漏洞
  27. secure-file-priv=/tmp
  28. # 表缓存
  29. table_open_cache = 2000
  30. [mysql]
  31. default-character-set=utf8mb4

生产启停命令

  1. # 后台启动
  2. docker-compose -f docker-compose.prod.yml up -d
  3. # 实时查看运行日志
  4. docker-compose -f docker-compose.prod.yml logs -f mysql-prod
  5. # 平滑停止(保留数据卷,不会删库)
  6. docker-compose -f docker-compose.prod.yml down
  7. # 危险:销毁容器+清空所有数据,生产禁止随便执行
  8. # docker-compose -f docker-compose.prod.yml down -v

三、生产环境额外最佳实践

  1. 密码不要写死在yml 新建 .env 文件存放密码,yml 中用 ${变量} 引用,.env 加入 .gitignore 禁止提交代码仓库

    1. # .env
    2. MYSQL_ROOT_PASSWORD=Prod@Mysql#2026_Secret
    3. MYSQL_PASSWORD=Biz@Pass#666_Strong

    compose 中直接读取:env_file: .env

  2. 数据目录挂载独立SSD磁盘 不要存在系统盘,挂载 /data/mysql-prod 到高速云盘/物理SSD

  3. 定时备份脚本 容器内定时 mysqldump 导出到宿主机挂载目录,保留7天备份

  4. 网络访问控制 业务服务放在同一个 prod-internal-net 网络,外部服务器不允许访问数据库容器IP

  5. 定期镜像更新 每月拉取新版本mysql镜像重建容器,修复安全漏洞,数据卷保留不丢失

四、测试 vs 生产核心区别总结

项目 测试环境 生产环境
端口 3306映射宿主机,本地可直连 不暴露端口,仅容器内网访问
资源 限制宽松,内存1G 严格预留+上限限制,匹配服务器配置
Binlog 默认关闭,提升测试速度 强制开启,用于备份/主从
日志 开启慢查询,输出控制台调试 关闭慢查询,日志落地文件
密码 简单弱密码 高强度复杂密码,建议.env管理
配置挂载 可读写 只读挂载:ro,防止篡改
销毁 down -v 一键清空数据 禁止 -v,保留业务数据
网络 通用桥接 独立隔离内网,固定容器IP
认证插件 mysql_native_password兼容旧客户端 安全caching_sha2_password