一、问题引入:为什么需要数据持久化?
在用 Docker 跑 MySQL 时,很多新手会遇到一个棘手问题:容器重启或删除后,所有数据库数据全没了。
这是因为 MySQL 容器默认把数据存储在容器内部的 /var/lib/mysql 目录。而容器本身是“无状态”的——删除容器后,其中的所有数据也随之消失。如果在部署时没有做特殊配置,每次启动容器都得重新建库建表,数据无法延续。
解决方案也很直接:把 MySQL 的数据存储目录“迁”到宿主机(即 Ubuntu 系统)的某个目录下,通过 Docker 挂载的方式让容器读取外部数据。这样,无论容器怎么折腾,数据都安安稳稳地留在宿主机上。本文会从零开始,详细介绍如何在 Ubuntu 下用 Docker 部署 MySQL,并实现数据持久化。
前置准备:本文假设你的 Ubuntu 系统已经安装了 Docker。如果尚未安装,可参考以下命令快速安装:
curl -fsSL https://get.docker.com | bash -s docker –mirror Aliyun
systemctl start docker && systemctl enable docker
docker -v # 输出版本号即成功
二、核心概念:两种数据持久化方案
Docker 提供两种主要的数据持久化方式:
绑定挂载(Bind Mount) —— 将宿主机的某个目录“映射”到容器内的指定路径。数据直接存放在你指定的宿主机目录中,一目了然,便于管理和查看。下文主要采用这种方式。
命名卷(Named Volume) —— 由 Docker 管理的数据存储卷,自动处理权限和存储路径,支持卷备份和迁移,适合正式生产环境。
两者都能实现持久化,绑定挂载更直观,下文将以此为基础展开。
三、实战:在 Ubuntu 上部署持久化的 MySQL 容器
# —————————————————–
# – 🚀 Powered by Moshow郑锴
# – 🌟 Might the holy code be with you!
# —————————————————–
# 🔍 公众号 👉 软件开发大百科
# 💻 CSDN 👉 https://zhengkai.blog.csdn.net
# 📂 Github 👉 https://github.com/moshowgame
3.1 创建数据存储目录
在宿主机上创建一个目录来存放 MySQL 数据(你可以根据需要自定义路径):
sudo mkdir -p /data/mysql/{data,conf,logs}
这个命令会创建三个子目录:
-
data → 存放 MySQL 实际的数据文件
-
conf → 存放自定义配置文件(可选)
-
logs → 存放日志文件
3.2 设置目录权限(关键避坑点)
这是最容易踩坑的地方。MySQL 容器默认以 mysql 用户(UID 和 GID 均为 999)运行,如果宿主机目录的权限不匹配,MySQL 将无法写入数据,容器启动时会报 Permission denied 错误。(優選)
# 将目录所有权交给 MySQL 容器使用的用户(UID 999)
sudo chown -R 999:999 /data/mysql
如果只是想快速测试,也可以临时赋予 777 权限:
sudo chmod -R 777 /data/mysql
避坑提示:忘记设置权限是导致 MySQL 容器启动失败的最常见原因之一。如果容器启动后很快就退出了,用 docker logs <容器名> 查看日志,如果看到类似 Can't create/write to file '/var/lib/mysql/…' 的错误,十有八九是权限问题。
3.3 拉取 MySQL 镜像
建议指定具体版本号,避免使用 latest 标签导致意外的版本升级问题:
docker pull mysql:9.7.0
也可以到https://hub.docker.com/_/mysql 检查mysql版本,右侧可以选择版本并获得pull命令

3.4 启动 MySQL 容器(绑定挂载方式)
docker run -d \\
–name mysql-persistent \\
–restart always \\
-p 3306:3306 \\
-e MYSQL_ROOT_PASSWORD=root123 \\
-e TZ=Asia/Shanghai \\
-v /data/mysql/data:/var/lib/mysql \\
-v /data/mysql/conf:/etc/mysql/conf.d \\
-v /data/mysql/logs:/var/log/mysql \\
mysql:9.7.0 \\
–character-set-server=utf8mb4 \\
–collation-server=utf8mb4_unicode_ci
【各参数说明】 :
-
-d:后台运行
-
–name:给容器起个名字,方便管理
-
–restart always:容器退出时自动重启,保证服务高可用
-
-p 3306:3306:端口映射,宿主机 3306 映射到容器 3306
-
-e MYSQL_ROOT_PASSWORD:设置 root 密码(需包含大小写+数字+特殊字符)
-
-e TZ=Asia/Shanghai:设置时区
-
-v:绑定挂载,格式为 宿主机路径:容器内路径
-
–character-set-server=utf8mb4:字符集,支持 emoji
-
–collation-server=utf8mb4_unicode_ci:排序规则
3.5 验证结果

moshow@moshow-ubuntu:~/Downloads$ docker pull mysql:9.7.0
9.7.0: Pulling from library/mysql
9c6d3f438d99: Download complete
b3e52f10da63: Download complete
1dced004aaec: Pull complete
8e3f19ed5e67: Pull complete
69edacfaea72: Pull complete
4f23ccd26206: Pull complete
802b6dd0c6bd: Pull complete
35300b480a58: Pull complete
8ec50bfa3b7e: Pull complete
5491a2a13e1b: Pull complete
f74943462a4f: Pull complete
e80b372994e5: Pull complete
Digest: sha256:c11782aa2a96624c1efc121768641d96954faa136d6aa82751b032d8c426ffbc
Status: Downloaded newer image for mysql:9.7.0
docker.io/library/mysql:9.7.0
moshow@moshow-ubuntu:~/Downloads$ sudo mkdir -p /data/mysql/{data,conf,logs}
[sudo: authenticate] 密码:
moshow@moshow-ubuntu:~/Downloads$ sudo chown -R 999:999 /data/mysql
moshow@moshow-ubuntu:~/Downloads$ docker run -d \\
–name mysql-persistent \\
–restart always \\
-p 3306:3306 \\
-e MYSQL_ROOT_PASSWORD=root123 \\
-e TZ=Asia/Shanghai \\
-v /data/mysql/data:/var/lib/mysql \\
-v /data/mysql/conf:/etc/mysql/conf.d \\
-v /data/mysql/logs:/var/log/mysql \\
mysql:9.7.0 \\
–character-set-server=utf8mb4 \\
–collation-server=utf8mb4_unicode_ci
b8124dc936007b7b185bc999ee7d5949d412a23cd784cea8c5a8ca764d4ce8c7
moshow@moshow-ubuntu:~/Downloads$ docker images
i Info → U In Use
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
hello-world:latest 96498ffd522e 25.9kB 9.49kB U
mysql:9.7.0 c11782aa2a96 1.3GB 290MB U
四、一键安装DBeaver
4.1 安装dbeaver
moshow@moshow-ubuntu:~/Downloads$ sudo snap install dbeaver-ce –classic
[sudo: authenticate] 密码:
dbeaver-ce 26.1.0.202605311718 (来自 DBeaver (dbeaver-corp)) installed
4.2 建立连接


4.3📌 Public Key Retrieval is not allowed错误快速修复,允许客户端获取公钥 (推荐测试环境)
在不同客户端中的设置方法:
-
4DBeaver / DataGrip等通用数据库工具:找到连接设置,进入“驱动属性”(Driver properties)页面,修改allowPublicKeyRetrieval属性(如果不存在请手动添加),并将值设为true。

-
MySQL CLI命令行客户端:在连接命令中加入–get-server-public-key参数,例如:
mysql -u your_username -p –get-server-public-key
-
Spring Boot (application.properties):在数据源URL中加入该参数。
spring.datasource.url=jdbc:mysql://localhost:3306/你的数据库?useSSL=false&allowPublicKeyRetrieval=true
⚠️ 安全提醒 此方法仅适用于本地开发或内网测试等受信任的网络环境。因为它允许在不验证服务器身份的情况下获取公钥,理论上存在被中间人攻击窃取密码的风险。对于生产环境,请务必参考解决方案三。
4.4 测试连接

# —————————————————–
# – 🚀 Powered by Moshow郑锴
# – 🌟 Might the holy code be with you!
# —————————————————–
# 🔍 公众号 👉 软件开发大百科
# 💻 CSDN 👉 https://zhengkai.blog.csdn.net
# 📂 Github 👉 https://github.com/moshowgame


