广州总部电话:020-85564311
广州总部电话:020-85564311
20年
互联网应用服务商
请输入搜索关键词
知识库 知识库

优网知识库

探索行业前沿,共享知识宝库

Docker容器化部署Mysql

发布日期:2025-08-09 17:22:15 浏览次数: 814 来源:沉浸的行吟
推荐语
MySQL容器化部署指南:开发测试环境下的最佳实践配置,包含数据持久化、日志管理等关键设置。

核心内容:
1. MySQL Docker容器化部署的完整Compose文件详解
2. 数据挂载、日志处理及时区修正等关键配置项说明
3. 配套my.cnf配置文件的优化建议与注意事项
小优 网站建设顾问
专业来源于二十年的积累,用心让我们做到更好!

 

虽然不建议在生产环境中用容器来部署数据库服务,但是在开发测试环境以及小型项目里也有不少以容器化运维数据库的场景。
以下是一份完整的MySQL Docker容器化部署Compose文件,包含数据挂载、日志处理及时区修正等最佳实践配置:

docker-compose.yml 完整配置

version: "3.9"
services:
  mysql:
    container_name: mysql
    image: mysql:8.0.33  # 使用稳定的MySQL 8版本
    restart: unless-stopped
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=your_strong_password  # 请修改为强密码
      - MYSQL_DATABASE=your_database             # 可选:初始化数据库
      - MYSQL_USER=your_user                     # 可选:初始化用户
      - MYSQL_PASSWORD=your_user_password        # 可选:用户密码
      - TZ=Asia/Shanghai                        # 修正容器时区
    volumes:
      - ./data:/var/lib/mysql        # 挂载数据目录(含Binlog)
      - ./conf/my.cnf:/etc/mysql/my.cnf  # 挂载配置文件
      - ./logs:/var/log/mysql       # 挂载日志目录
    healthcheck:
      test: ["CMD""mysqladmin""ping""-h""localhost""-u""root""-p${MYSQL_ROOT_PASSWORD}"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 20s
    networks:
      - mysql-network

networks:
  mysql-network:
    driver: bridge

配套文件说明

1. 配置文件 conf/my.cnf

[mysqld]
# 基础配置
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
log-error = /var/log/mysql/error.log
pid-file = /var/run/mysqld/mysqld.pid

# 时区配置(双重保障)
default-time-zone = '+08:00'

# Binlog配置(生产环境建议开启)
log_bin = mysql-bin
binlog_format = ROW
server_id = 1
binlog_expire_logs_seconds = 604800
max_binlog_size = 100M

# 性能优化(根据服务器配置调整)
innodb_buffer_pool_size = 128M
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1

# 安全配置
skip_name_resolve = ON

[client]
#mysql客户端需要这个
socket = /var/lib/mysql/mysql.sock

2. 初始化脚本(可选)

在 init 目录下创建SQL脚本,如 create_database.sql

CREATE DATABASE IF NOT EXISTS your_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_user_password';
GRANT ALL PRIVILEGES ON your_database.* TO 'your_user'@'%';
FLUSH PRIVILEGES;

并在Compose文件中添加挂载:

volumes:
  - ./init:/docker-entrypoint-initdb.d  # 初始化脚本目录

部署与验证步骤

1. 准备目录结构

mkdir -p data conf logs init  # 若使用初始化脚本
touch conf/my.cnf

2. 启动容器

docker compose up -d

3. 验证时区

docker exec -it mysql date  # 应显示正确的本地时间
docker exec -it mysql mysql -u root -p -e "SELECT NOW();"

4. 验证数据挂载

# 查看数据目录
ls -la data
# 查看日志文件
ls -la logs/mysql/error.log

5. 验证Binlog(若配置)

docker exec -it mysql mysql -u root -p -e "SHOW VARIABLES LIKE 'log_bin';"
# 输出应为 ON

关键配置说明

1. 数据与日志挂载

  • • ./data:/var/lib/mysql:存储数据文件、Binlog、InnoDB日志等,确保容器重启后数据不丢失。
  • • ./logs:/var/log/mysql:单独挂载日志目录,便于日志分析和清理。
  • • ./conf/my.cnf:/etc/mysql/my.cnf:自定义配置文件,支持时区、Binlog等高级配置。

2. 时区解决方案

  • • 通过环境变量 TZ=Asia/Shanghai 设置容器时区。
  • • 在 my.cnf 中添加 default-time-zone='+08:00' 双重保障,确保MySQL服务时区与系统一致。

3. 生产环境优化

  • • 健康检查:通过mysqladmin ping实时监控服务状态。
  • • 安全配置skip_name_resolve避免DNS解析延迟,utf8mb4支持Emoji等特殊字符。
  • • 性能参数innodb_buffer_pool_size根据服务器内存调整(建议为物理内存的50%-70%)。

注意事项

  1. 1. 密码安全:务必修改MYSQL_ROOT_PASSWORD为强密码,避免使用默认值。
  2. 2. 存储权限:确保宿主机挂载目录有正确的读写权限(Linux下建议chmod 777 data logs)。
  3. 3. 备份策略:定期备份data目录,结合Binlog实现增量恢复。
  4. 4. 端口映射:生产环境建议通过Nginx代理或防火墙限制3306端口访问。

通过此配置,可实现MySQL容器的稳定部署,满足数据持久化、日志管理及时区一致性需求。


注意:MySQL 8.0 后expire_logs_days 不再被识别

在 MySQL 8.0 及以上版本 中,expire_logs_days 已经被 废弃,取而代之的是 binlog_expire_logs_seconds,用来设置二进制日志的过期时间(单位:秒)。

问题分析

  1. 1. 参数废弃
    MySQL 8.0 后,expire_logs_days 不再被识别,必须用  binlog_expire_logs_seconds 替代。
    MySQL 8.4.5就会触发这个错误。
  2. 2. 配置冲突
    旧参数 expire_logs_days 留在配置文件里,MySQL 不认识,启动时直接报错并退出。

解决方案

把配置文件里的 expire_logs_days = 7 替换成 binlog_expire_logs_seconds,按需求设置过期时间(比如 7 天 = 604800 秒 )。

修改后的 my.cnf 关键配置示例:

[mysqld]
# Binlog 配置(生产环境建议开启)
log_bin = mysql-bin
binlog_format = ROW
server_id = 1
# 替换成新参数,7 天 = 604800 秒
binlog_expire_logs_seconds = 604800  
max_binlog_size = 100M

完整修改步骤
1.编辑 my.cnf:
找到配置文件里的 expire_logs_days = 7,替换成:

SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';

2.重启 MySQL 容器:
修改完配置后,必须重启容器让新配置生效:

docker compose down
docker compose up -d

3.验证是否生效:
进入容器,用 SQL 查看参数是否正确加载:

docker exec -it mysql mysql -u root -p

4.登录后执行:

SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';

如果返回 604800,说明配置成功。

额外注意事项
版本兼容性:
MySQL 8.0 及以上版本,必须用 binlog_expire_logs_seconds。
如果是 MySQL 5.7 及以下,继续用 expire_logs_days 没问题。
时间换算:
binlog_expire_logs_seconds 单位是秒,常用换算:
1 天 = 86400 秒
7 天 = 604800 秒
30 天 = 2592000 秒
其他废弃参数:
从日志里还看到 binlog_format 有警告('binlog_format' is deprecated),虽然当前版本还能用,但未来也可能被弃用。如果想彻底解决,建议关注官方文档,替换成更推荐的配置(比如 binlog_row_format 等细粒度参数)。
这样修改后,unknown variable 'expire_logs_days=7' 的错误就会消失,二进制日志的自动清理也能正常工作了。>)

 


优网科技,优秀企业首选的互联网供应服务商

优网科技秉承"专业团队、品质服务" 的经营理念,诚信务实的服务了近万家客户,成为众多世界500强、集团和上市公司的长期合作伙伴!

优网科技成立于2001年,擅长网站建设、网站与各类业务系统深度整合,致力于提供完善的企业互联网解决方案。优网科技提供PC端网站建设(品牌展示型、官方门户型、营销商务型、电子商务型、信息门户型、微信小程序定制开发、移动端应用(手机站APP开发)、微信定制开发(微信官网、微信商城、企业微信)等一系列互联网应用服务。


我要投稿

姓名

文章链接

提交即表示你已阅读并同意《个人信息保护声明》

专属顾问 专属顾问
扫码咨询您的优网专属顾问!
专属顾问
马上咨询
联系专属顾问
联系专属顾问
联系专属顾问
扫一扫马上咨询
扫一扫马上咨询

扫一扫马上咨询

和我们在线交谈!