最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何在Docker容器中将MySQL数据持久化到宿主机?
时间:2026-09-03 19:54:49 编辑:袖梨 来源:一聚教程网
必须挂载/var/lib/mysql到宿主机绝对路径,因MySQL 8.0所有数据(系统库、redo log、数据字典等)均写入该目录,不挂载则数据存于临时文件系统,容器删除后彻底丢失;挂载是唯一不可妥协的前提。
必须挂载 /var/lib/mysql 到宿主机绝对路径,否则容器一删数据全丢——这是唯一不可妥协的前提,其他所有配置都建立在此之上。
为什么 /var/lib/mysql 是唯一必须挂载的路径
MySQL 8.0 最新镜像把所有数据(系统库、表空间、redo log、数据字典)全写在 /var/lib/mysql 下。不挂载,就等于存在容器临时文件系统里,docker rm 后彻底消失。Dockerfile 中的 VOLUME /var/lib/mysql 只是声明,不自动绑定宿主机;必须显式用 -v 挂载才生效。
- 挂错路径(比如挂到
/etc/mysql或空父目录/data)会导致启动失败,日志里常见Can't open the mysql.plugin table或卡在Initializing database - 相对路径(如
./mysql)会被 Docker 忽略或报错,必须用绝对路径 - 命名卷(
mysql-data:/var/lib/mysql)虽安全,但无法直接ls或rsync备份,生产环境多数人倾向可控性更强的宿主机目录
宿主机目录创建和权限怎么设才不踩坑
MySQL 8.0 容器内默认以 UID 999 用户(mysql)运行,不是 root,也不是你当前 shell 用户。宿主机目录若由 root 创建且未改属主,容器会因无写权限卡死。
- 先创建空目录:
sudo mkdir -p /data/mysql8 - 立刻改属主:
sudo chown -R 999:999 /data/mysql8(不能只chmod 777,SELinux 或某些发行版会拒绝) - 目录必须为空:已有旧数据(哪怕是残留的
ib_logfile0)会导致 MySQL 跳过初始化,MYSQL_ROOT_PASSWORD等环境变量全部失效 - 不要挂载父级目录(如
/data),里面若有其他文件会干扰初始化逻辑
MYSQL_ROOT_PASSWORD 不生效?先看初始化状态
这个环境变量只在首次初始化数据库时起作用。如果挂载目录非空,MySQL 直接加载现有数据,完全忽略所有 MYSQL_* 变量。
- 典型表现:容器反复重启、连上去密码还是旧的、
app_db没自动建、日志出现mysqld: Can't open the mysql.plugin table - 验证方法:进容器执行
ls /var/lib/mysql,如果已存在mysql/、sys/、ibdata1,说明不是首次初始化 - 解决办法只有两个:
sudo rm -rf /data/mysql8 && sudo mkdir -p /data/mysql8 && sudo chown -R 999:999 /data/mysql8,或者换新路径重新来 - 其他有效环境变量仅限:
MYSQL_DATABASE(建库)、MYSQL_USER+MYSQL_PASSWORD(建用户并授权),同样只对首次初始化生效
配置文件挂载到哪里才真正起作用
MySQL 8.0 启动时按顺序读取:/etc/mysql/my.cnf → /etc/mysql/conf.d/*.cnf → /etc/mysql/mysql.conf.d/*.cnf。挂错位置或内容不合规,配置就静默失效。
- 推荐做法:挂载整个
conf.d目录,例如-v /host/conf.d:/etc/mysql/conf.d,然后在宿主机放/host/conf.d/01-charset.cnf,内容只含[mysqld]及其下几行关键参数 - 必须包含:
default_authentication_plugin=mysql_native_password(否则 Navicat、旧 JDBC 连不上)、default-time_zone='+8:00'(避免日志时间错乱) - 别用 MySQL 5.7 的参数(如
innodb_file_per_table=1),8.0 已默认开启,写了反而可能报错 - 文件后缀必须是
.cnf,内容必须有[mysqld]段,否则被跳过
最易被忽略的是「首次初始化」这个隐式开关:它不靠命令触发,而由挂载目录是否为空决定。哪怕只是多了一个隐藏文件、一个日志碎片,MySQL 就会跳过初始化流程,所有预设逻辑全部失效——这通常不是异常,是设计使然。
相关文章
- Tplink企业版路由器WiFi名称的默认设置介绍(Tplink企业版路由器WiFi名称的默认设置是什么) 09-06
- Tplink路由器灯常亮无法上网的原因分析(如何解决Tplink路由器灯常亮无法上网的问题) 09-06
- Tplink千兆企业级路由器自动重启的作用和优势介绍(如何设置Tplink千兆企业级路由器自动重启功能) 09-06
- 一根天线的tplink路由器有哪些(一根天线的Tplink路由器的特点和优势介绍) 09-06
- tplink路由器外网访问不了nas(Tplink路由器外网访问NAS的原因分析) 09-06
- Tplink无法搜到路由器的原因分析(如何解决Tplink无法搜到路由器的问题) 09-06