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 镜像设计

✔ 可直接用于生产或教学

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


相关推荐
LCG元3 小时前
ESP32-IDF 远程固件升级实战:HTTPS OTA + 双分区切换 + 自动回滚
数据库·redis·https
️学习的小王3 小时前
MySQL常用函数知识点总结
数据库·mysql·oracle
看浪的路人3 小时前
第6讲:SQL 解析器
java·开发语言·数据库
纵道软件3 小时前
使用 Docker 构建自定义 SeaTunnel Web 服务镜像
前端·docker·容器
吴老弟i3 小时前
Mac 本地安装 MySQL 学习指南
数据库
悦数图数据库4 小时前
千亿点边图谱建设,原生分布式图数据库如何避免单点瓶颈
数据库·分布式
万亿少女的梦1684 小时前
基于Spring Boot、Java与MySQL的同城宠物服务系统设计与实现
java·spring boot·mysql·系统设计·协同过滤
XLYcmy4 小时前
pdf论文处理:CSV输出模式
数据库·python·pycharm·pdf·论文·csv·dify
MC皮蛋侠客4 小时前
Redis 系列(十一):高可用(二)——Redis Cluster 集群
数据库·redis·bootstrap
zhanghaha13144 小时前
Python进阶教程:5_XML 解析 —— 新手完全指南
java·前端·数据库