Docker Compose 部署 MySQL 5.7(生产级实践方案)

前言:

使用docker compose 详细部署mysql5.7版本数据库详细步骤
环境:Linux Server + Docker + Docker Compose

MySQL 版本:5.7.44

适用场景:测试 / 生产 / 学习 / 云服务器


一、为什么选择 MySQL 5.7?

虽然 MySQL 8.0 已经成为主流,但在大量存量系统中

  • MySQL 5.7 依然是事实标准
  • 很多老项目 / 中间件 / ORM 对 5.7 更友好
  • 对稳定性要求高的系统仍大量使用 5.7

因此,掌握一套稳定、规范的 MySQL 5.7 Docker 部署方案仍然非常有价值


二、部署目标

本次部署目标如下:

  • 使用 Docker Compose
  • MySQL 版本 5.7
  • 使用 相对路径 ./ 进行目录挂载
  • 数据、日志、配置全部可持久化
  • 配置方式符合 官方镜像推荐
  • 可长期运行,适合生产环境

三、目录结构设计(非常重要)

在服务器上创建如下目录结构:

text 复制代码
mysql5.7/
├── docker-compose.yml
├── data/            # MySQL 数据目录
├── log/             # MySQL 日志目录
└── config/
    └── my.cnf       # 自定义配置文件

创建目录:

bash 复制代码
mkdir -p mysql5.7/{data,log,config}
cd mysql5.7

如果希望自定义docker网络的话,可以运行:

go 复制代码
docker network create sql_default

计划使用默认的话,就删除下面内容中的关于networks配置的即可:

go 复制代码
networks:
      - sql_default

networks:
  sql_default:
    external: true

四、docker-compose.yml(最终推荐版)

yaml 复制代码
services:
  mysql:
    image: mysql:5.7
    container_name: mysql57
    restart: always
    ports:
      - "13306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: admin123456
    volumes:
      - ./data:/var/lib/mysql
      - ./log:/var/log/mysql
      - ./config:/etc/mysql/conf.d
      - /etc/localtime:/etc/localtime:ro
    command:
      [
        "--character-set-server=utf8mb4",
        "--collation-server=utf8mb4_unicode_ci"
      ]
    networks:
      - sql_default

networks:
  sql_default:
    external: true

说明几点关键设计:

  1. 不再使用 version: 字段

    Docker Compose v2 已废弃该字段,避免启动警告

  2. 配置目录挂载到 /etc/mysql/conf.d

    不覆盖官方默认配置,更安全、规范

  3. 使用 utf8mb4 作为默认字符集


五、MySQL 配置文件(config/my.cnf)

ini 复制代码
[mysqld]
port=3306
user=mysql
server-id=1
default-storage-engine=INNODB

# 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake

# 时区
default-time-zone='+8:00'

# 连接数
max_connections=500
max_connect_errors=1000

# InnoDB
innodb_buffer_pool_size=512M
innodb_log_file_size=256M
innodb_file_per_table=1
innodb_flush_log_at_trx_commit=1

# 日志
log-error=/var/log/mysql/error.log
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=2

# SQL 模式(5.7 推荐)
sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

如果服务器内存 ≥ 8G,可适当调大 innodb_buffer_pool_size


六、启动 MySQL 容器

bash 复制代码
docker compose up -d

首次启动会自动初始化数据库文件。


七、验证 MySQL 是否启动成功

查看日志:

bash 复制代码
docker logs mysql57

看到如下关键日志,说明初始化成功:

text 复制代码
MySQL init process done. Ready for start up.

八、连接 MySQL 验证

方式一:宿主机连接

bash 复制代码
mysql -h 127.0.0.1 -P 13306 -u root -p

方式二:容器内连接(推荐)

bash 复制代码
docker exec -it mysql57 mysql -uroot -p

输入密码:

复制代码
admin123456

能正常进入即表示部署完成。


九、常见问题说明

1️⃣ 时区 Warning 是否需要处理?

text 复制代码
Warning: Unable to load '/usr/share/zoneinfo/...'

这是 MySQL 官方镜像的常见警告,对业务无实质影响。

如需彻底消除,可额外挂载:

yaml 复制代码
- /usr/share/zoneinfo:/usr/share/zoneinfo:ro

2️⃣ data 目录能否删除?

  • ❌ 生产环境严禁随意删除
  • ✅ 仅在明确需要重建数据库时才删除

十、总结

✔ 本方案适用于 Linux 服务器

✔ 目录结构清晰、可维护

✔ 符合 MySQL 官方 Docker 镜像设计

✔ 可直接用于生产或教学

✔ 后续可扩展主从、备份、迁移


相关推荐
蜡笔小炘10 分钟前
LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误
服务器·数据库·lvs
韩立学长13 分钟前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
Re.不晚1 小时前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构
老邓计算机毕设1 小时前
SSM智慧社区信息化服务平台4v5hv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·智慧社区、·信息化平台
麦聪聊数据1 小时前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构
2301_790300961 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
m0_736919102 小时前
用Pandas处理时间序列数据(Time Series)
jvm·数据库·python
亓才孓2 小时前
[JDBC]PreparedStatement替代Statement
java·数据库
m0_466525292 小时前
绿盟科技风云卫AI安全能力平台成果重磅发布
大数据·数据库·人工智能·安全
爱学习的阿磊3 小时前
使用Fabric自动化你的部署流程
jvm·数据库·python