适用人群:Windows 11 + Docker Desktop + WSL 2 新手用户目标:用 官方 Docker Desktop 安装并运行 MySQL 5.7,并确保:
数据不会因为重启电脑而丢失
Navicat 可以正常连接
中文数据尽量不乱码
少踩坑
一、这份教程解决什么问题
这份教程主要解决下面这些常见问题:
不知道 Docker 应该去哪里下载
不知道 MySQL 镜像应该怎么启动
容器重启后数据丢失
Navicat 能连,但命令行中文显示异常
新手容易把容器、镜像、数据卷搞混
这份教程采用的是 最稳的入门方案:
Docker Desktop:从 Docker 官方网站下载安装
MySQL:使用 Docker 官方 MySQL 镜像
数据持久化:使用 Docker volume,不把数据库运行数据直接绑到
/mnt/d/...这类路径默认字符集:推荐使用 utf8mb4
二、为什么推荐用 Docker 安装 MySQL
相比直接在 Windows 里安装 MySQL,Docker 版更适合新手练习和本地开发:
安装干净,卸载也干净
同一台机器可以并行跑多个版本
重装容器不影响镜像
正确使用 volume 后,重启电脑数据不会丢
容器启动命令可复制、可复用
三、官方资料来源
本教程的做法主要基于官方文档:
Docker Desktop for Windows 官方安装文档:Docker 官方文档
Docker Desktop WSL 2 backend 官方文档:Docker 官方文档
MySQL 官方 Docker 镜像文档:Docker Hub 官方镜像页面
说明:官方 MySQL 镜像文档明确说明,MYSQL_ROOT_PASSWORD 等环境变量只会在首次初始化数据目录时生效;如果数据目录里已经有数据库,再改环境变量不会覆盖已有数据库配置。
四、先准备好环境
1. 电脑要求
建议:
Windows 11
已启用虚拟化
已安装 WSL 2
2. 下载 Docker Desktop(官方)
请从 Docker 官方文档进入下载入口,安装 Docker Desktop for Windows。
安装时建议:
使用 WSL 2 based engine
保持默认安装路径即可
安装完成后重启电脑一次
3. Docker Desktop 启动后建议检查
打开 Docker Desktop,建议确认:
General 中开启开机自启
General 中启用 WSL 2 engine
Resources > WSL integration 已启用你正在使用的 Ubuntu 发行版
提醒:Docker 官方文档建议在 WSL 2 后端模式下使用 Docker Desktop,且不要在 WSL 发行版里再单独装一套 Docker Engine,避免冲突。
五、先理解 3 个最关键的概念
1. 镜像(image)
镜像像一个“安装包模板”。
例如:
mysql:5.7表示 MySQL 5.7 的官方镜像。
2. 容器(container)
容器像“运行中的 MySQL 实例”。
例如:
mysql57这是你自己给容器取的名字。
3. 数据卷(volume)
数据卷用来保存真正的数据文件。
例如:
mysql57_data只要数据卷不删,数据库数据通常就不会丢。
重点: 这一步是新手最容易踩坑的地方。正确的持久化方式是用 Docker volume,而不是一上来就把数据库数据目录直接绑定到
/mnt/d/...这种路径。
六、正式安装 MySQL 5.7
第 1 步:创建数据卷
docker volume create mysql57_data执行成功后会看到:
mysql57_data这表示数据卷已经创建成功。
第 2 步:启动 MySQL 容器
使用下面这条命令:
docker run -d \--name mysql57 \-p3306:3306 \-eMYSQL_ROOT_PASSWORD=123456 \-v mysql57_data:/var/lib/mysql \--restart=always \ mysql:5.7 \--character-set-server=utf8mb4 \--collation-server=utf8mb4_general_ci
这条命令的作用
-d:后台运行--name mysql57:容器名叫mysql57-p 3306:3306:把宿主机 3306 映射到容器 3306-e MYSQL_ROOT_PASSWORD=123456:初始化 root 密码为123456-v mysql57_data:/var/lib/mysql:把数据库文件保存到 Docker volume--restart=always:Docker 启动后容器自动启动mysql:5.7:使用官方 MySQL 5.7 镜像--character-set-server=utf8mb4:默认字符集设为 utf8mb4--collation-server=utf8mb4_general_ci:默认排序规则设为 utf8mb4_general_ci
第 3 步:查看容器是否启动成功
docker ps-a如果看到类似:
mysql57 Up ...说明启动成功。
第 4 步:查看日志
docker logs -f mysql57看到类似:
ready for connections表示 MySQL 已经初始化完成,可以连接了。
第一次启动通常会比平时慢一些,因为它要初始化系统数据库。
七、用命令行登录 MySQL
推荐登录方式
docker exec -it mysql57 mysql --default-character-set=utf8mb4 -uroot-p123456如果你想直接进入某个数据库,例如 test_db,可以这样:
docker exec -it mysql57 mysql --default-character-set=utf8mb4 -uroot-p123456 test_db
mysql>提示符出现后,说明已经登录成功。这时不要再输入密码。
退出 MySQL
exit;或者:
quit;八、用 Navicat 连接 MySQL
连接参数如下:
主机:
127.0.0.1端口:
3306用户名:
root密码:
123456
如果连接失败,优先检查:
Docker Desktop 是否已启动
mysql57容器是否在运行3306 端口是否被别的程序占用
九、创建数据库和表(建议一开始就指定 utf8mb4)
1. 创建数据库
CREATEDATABASE test_dbDEFAULTCHARACTERSET utf8mb4DEFAULTCOLLATE utf8mb4_general_ci;
2. 进入数据库
USE test_db;3. 创建 user 表
CREATETABLEuser( id INTAUTO_INCREMENTPRIMARYKEY, name VARCHAR(50)NOTNULL, age INT, create_time DATETIMEDEFAULTCURRENT_TIMESTAMP)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;
4. 插入数据
INSERTINTOuser(name, age)VALUES('张三',18);INSERTINTOuser(name, age)VALUES('李四',25);INSERTINTOuser(name, age)VALUES('王五',30);
5. 查询数据
SELECT*FROMuser;十、以后能不能不写 USE test_db;
可以。
你有两种方式:
方式 1:登录时直接带数据库名
docker exec -it mysql57 mysql --default-character-set=utf8mb4 -uroot-p123456 test_db方式 2:SQL 里直接写完整表名
INSERTINTO test_db.user(name, age)VALUES('张三',18);SELECT*FROM test_db.user;
十一、为什么重启电脑后数据不会丢
因为你用了:
-v mysql57_data:/var/lib/mysql这表示:
MySQL 的真实数据写入 Docker volume
容器只是“运行壳”
只要
mysql57_data不删,数据通常就还在
你还用了:
--restart=always这表示:
Docker Desktop 启动后,容器会自动启动
重启电脑后,MySQL 服务会自动恢复运行
十二、如何验证数据持久化成功
1. 插入测试数据
INSERTINTOuser(name, age)VALUES('测试数据',99);2. 重启电脑
3. 重启后重新查询
docker exec -it mysql57 mysql --default-character-set=utf8mb4 -uroot-p123456 test_dbSELECT*FROMuser;如果数据还在,就说明持久化成功。
十三、最常见的坑(非常重要)
坑 1:把数据直接绑到 /mnt/d/...
比如这样:
-v /mnt/d/mysql/data:/var/lib/mysql这种方式理论上可用,但在 WSL / Windows / Docker Desktop 的组合环境下,更容易遇到权限、性能、兼容性问题。新手阶段更推荐直接用 Docker volume。
坑 2:以为改了 MYSQL_ROOT_PASSWORD 就会改旧库密码
官方 MySQL 镜像说明很明确:如果数据目录里已经有数据库,再改:
-eMYSQL_ROOT_PASSWORD=xxxx不会影响已有数据库。
也就是说:
第一次初始化时,这个密码生效
以后再改环境变量,不会覆盖旧密码
坑 3:删容器不会丢数据,但删 volume 会丢数据
下面这个:
docker rm-f mysql57一般不会删掉数据卷。但下面这个:
docker volume rm mysql57_data会直接把数据库数据删掉。
坑 4:mysql> 出现后又继续输密码
登录命令:
docker exec -it mysql57 mysql -uroot-p123456看到:
mysql>就表示已经登录成功,这时不能再输入密码,否则会被当成 SQL 语句。
坑 5:WSL 里中文显示成 ??
这通常不是 MySQL 存坏了,而是 WSL 终端 locale / 显示编码问题。如果 Navicat 里显示正常,而命令行显示 ??,优先怀疑终端环境,不要先怀疑数据库。
十四、常用命令速查
查看容器
docker ps-a查看日志
docker logs -f mysql57停止容器
docker stop mysql57启动容器
docker start mysql57重启容器
docker restart mysql57删除容器
docker rm-f mysql57查看数据卷
docker volume ls删除数据卷(危险操作)
docker volume rm mysql57_data十五、如果 3306 端口被占用怎么办
如果你启动时提示 3306 被占用,可以把宿主机端口改成 3307:
docker run -d \--name mysql57 \-p3307:3306 \-eMYSQL_ROOT_PASSWORD=123456 \-v mysql57_data:/var/lib/mysql \--restart=always \ mysql:5.7 \--character-set-server=utf8mb4 \--collation-server=utf8mb4_general_ci
这时 Navicat 连接改成:
主机:
127.0.0.1端口:
3307用户名:
root密码:
123456
十六、如果想从零重装 MySQL
警告:下面操作会删除现有数据库数据。
1. 删除容器
docker rm-f mysql572. 删除数据卷
docker volume rm mysql57_data3. 重新创建数据卷
docker volume create mysql57_data4. 重新运行容器
docker run -d \--name mysql57 \-p3306:3306 \-eMYSQL_ROOT_PASSWORD=123456 \-v mysql57_data:/var/lib/mysql \--restart=always \ mysql:5.7 \--character-set-server=utf8mb4 \--collation-server=utf8mb4_general_ci
十七、这套方案适合谁
适合:
刚学 Docker 的新手
本地开发用 MySQL
想配合 Navicat 使用
想避免“重启电脑后数据没了”
想减少 Windows + WSL 组合环境中的坑
不太适合:
真正生产环境直接照搬 root 明文密码
需要严格权限分离、安全审计的正式服务器
十八、最后的建议
如果你是新手,本地练习就按这套来:
官方下载 Docker Desktop
Docker 官方 MySQL 镜像
Docker volume 保存数据
utf8mb4统一字符集Navicat 负责日常操作
命令行主要做验证和学习
这样最稳,也最不容易把时间浪费在环境问题上。
十九、你可以直接复用的最终命令
创建数据卷
docker volume create mysql57_data启动 MySQL
docker run -d \--name mysql57 \-p3306:3306 \-eMYSQL_ROOT_PASSWORD=123456 \-v mysql57_data:/var/lib/mysql \--restart=always \ mysql:5.7 \--character-set-server=utf8mb4 \--collation-server=utf8mb4_general_ci
登录 MySQL
docker exec -it mysql57 mysql --default-character-set=utf8mb4 -uroot-p123456 test_db二十、附:官方要点摘要
Docker Desktop for Windows 官方文档说明,Windows 上推荐使用 WSL 2 backend。
Docker 官方还说明,不建议在 WSL 发行版里再自己装一套 Docker Engine,避免冲突。
MySQL 官方镜像文档说明,
MYSQL_ROOT_PASSWORD等初始化变量仅在数据目录为空时生效。Docker 官方文档提供了 Windows 安装指引、权限说明和 WSL 2 后端使用说明。
如果你后面还要继续折腾,可以在这套基础上继续扩展:
Redis
Nginx
Java / Spring Boot
docker compose 一键起环境
这时你的本地开发环境就会非常完整。

夜雨聆风