目录
一、磁盘挂载
服务器突然崩了,docker images 和 docker ps -a 不显示任何镜像和容器,遂重新拉取镜像,重新构建镜像,并将原本镜像文件复制过去,达到重建效果。(仅限于原docker无法找到,但文件未丢失情况。)
服务器突然崩掉了,重启之后,使用docker image 和docker ps -a完全无反应,着实吓了一跳,毕竟数据全在上面。遂使用
df -h
检查挂载点与挂载的数据大小。经查询,发现原本存储数据的硬盘挂载点不见了,于是使用
fdisk -l
查看所有磁盘信息。万幸,只是挂载掉了,还能查到设备,遂用mount临时挂载。
# 临时挂载 mount (你的设备名) (你选择的挂载点)
mount /dev/sda /home/user/data
并写入/etc/fstab中实现永久挂载。
# 永久挂载
vim /etc/fstab #编辑挂载文件
/dev/sda /home/user/data ext4 defaults 0 1 #添加至末尾即可
其中/dev/sda 是设备文件(一般为设备路径+设备名称)
/home/user/data 是挂载目录,需要在挂载前创建好
ext4 是指定文件系统格式,如Ext3、Ext3、XFS、SWAP等(请根据具体情况选择)
defaults 权限选项,为defaults时,默认权限为rw,suid,dev,exec,auto,nouser,async
0 开机后是否使用dump备份,1为备份,0为不备份
1 是否磁盘自检,1自检,0不自检。[1]
将硬盘重新挂载上了设备。
二、容器内容替换
挂载之后使用docker images 和docker ps -a还是没有镜像和容器,进入到docker/containers发现容器都在,但是容器内config.v2.json为空,并且docker/image/overlay2/imagedb/metadata/sha256下没有镜像id。好嘞,直接吓死。以为恢复不了了,但之前重新挂载磁盘后,发现磁盘大小并没有改变。说明文件还在,只是不知道什么原因docker链接不上了,于是进入docker/overlay2中,发现之前的容器id还在,于是想到是否可以重新构建容器并将原来数据拉过去,实现借壳重生。于是重新拉取之前使用的镜像,构建了新容器。
使用
docker inspect 容器ID
查看新建容器的存储ID,找到GraphDriver下的UpperDir,就是新容器数据的存储地址。
然后进入到容器ID所在的文件夹,使用mv将diff重命名为diff_old,再将原来链接不上的diff直接移动到新建容器的ID下就实现了借壳重生了。
注:如果找不到原本容器太多,找不到对应的原容器,可以试着查找最大文件来确定原容器存储ID。
目前来看,基本没有什么问题,不过可能需要新建的容器和原本容器使用的镜像一致,或者是同一个版本的系统。(不同版本系统未尝试)
reference: