抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

Docker mysql容器数据库丢失找回指北

背景

环境:MAC Docker Desktop

操作习惯:命令创建容器,再使用Kitematic进行简单的管理,顺便进行容器的目录挂载,如图:

之前我的mysql并没挂载,我数据库也没备份,按日常使用的手速点了这个挂载,但我忽略了mysql的配置文件(包括数据库)是默认保存在一个数据卷中的,以至于我挂载到了本地后,之前的数据卷就舍弃了,从而数据丢失。

思考及操作

尝试按 该文 进行尝试,但提示我 “/var/lib/docker/volumes/” 不存在,我在电脑上查找了docker相关的文件,发现确实不能这样去处理,毕竟mac的操作系统不一样。但是里面有条命令引起了我的注意:

docker volume ls -qf dangling=true

这是一条可以看到所有目前被舍弃卷的命令,因为是默认的卷,所有没法用名称去辨别,而且内容有点多,但是至少知道数据库存在于这里面的某个卷中,于是先考虑可以看到这些卷里的内容。

通过CleanMyMac找到docker的一个大文件,足足64G

我想这就是docker的所有数据,因为格式不一样,所以无法打开。

于是寻找相关文章,找到 该文 中有记载如何连入Docker-Desktop的tty并查看所有卷内容。

步骤:打开终端

cd ~/Library/Containers/com.docker.docker/Data/

看到了这个tty,那么连接下试试

screen tty

再看看/var/lib/docker/volumes/是否存在

ls /var/lib/docker/volumes/

然后出现的结果正是”docker volume ls -qf dangling=true “所查出的卷列表

证明已进入docker所在环境,此时我们可以查看每个数据卷的数据

cd /var/lib/docker/volumes/
ls [卷ID]/_data

这样就可以看到我们想知道的数据卷内容,直到找到需要的,如我最终要找的是数据库,最后找到id

至此。已经找到了数据卷的id,也知道了该内容。那么复制出来还原到数据库的容器中即可。

挂载到容器temp

使用参数(挂载到data目录): -v [卷ID]:/data

docker run --name temp -v 754470f4c48bb491ff9a4d8deafda7204095005bf3bb35678d7cb5e422ed437c:/data  -d  [一个可后台运行的本地存在的镜像]

启动后该卷就挂载到了temp容器的data目录,再使用docker cp命令拷贝处理即可。

 docker cp [temp容器id]:/data /Users/用户名/Downloads

这样我就拿到了所有数据库文件,再覆盖到mysql容器挂载到本地的目录下即可。

我知道还有更简单的办法,毕竟没人会这样一个一个卷找,BUT,我不知道,知道的还请不吝赐教,谢谢!

PS:其实直接用find命令找需要的文件就行,或者说raw在linux的容器上就直接可以挂载查看了(未验证)?

参考:

https://yeasy.gitbooks.io/docker_practice/content/image/dockerfile/volume.html

https://blog.csdn.net/m0_37904728/article/details/82786771

https://www.primozker.in/post/saving-lost-data-docker/


0条评论

发表评论