背景
环境: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
本站由以下主机服务商提供服务支持:
0条评论