Docker 快速部署 MySQL 8.0(2026最新实践)------ 一键启动 + 数据持久化 + 常见优化
文章最后更新时间:2026年1月
适用镜像:
mysql:8/mysql:8.0(官方镜像,当前最新 8.0.4x 系列)目标读者:开发、测试、运维小白 ~ 中级
MySQL 8.0 是目前企业最广泛使用的稳定版本之一,使用 Docker 部署可以做到环境一致、秒级启动、易于迁移 。本文提供最常用、最稳定的两种方式:单命令启动 + docker-compose 推荐写法,并附带常见问题解决方案。
一、准备工作(强烈建议先做)
-
确保 Docker 已安装并正常运行
bashdocker --version docker compose version # 或 docker-compose --version -
(可选但推荐)配置国内镜像加速(显著提升拉取速度)
编辑
/etc/docker/daemon.json(没有就新建):json{ "registry-mirrors": [ "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "https://mirror.ccs.tencentyun.com" ] }重启 Docker:
bashsudo systemctl daemon-reload sudo systemctl restart docker -
拉取最新 MySQL 8 镜像(推荐使用
mysql:8,自动跟踪 8.0 系列最新 patch)bashdocker pull mysql:8提示:
mysql:latest目前已指向 MySQL 9.x 创新版系列,不建议用于生产!请明确指定8或8.0。
二、最简单方式:一行命令启动(适合快速测试)
bash
docker run -d \
--name mysql8 \
-e MYSQL_ROOT_PASSWORD=Root@2026strong \
-p 3306:3306 \
-v mysql8-data:/var/lib/mysql \
--restart unless-stopped \
mysql:8
参数说明表
| 参数 | 作用说明 |
|---|---|
--name mysql8 |
容器命名,方便管理 |
-e MYSQL_ROOT_PASSWORD=... |
必填 root 初始密码(生产请用复杂密码) |
-p 3306:3306 |
主机:容器端口映射(可改为 13306:3306 避免冲突) |
-v mysql8-data:/var/lib/mysql |
数据卷,防止容器删除后数据丢失(命名卷方式,最推荐) |
--restart unless-stopped |
Docker 重启/主机重启时自动启动(生产必加) |
mysql:8 |
镜像标签(固定 8.0 系列最新版) |
快速验证是否启动成功
bash
docker ps | grep mysql8
docker logs -f mysql8
三、推荐生产方式:docker-compose.yml(一劳永逸)
新建目录(如 ~/mysql8),然后创建 docker-compose.yml:
yaml
version: '3.8'
services:
mysql:
image: mysql:8 # 或 mysql:8.0、mysql:8.0.40(指定精确版本)
container_name: mysql8
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: Root@2026strong # 必须修改!
MYSQL_DATABASE: appdb # 可选:自动创建数据库
MYSQL_USER: appuser # 可选:创建普通用户
MYSQL_PASSWORD: App@2026user # 可选:普通用户密码
TZ: Asia/Shanghai # 时区(强烈推荐)
ports:
- "3306:3306" # 可改为 "13306:3306"
volumes:
- mysql8-data:/var/lib/mysql # 数据持久化
- ./mysql-conf:/etc/mysql/conf.d # 自定义配置文件目录(可选)
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --default-authentication-plugin=mysql_native_password # 兼容老客户端
# - --innodb-buffer-pool-size=256M # 小内存机器可加这行
volumes:
mysql8-data:
启动:
bash
cd ~/mysql8
docker compose up -d
四、连接测试(三种常用方式)
-
容器内 mysql 客户端
bashdocker exec -it mysql8 mysql -uroot -p -
宿主机 mysql 客户端(需先安装 mysql-client)
bashmysql -h 127.0.0.1 -P 3306 -uroot -p -
Navicat / DBeaver / DataGrip 等图形化工具
主机:127.0.0.1 或 本机IP
端口:3306(或你映射的端口)
用户:root / appuser
密码:你设置的密码
五、常见问题 & 优化方案
| 问题 | 解决方案 |
|---|---|
| Navicat 等老客户端连接失败 | 加 --default-authentication-plugin=mysql_native_password 到 command |
| 中文乱码 | 确保 command 中有 utf8mb4 设置 + 客户端连接时指定 utf8mb4 |
| 内存占用过高(云服务器 1-2核) | 加 --innodb-buffer-pool-size=128M 或 256M |
| 想开启慢查询日志 | 挂载自定义 my.cnf,加入 slow_query_log=1 等参数 |
| 远程无法连接(云服务器) | 1. 安全组/防火墙放行 3306 端口 2. 执行 ALTER USER 'root'@'%' IDENTIFIED BY '密码'; |
| 数据目录权限问题 | 使用命名卷(mysql8-data)基本不会出现;如用绑定挂载需 chmod -R 777 |
六、扩展:自定义 my.cnf 示例(放在 ./mysql-conf/my.cnf)
ini
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password
lower_case_table_names=1 # Linux 下表名大小写不敏感
max_connections=500
innodb_buffer_pool_size=256M
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=1
然后在 compose 中挂载 - ./mysql-conf:/etc/mysql/conf.d
结语
使用 Docker 部署 MySQL 8.0 的核心就是:数据持久化 + 合理配置 + 自动重启 。
以上两种方式(单命令 / compose)已覆盖 95% 的日常场景,生产环境强烈推荐 docker-compose 方式,便于版本管理、备份、扩容。
有任何问题欢迎评论区留言~ 比如想加主从复制、读写分离、备份脚本等高级玩法,也可以继续讨论!
喜欢记得一键三连:点赞 + 收藏 + 关注,下篇见!