Docker 安装 MySQL 教程(完全从官网下载|新手优化版)

0 阅读10分钟

适用人群:Windows 11 + Docker Desktop + WSL 2 新手用户 目标:用 官方 Docker Desktop 安装并运行 MySQL 5.7,并确保:

  • 数据不会因为重启电脑而丢失
  • Navicat 可以正常连接
  • 中文数据尽量不乱码
  • 少踩坑

一、这份教程解决什么问题

这份教程主要解决下面这些常见问题:

  1. 不知道 Docker 应该去哪里下载
  2. 不知道 MySQL 镜像应该怎么启动
  3. 容器重启后数据丢失
  4. Navicat 能连,但命令行中文显示异常
  5. 新手容易把容器、镜像、数据卷搞混

这份教程采用的是 最稳的入门方案

  • 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

如果连接失败,优先检查:

  1. Docker Desktop 是否已启动
  2. mysql57 容器是否在运行
  3. 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

二十、附:官方要点摘要

  1. Docker Desktop for Windows 官方文档说明,Windows 上推荐使用 WSL 2 backend。
  2. Docker 官方还说明,不建议在 WSL 发行版里再自己装一套 Docker Engine,避免冲突。
  3. MySQL 官方镜像文档说明,MYSQL_ROOT_PASSWORD 等初始化变量仅在数据目录为空时生效。
  4. Docker 官方文档提供了 Windows 安装指引、权限说明和 WSL 2 后端使用说明。

如果你后面还要继续折腾,可以在这套基础上继续扩展:

  • Redis
  • Nginx
  • Java / Spring Boot
  • docker compose 一键起环境

这时你的本地开发环境就会非常完整。