Ubuntu下Docker部署MySQL数据持久化实战
作者:Moshow郑锴
一、问题引入:为什么需要数据持久化?
在用 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 容器
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 测试连接

到此这篇关于Ubuntu下Docker部署MySQL数据持久化实战的文章就介绍到这了,更多相关Docker部署MySQL数据持久化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
