Docker 安装 MySQL 8.0

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

七、关键配置说明(避坑重点)

  1. 密码策略 :MySQL 8.0 要求 root 密码至少 8 位,且需包含「大小写字母+数字+特殊字符」(如 MySql@2025!),密码过简单会导致容器启动失败(日志提示 ERROR: Database initialization failed)。

  2. 端口冲突 :若 3306 被占用,修改端口映射(如 -p 3307:3306),外部连接时用 3307 端口。

  3. 防火墙/安全组 :Linux 需开放 3306 端口(云服务器需配置安全组):

    bash 复制代码
    # CentOS 7/8
    firewall-cmd --add-port=3306/tcp --permanent && firewall-cmd --reload
    # Ubuntu/Debian
    ufw allow 3306 && ufw reload
  4. 字符集utf8mb4 是 MySQL 8.0 推荐字符集,兼容 emoji 表情,避免中文乱码;若用 utf8 会导致 emoji 插入失败。

  5. 认证插件--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 认证插件:

    bash 复制代码
    docker 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/Shanghaiutf8mb4,若仍乱码,在自定义配置文件中补充:

    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 实例。

相关推荐
花花无缺2 小时前
搞清‘’时区设置‘’以及Mysql的`DATETIME` 和 `TIMESTAMP`
java·mysql
·云扬·2 小时前
MySQL中count(*)深度解析与性能优化实践
数据库·mysql·性能优化
RustFS3 小时前
RustFS 如何实现对象存储的前端直传?
vue.js·docker·rust
摇滚侠3 小时前
40分钟的Docker实战攻略,一期视频精通Docker
运维·docker·容器
G_H_S_3_4 小时前
【网络运维】Docker网络:基础与实战
linux·运维·网络·docker
加藤不太惠4 小时前
docker简单了解使用
运维·docker·容器
悟空码字4 小时前
MySQL分库分表,从“一室一厅”到“豪华别墅区”的数据库升级之旅
java·后端·mysql
lkbhua莱克瓦244 小时前
基础-MySQL概述
java·开发语言·数据库·笔记·mysql
姓蔡小朋友4 小时前
MySQL增删查改、多表查询
数据库·mysql