Docker 部署 MySQL 8.0 持久化存储时,必须将容器内的/var/lib/mysql 目录挂载到宿主机绝对路径,并将宿主机目录属主修改为 UID 999 以避免权限错误。适用场景为生产环境数据持久化,风险边界在于宿主机目录权限配置错误会导致容器启动失败或数据无法写入。
先说结论:MySQL 8.0 容器默认以非 root 用户运行,挂载数据卷必须修正宿主机目录权限并指定正确路径。
- 适合 Docker 环境下的 MySQL 8.0 数据持久化场景
- 先准备宿主机目录并修正文件属主为 999:999
- 验收通过容器内写入数据并在宿主机确认文件存在
命令速用版
以下命令可直接在 Linux 宿主机终端执行,用于创建目录、修正权限并启动容器。
# 1. 创建宿主机数据目录
mkdir -p /data/mysql/data
# 2. 修正目录属主为 MySQL 容器默认用户 UID 999
chown -R 999:999 /data/mysql/data
# 3. 启动容器并挂载数据卷
docker run -d \
`--name` mysql8 \
-p 3306:3306 \
-v /data/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=YourPassword \
`--restart` unless-stopped \
mysql:8.0为什么会这样
MySQL 8.0 官方 Docker 镜像默认使用非 root 用户(mysql 用户,UID 999)运行进程,宿主机目录权限不匹配会导致写入失败。若宿主机目录由 root 创建且属主为 root,容器内的 mysql 进程无权在该目录创建文件或写入数据,常见报错为 mysqld: Can't create/write to file '/var/lib/mysql/is_writable'。直接挂载/var/lib/mysql 是最简且可靠的方式,只要将该路径映射到宿主机目录,容器删除后数据也不会丢失。
分步处理
按以下步骤操作可确保数据卷挂载正确且权限无误,每步完成后建议进行检查。
步骤 1:创建宿主机目录
在宿主机创建用于存储数据的绝对路径,避免使用相对路径或临时目录。
mkdir -p /data/mysql/data步骤 2:修正目录权限
将目录属主修改为 999:999,这是 MySQL 容器内进程的运行用户 ID。
chown -R 999:999 /data/mysql/data步骤 3:启动容器并挂载
使用-v 参数将宿主机目录映射到容器内的/var/lib/mysql,确保路径一致。
docker run -d `--name` mysql8 -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0步骤 4:配置文件挂载(可选)
若需自定义配置,将配置文件挂载到/etc/mysql/conf.d/目录,确保文件包含 [mysqld] 段。
-v /data/mysql/conf:/etc/mysql/conf.d怎么验证是否生效
通过检查宿主机文件生成情况和容器日志确认挂载成功,避免容器反复重启。
检查宿主机文件
容器启动完成后,宿主机挂载目录下应自动生成 ibdata1、ib_logfile 等数据文件。
ls -l /data/mysql/data检查容器状态
使用 docker ps 确认容器状态为 Up,无 Restarting 状态。
docker ps测试数据写入
进入容器创建测试表,然后在宿主机确认文件大小变化。
docker exec -it mysql8 mysql -uroot -p -e "CREATE DATABASE test_db;"常见坑
以下场景容易导致挂载失败或数据不可用,操作前需仔细核对。
权限不足导致启动失败
未执行 chown -R 999:999 直接启动容器,MySQL 因无权写入数据目录而退出,日志报 Permission denied。
配置文件路径错误
将 my.cnf 挂载到错误路径如/etc/mysql 而非/etc/mysql/conf.d/,或文件内缺少 [mysqld] 段导致配置不生效。
客户端连接认证失败
MySQL 8.0 默认认证插件为 caching_sha2_password,旧版客户端可能连接失败,需改为 mysql_native_password。
常见问题
挂载后容器启动报错 Can't create/write to file 怎么办?
宿主机目录权限不对,需执行 chown -R 999:999 修正属主。
自定义配置文件挂载后不生效是什么原因?
配置文件路径错误或文件内容缺少 [mysqld] 段,应挂载至/etc/mysql/conf.d/并确保格式正确。
如何确保容器删除后数据不丢失?
只要正确挂载了/var/lib/mysql 到宿主机目录,容器删除不影响宿主机上的数据文件。
参考来源
- 如何在 Docker 环境下挂载 MySQL 8.0 的数据卷?
- 怎样在 Docker 中配置 MySQL 8.0 的持久化存储_通过-v 参数挂载数据卷
- Docker 安装 MySQL 8.0 并挂载数据与配置文件 - 东峰叵,com - 博客园
- docker mysql 8.0 版本挂载
- 图搞定 Docker 快速部署 MySQL8.0:全流程图解与实战指南