Mac下Docker MySQL命名卷本地目录为空 数据存储与迁移问询
核心误区说明
你启动容器时使用的挂载参数-v db:/var/lib/mysql创建的是Docker命名卷,并没有挂载你当前目录下手动创建的db文件夹——这就是你执行ls -al db/看到目录为空的原因,你本地的这个同名目录完全没被容器使用,数据一直存在Docker管理的命名卷里,所以删了容器重建只要卷没删,数据就还在。
问题1:Mac系统下数据库文件的实际存储路径
Mac版Docker Desktop所有容器、卷数据都存储在Docker内置的轻量Linux虚拟机中,命名卷的文件系统属于虚拟机内部,不会直接暴露给Mac宿主机的文件系统,你无法通过Finder直接找到对应文件。
如果要查看该卷的Docker层面挂载信息,可执行命令:
docker volume inspect db
返回结果中的Mountpoint字段是虚拟机内的路径,并非Mac宿主机的可访问路径,不要尝试在Mac本地目录中匹配该路径。
问题2:跨设备迁移数据的操作步骤
要实现新设备挂载卷即可读取原有数据,按以下步骤操作:
- 先停止源设备上正在运行的MySQL容器,防止导出过程中有新数据写入导致文件不一致
docker stop mysql3
- 在源设备上导出卷内数据为压缩包,无需进入Docker虚拟机,直接用临时busybox容器完成打包即可
docker run --rm -v db:/source_data -v $(pwd):/backup busybox tar zcf /backup/mysql_db_backup.tar.gz -C /source_data .
执行完成后,当前命令执行目录下会生成mysql_db_backup.tar.gz文件,就是完整的数据库数据备份。
- 将压缩包传输到目标设备,在目标设备上先创建用于存储数据的Docker命名卷(卷名可以自定义,这里沿用原来的
db作为示例)
docker volume create db
- 在目标设备上用临时容器将备份包解压到刚创建的新卷中
docker run --rm -v db:/target_data -v $(pwd):/backup busybox tar zxf /backup/mysql_db_backup.tar.gz -C /target_data
- 在目标设备上执行原有的
docker run命令启动MySQL 8.0容器即可,启动后直接登录就能看到之前创建的price表和存储的数据。
注意事项:
- 目标设备使用的MySQL镜像版本必须和源设备一致(同为mysql/mysql-server:8.0),避免出现数据文件版本不兼容的问题
- 如果你后续希望数据库文件直接存在本地可直接访问的目录,启动时把挂载参数改为
-v ./本地目录路径:/var/lib/mysql即可,这种属于绑定挂载,本地目录会直接同步容器内的数据库文件,但Mac系统下绑定挂载的IO性能会低于Docker命名卷。
内容的提问来源于stack exchange,提问作者Ani
相关产品推荐
相关产品推荐

