Ubuntu下Docker部署MySQL数据持久化实战

 更新时间:2026年07月14日 09:24:46   作者:Moshow郑锴  
本文介绍了在Ubuntu系统下通过Docker部署MySQL并实现数据持久化的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、问题引入:为什么需要数据持久化?

在用 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数据持久化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 阿里云服务器部署 Docker Swarm集群

    阿里云服务器部署 Docker Swarm集群

    这篇文章主要介绍了阿里云服务器部署 Docker Swarm集群,Docker Swarm 的作用就是用来管理Docker集群的平台,本文给大家介绍了Docker Swarm的基本概念和Docker Swarm 和 k8s的区别,需要的朋友可以参考下
    2022-07-07
  • Docker容器部署前端Vue服务(小白教程)

    Docker容器部署前端Vue服务(小白教程)

    本文主要介绍了Docker容器部署前端Vue服务,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 关于nacos-docker单机版详解

    关于nacos-docker单机版详解

    本文详解Nacos Docker单机版部署,涵盖运行容器、开放8848端口及访问测试,分享个人经验,供读者参考并支持脚本之家
    2025-08-08
  • 浅谈docker --privileged=true参数作用

    浅谈docker --privileged=true参数作用

    这篇文章主要介绍了浅谈docker --privileged=true参数作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Docker Machine深入学习

    Docker Machine深入学习

    Docker与Docker Machine 的区别?又如当我们执行docker-machine create命令时,Docker Machine都做了些什么?这篇文章都会告诉大家,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Docker安装MySQL及授权远程访问的详细教程

    Docker安装MySQL及授权远程访问的详细教程

    Docker是一种流行的容器化平台,可以简化应用程序的部署和管理,下面这篇文章主要给大家介绍了关于Docker安装MySQL及授权远程访问的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • CentOS7 PostgreSQL安装、配置、使用详解

    CentOS7 PostgreSQL安装、配置、使用详解

    这篇文章主要介绍了CentOS7 PostgreSQL安装、配置、使用详解的相关资料,需要的朋友可以参考下
    2016-11-11
  • Docker实现双容器部署的方法步骤

    Docker实现双容器部署的方法步骤

    本文介绍了Docker和DockerCompose实现双容器部署,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • Docker网络冲突排查与解决方案的完整指南

    Docker网络冲突排查与解决方案的完整指南

    在微服务和容器化部署的时代,Docker已经成为开发者和运维人员的日常工具,本文将带你深入了解Docker网络冲突的原因、排查方法和解决方案,并提供多个实际案例,希望对大家有所帮助
    2026-04-04
  • Docker 设置代理的三种方法(2025年06月03日亲测可用)

    Docker 设置代理的三种方法(2025年06月03日亲测可用)

    在Docker中设置代理是非常常见的需求,本文将介绍三种配置Docker使用代理的常见方法,包括通过配置镜像加速器、通过配置HTTP/HTTPS代理及通过配置代理,感兴趣的可以了解一下
    2025-09-09

最新评论