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

✔ 可直接用于生产或教学

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


相关推荐
PGCCC2 小时前
通知:中国PostgreSQL培训认证 2026年度开班计划
数据库·postgresql
ACMer_CTGU2 小时前
解决报错curl: (35) OpenSSL SSL_connect: 连接被对方重设 in connection to download.docker.com:443
网络协议·docker·ssl
\xin2 小时前
SQL 注入、文件上传绕过、MySQL UDF 提权、SUID 提权、Docker 逃逸,以及 APT 持久化技术渗透测试全流程第二次思路
sql·mysql·docker·容器·渗透测试·json·漏洞
羑悻的小杀马特2 小时前
零成本神器组合:用Docker+Uptime Kuma+cpolar打造永不掉线的远程监控系统!
运维·人工智能·docker·容器
禁默2 小时前
Portainer:让 Docker 管理变简单,用cpolar突破局域网后协作更轻松
java·docker·容器·cpolar
StevenZeng学堂2 小时前
一文读懂K8S的PV和PVC以及实践攻略
运维·docker·云原生·容器·kubernetes·云计算·go
Bruce-li__2 小时前
2025保姆级Docker教程------一篇学会使用docker
运维·docker·容器
踢足球09292 小时前
寒假打卡:2026-01-23
数据库·sql
冉冰学姐2 小时前
SSM药店管理系统1m48u(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·计算机毕业设计·ssm 框架应用·药店管理系统