Docker 部署 MySQL 8.0 如何持久化数据卷避免容器删除丢失

文章导读
Docker 部署 MySQL 8.0 持久化数据的核心是将容器内的 `/var/lib/mysql` 目录挂载到宿主机路径。适用所有基于 Docker 的 MySQL 8.0 场景,风险边界在于宿主机目录权限不足可能导致容器启动失败。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
A A

Docker 部署 MySQL 8.0 持久化数据的核心是将容器内的 `/var/lib/mysql` 目录挂载到宿主机路径。适用所有基于 Docker 的 MySQL 8.0 场景,风险边界在于宿主机目录权限不足可能导致容器启动失败。

先说结论:必须使用 Docker 卷挂载机制映射数据目录,否则容器删除后数据永久丢失。

  • 适合:所有生产环境及需要保留数据的测试环境
  • 先准备:宿主机目标目录及权限检查
  • 验收:容器重建后数据可查询

命令速用版

docker run -d `--name` mysql8 \
  -e MYSQL_ROOT_PASSWORD=your_password \
  -v /opt/mysql/data:/var/lib/mysql \
  -p 3306:3306 \
  mysql:8.0

为什么会这样

Docker 容器默认将数据存储在可写容器层,该层级随容器删除而清除。挂载卷将数据写入宿主机文件系统,独立于容器生命周期。

分步处理

步骤 1:创建宿主机目录
在宿主机执行 mkdir -p /opt/mysql/data,确保路径存在。

Docker 部署 MySQL 8.0 如何持久化数据卷避免容器删除丢失

步骤 2:启动容器并挂载
使用 docker run 命令添加 -v 参数,左侧为宿主机路径,右侧为容器内路径 /var/lib/mysql。

步骤 3:Docker Compose 配置(可选)
在 docker-compose.yml 的 volumes 字段定义相同映射关系,便于版本管理。

Docker 部署 MySQL 8.0 如何持久化数据卷避免容器删除丢失

怎么验证是否生效

向数据库写入测试数据,停止并删除容器,重新创建容器后查询该数据是否存在。若数据仍在,说明持久化生效。

常见坑

宿主机目录权限不对会导致 MySQL 进程无法写入,报错 Permission denied。SELinux 开启时可能拦截挂载目录访问,需调整上下文或关闭。

常见问题

数据默认存在容器哪个路径?

MySQL 8.0 官方镜像默认数据目录为 /var/lib/mysql,必须挂载此路径。

Docker 部署 MySQL 8.0 如何持久化数据卷避免容器删除丢失

使用 Docker Compose 如何配置?

在 services 下配置 volumes 字段,格式为宿主机路径:容器路径。

已经运行的容器如何补救?

先停止容器,使用 docker cp 导出数据,再删除容器并重新按挂载方式启动。