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

✔ 可直接用于生产或教学

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


相关推荐
疯狂成瘾者4 小时前
Chroma向量数据库
开发语言·数据库·c#
coppher4 小时前
Ubuntu 22.04 amd64 离线安装 Docker 完整教程
linux·docker
ayt0074 小时前
Netty AbstractNioChannel源码深度剖析:NIO Channel的抽象实现
java·数据库·网络协议·安全·nio
荒川之神5 小时前
Oracle 数据仓库星座模型(Galaxy Model)设计原则
数据库·数据仓库·oracle
杰克尼5 小时前
redis(day03-商户查询缓存)
数据库·redis·缓存
枕布响丸辣5 小时前
Python 操作 MySQL 数据库从入门到精通
数据库·python·mysql
zxrhhm5 小时前
SQLServer限制特定数据库的CPU使用率,确保关键业务系统有足够的资源
数据库·sqlserver
刘~浪地球5 小时前
Redis 从入门到精通(十三):哨兵与集群
数据库·redis·缓存
Java开发追求者6 小时前
windows卸载mysql教程
mysql·mysql卸载
dyyshb6 小时前
PostgreSQL 终极兜底方案
数据库·postgresql