【 Docker 快速部署 MySQL 8.0(2026最新实践)—— 一键启动 + 数据持久化 + 常见优化】

Docker 快速部署 MySQL 8.0(2026最新实践)------ 一键启动 + 数据持久化 + 常见优化

文章最后更新时间:2026年1月

适用镜像:mysql:8 / mysql:8.0(官方镜像,当前最新 8.0.4x 系列)

目标读者:开发、测试、运维小白 ~ 中级

MySQL 8.0 是目前企业最广泛使用的稳定版本之一,使用 Docker 部署可以做到环境一致、秒级启动、易于迁移 。本文提供最常用、最稳定的两种方式:单命令启动 + docker-compose 推荐写法,并附带常见问题解决方案。

一、准备工作(强烈建议先做)

  1. 确保 Docker 已安装并正常运行

    bash 复制代码
    docker --version
    docker compose version   # 或 docker-compose --version
  2. (可选但推荐)配置国内镜像加速(显著提升拉取速度)

    编辑 /etc/docker/daemon.json(没有就新建):

    json 复制代码
    {
      "registry-mirrors": [
        "https://registry.docker-cn.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://mirror.ccs.tencentyun.com"
      ]
    }

    重启 Docker:

    bash 复制代码
    sudo systemctl daemon-reload
    sudo systemctl restart docker
  3. 拉取最新 MySQL 8 镜像(推荐使用 mysql:8,自动跟踪 8.0 系列最新 patch)

    bash 复制代码
    docker pull mysql:8

    提示:mysql:latest 目前已指向 MySQL 9.x 创新版系列,不建议用于生产!请明确指定 88.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

四、连接测试(三种常用方式)

  1. 容器内 mysql 客户端

    bash 复制代码
    docker exec -it mysql8 mysql -uroot -p
  2. 宿主机 mysql 客户端(需先安装 mysql-client)

    bash 复制代码
    mysql -h 127.0.0.1 -P 3306 -uroot -p
  3. 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 方式,便于版本管理、备份、扩容。

有任何问题欢迎评论区留言~ 比如想加主从复制、读写分离、备份脚本等高级玩法,也可以继续讨论!

喜欢记得一键三连:点赞 + 收藏 + 关注,下篇见!

相关推荐
霖霖总总4 分钟前
[小技巧66]当自增主键耗尽:MySQL 主键溢出问题深度解析与雪花算法替代方案
mysql·算法
JY.yuyu40 分钟前
Docker常用命令——数据卷管理 / 端口映射 / 容器互联
运维·docker·容器
lpruoyu1 小时前
【Docker进阶-06】docker-compose & docker swarm
运维·docker·容器
海奥华22 小时前
mysql索引
数据库·mysql
虾说羊2 小时前
docker容器化部署项目流程
运维·docker·容器
javachen__2 小时前
mysql新老项目版本选择
数据库·mysql
Dxy12393102163 小时前
MySQL如何高效查询表数据量:从基础到进阶的优化指南
数据库·mysql
Dying.Light3 小时前
MySQL相关问题
数据库·mysql
骇客野人3 小时前
通过脚本推送Docker镜像
java·docker·容器
Re.不晚4 小时前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构