Docker 安装 MySQL 8.0 是日常运维中最常用的方式之一,核心是镜像拉取+持久化配置+适配 MySQL 8.0 特性(如密码策略、认证插件、字符集等),以下是通用且避坑的详细步骤,适配 Linux(CentOS/Debian/Ubuntu)系统,Windows/macOS 仅需微调目录路径即可。
一、前置准备:检查/安装 Docker
确保服务器已安装 Docker(推荐 20.10+ 版本),未安装则执行以下命令快速安装:
bash
# 通用 Linux 一键安装 Docker(阿里云镜像,速度快)
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 启动 Docker 并设置开机自启
systemctl start docker && systemctl enable docker
# 验证 Docker 安装
docker -v # 输出版本号即成功(如 Docker version 20.10.24, build 297e128)
二、拉取 MySQL 8.0 镜像(推荐指定具体版本)
避免拉取 latest 标签导致版本兼容问题,推荐指定稳定版本(如 8.0.36):
bash
# 拉取 MySQL 8.0.36(可替换为最新 8.0.x 版本,如 8.0.37)
docker pull mysql:8.0.36
# 验证镜像拉取成功
docker images | grep mysql # 输出 mysql:8.0.36 即成功
三、创建持久化目录(核心:避免容器删除丢失数据)
MySQL 的数据、配置、日志需挂载到宿主机目录,否则容器删除后数据全部丢失:
bash
# 创建目录(自定义路径,如 /data/mysql)
mkdir -p /data/mysql/{data,conf,logs}
# 赋予权限(避免容器读写权限不足,Linux 需执行)
chmod -R 777 /data/mysql
chown -R root:root /data/mysql
Windows/macOS 无需赋权,直接创建目录即可(如
D:\docker\mysql\data)。
四、启动 MySQL 8.0 容器(核心命令)
MySQL 8.0 有严格的密码策略(需大小写+数字+特殊字符),且默认认证插件可能导致旧客户端连接失败,启动命令需适配这些特性:
bash
docker run -d \
--name mysql8.0 \ # 容器名称(自定义,如 mysql80)
--restart always \ # 开机自启(容器崩溃/服务器重启后自动运行)
-p 3306:3306 \ # 端口映射(宿主机:容器,若3306被占用可改如 3307:3306)
-v /data/mysql/data:/var/lib/mysql \ # 数据持久化(核心)
-v /data/mysql/conf:/etc/mysql/conf.d \ # 自定义配置文件挂载
-v /data/mysql/logs:/var/log/mysql \ # 日志持久化
-e MYSQL_ROOT_PASSWORD=MySql@123456 \ # root密码(必须复杂:大小写+数字+特殊字符)
-e TZ=Asia/Shanghai \ # 时区(解决时间差/乱码问题)
-e MYSQL_DEFAULT_CHARACTER_SET=utf8mb4 \ # 默认字符集(兼容emoji)
mysql:8.0.36 \ # 镜像版本(与拉取的一致)
--default-authentication-plugin=mysql_native_password \ # 兼容旧客户端(如Navicat 11)
--character-set-server=utf8mb4 \ # 服务端字符集
--collation-server=utf8mb4_unicode_ci \ # 字符集排序规则
--lower_case_table_names=1 # 表名忽略大小写(可选,适配Windows习惯)
五、验证安装是否成功
1. 检查容器运行状态
bash
docker ps | grep mysql8.0
# 输出如下表示正常(STATUS 为 Up):
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# xxxxxxxx mysql:8.0.36 "docker-entrypoint.s..." 10 seconds ago Up 9 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql8.0
2. 进入容器登录 MySQL
bash
# 进入 MySQL 容器
docker exec -it mysql8.0 /bin/bash
# 登录 MySQL(输入启动命令中配置的密码 MySql@123456)
mysql -uroot -p
登录成功后,执行 show databases; 验证,输出系统库(mysql/information_schema/performance_schema)即正常:
sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
3. 外部客户端连接(Navicat/DBeaver 等)
在本地/内网机器上,用数据库客户端连接:
- 主机:服务器 IP(本地 Docker 填
127.0.0.1) - 端口:3306(若修改过则填新端口,如 3307)
- 用户名:root
- 密码:MySql@123456
能连接并创建库/表即部署完成。
六、常用操作(运维必备)
bash
# 重启 MySQL 容器
docker restart mysql8.0
# 停止 MySQL 容器
docker stop mysql8.0
# 查看 MySQL 启动日志(排查问题用)
docker logs -f mysql8.0
# 备份 MySQL 数据(核心:备份挂载的 data 目录)
cp -r /data/mysql/data /data/mysql/data_backup_$(date +%Y%m%d)
# 删除 MySQL 容器(数据已持久化,删除后可重新启动)
docker stop mysql8.0 && docker rm mysql8.0
# 重新启动容器(仅删除容器时用,镜像仍在)
docker run -d \
--name mysql8.0 \
--restart always \
-p 3306:3306 \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/conf:/etc/mysql/conf.d \
-v /data/mysql/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=MySql@123456 \
-e TZ=Asia/Shanghai \
mysql:8.0.36 \
--default-authentication-plugin=mysql_native_password
七、关键配置说明(避坑重点)
-
密码策略 :MySQL 8.0 要求
root密码至少 8 位,且需包含「大小写字母+数字+特殊字符」(如MySql@2025!),密码过简单会导致容器启动失败(日志提示ERROR: Database initialization failed)。 -
端口冲突 :若 3306 被占用,修改端口映射(如
-p 3307:3306),外部连接时用 3307 端口。 -
防火墙/安全组 :Linux 需开放 3306 端口(云服务器需配置安全组):
bash# CentOS 7/8 firewall-cmd --add-port=3306/tcp --permanent && firewall-cmd --reload # Ubuntu/Debian ufw allow 3306 && ufw reload -
字符集 :
utf8mb4是 MySQL 8.0 推荐字符集,兼容 emoji 表情,避免中文乱码;若用utf8会导致 emoji 插入失败。 -
认证插件 :
--default-authentication-plugin=mysql_native_password解决旧客户端(如 Navicat 11、Python2 的 MySQLdb)无法连接 MySQL 8.0 的问题(MySQL 8.0 默认插件为caching_sha2_password)。
八、常见问题排查
1. 容器启动失败(STATUS 为 Exited (1))
-
原因:密码过简单、目录权限不足、SELinux 未关闭(CentOS)。
-
解决 :
bash# 查看报错日志 docker logs mysql8.0 # 示例:密码过简单则重新设置复杂密码,删除失败容器后重启 docker rm mysql8.0 # 重新执行启动命令(替换为复杂密码)
2. 客户端连接提示「认证失败」
-
原因:默认认证插件不兼容旧客户端。
-
解决 :进入容器修改 root 认证插件:
bashdocker exec -it mysql8.0 /bin/bash mysql -uroot -p ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'MySql@123456'; FLUSH PRIVILEGES;
3. 中文乱码/时间不一致
-
解决 :启动命令中已配置
TZ=Asia/Shanghai和utf8mb4,若仍乱码,在自定义配置文件中补充:bash# 创建自定义配置文件 echo -e "[mysqld]\ninit_connect='SET NAMES utf8mb4'\nserver_timezone = Asia/Shanghai" > /data/mysql/conf/my.cnf # 重启容器 docker restart mysql8.0
总结
Docker 安装 MySQL 8.0 的核心是「镜像拉取+持久化挂载+适配 8.0 特性」,重点关注密码复杂度、字符集、认证插件和时区配置,避免踩坑。只要保证目录权限正确、端口开放、密码合规,即可快速部署稳定的 MySQL 8.0 实例。