适用人群: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 \
-p 3306:3306 \
-e MYSQL_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. 创建数据库
CREATE DATABASE test_db
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_general_ci;
2. 进入数据库
USE test_db;
3. 创建 user 表
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4. 插入数据
INSERT INTO user (name, age) VALUES ('张三', 18);
INSERT INTO user (name, age) VALUES ('李四', 25);
INSERT INTO user (name, age) VALUES ('王五', 30);
5. 查询数据
SELECT * FROM user;
十、以后能不能不写 USE test_db;
可以。
你有两种方式:
方式 1:登录时直接带数据库名
docker exec -it mysql57 mysql --default-character-set=utf8mb4 -uroot -p123456 test_db
方式 2:SQL 里直接写完整表名
INSERT INTO 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. 插入测试数据
INSERT INTO user (name, age) VALUES ('测试数据', 99);
2. 重启电脑
3. 重启后重新查询
docker exec -it mysql57 mysql --default-character-set=utf8mb4 -uroot -p123456 test_db
SELECT * FROM user;
如果数据还在,就说明持久化成功。
十三、最常见的坑(非常重要)
坑 1:把数据直接绑到 /mnt/d/...
比如这样:
-v /mnt/d/mysql/data:/var/lib/mysql
这种方式理论上可用,但在 WSL / Windows / Docker Desktop 的组合环境下,更容易遇到权限、性能、兼容性问题。 新手阶段更推荐直接用 Docker volume。
坑 2:以为改了 MYSQL_ROOT_PASSWORD 就会改旧库密码
官方 MySQL 镜像说明很明确: 如果数据目录里已经有数据库,再改:
-e MYSQL_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 \
-p 3307:3306 \
-e MYSQL_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 mysql57
2. 删除数据卷
docker volume rm mysql57_data
3. 重新创建数据卷
docker volume create mysql57_data
4. 重新运行容器
docker run -d \
--name mysql57 \
-p 3306:3306 \
-e MYSQL_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 \
-p 3306:3306 \
-e MYSQL_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 一键起环境
这时你的本地开发环境就会非常完整。