项目场景:

服务器空间满,想清理一下。发现是docker太大,/var/lib/docker/overlay2占用很大49G,网站也访问不了,mongodb前一天也停了。用这个清理docker system prune -a,结果把数据库的镜像及容器全删了。mysql等正常的容器及镜像都没影响,那些停了的没用的全删了。

千万慎用这个来清理 docker system prune -a,一定要先备份。


问题描述:

清理docker空间 docker system prune -a

清了7G左右,还误把mongodb等容器及镜像删除,数据也没备份。怎么找回并恢复数据?

还有好几个nodejs容器及镜像被删,这个好办有备份。

原因分析:

没想到空间满,会导致很多容器停止服务。

没想到清理时,会删一些有用的东西。

涉及删除,都有谨慎。一定要先备份,能恢复。

千万慎用这个来清理 docker system prune -a,一定要先备份。


恢复解决方案:

docker mongodb的数据和配置在宿主机上默认有挂载,所以数据没丢。找到并复制数据到新容器里重启就行。具体如下:

  1. 新建一个mongodb镜像及容器
docker pull mongo

docker run -itd --name mongo -p 27017:27017 mongo

docker inspect mongo

可以看到挂到宿主机上的两个目录

配置目录/data/configdb是空的

数据目录/data/db 数据存在这里, 对应挂到宿主机目录为

/var/lib/docker/volumes/4d77ddb447a42bf1242fb3acb7686a6e1f50f44a5c420d1a3a3370f0e0fc7c69/_data

进入目录,看到目录数据结构。因为是默认是匿名挂载,路径是一串字符,容器及镜像被删不好知道哪一个是要找的mongodb数据,找出特征,然后目录搜,搜到导入数据来试。

我觉得应该都带有mongod.lock这个文件

搜到了4个

 可以看日期或目录大小(du -h --max-depth=1)大致判断是哪一个,也可以每个都导入然后用mongo客户端看。我是直接cp,重启容器,再mongodb客户端看。

#我是先在FTP里把新的的容器/var/lib/docker/volumes/481a5cd20939019e21d54d11479eeb5cf2c3d475fd6d030fe31c5b5d76ba7750/_data/下的文件先删了,再复制。

cp -rf /var/lib/docker/volumes/d703574b4a27ef7b32f5d0810aaa60e9ec19f7fb2f01a1dc7d711eecc1b5e096/_data/* /var/lib/docker/volumes/481a5cd20939019e21d54d11479eeb5cf2c3d475fd6d030fe31c5b5d76ba7750/_data/

#重启容器
docker restart mongo

#进入容器测试一下,看是否正常启动,显示welcome等
docker exec -it mongo mongo admin




#以下非必要操作
#进入mongodb容器后mongodb看数据库
show dbs

#mongodb创建用户
db.createUser({ user:'root',pwd:'root',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});

进入 mongodb客户端,已经恢复成功。

把所有与mongdb相关的应用重启,看到有数据插入,界面能显示,系统恢复OK。

docker restart test_kjmon_1
docker restart kjapi
docker restart kjweb
docker restart test_kjapp_1
docker restart test_kjtcpserver_1

 千万慎用这个来清理 docker system prune -a,一定要先备份。

 

全部指令

#------------------docker mongodb恢复
docker pull mongo:latest
docker stop mongo
docker rm mongo
docker run -itd --name mongo -p 27017:27017 mongo
docker exec -it mongo mongo admin


cd /var/lib/docker
find -name mongod.lock
#找到 原数据位置
/var/lib/docker/volumes/4d77ddb447a42bf1242fb3acb7686a6e1f50f44a5c420d1a3a3370f0e0fc7c69/_data

#运行mongo
docker run -itd --name mongo -p 27017:27017 mongo:latest
#查看信息
docker inspect mongo

#得到 新数据位置
/var/lib/docker/volumes/536c49ef1edc205778adb688460d6aaac2f9a768075ba83b621306f1e1ae96d4/_data

#先清空再复制
cp -rf /var/lib/docker/volumes/4d77ddb447a42bf1242fb3acb7686a6e1f50f44a5c420d1a3a3370f0e0fc7c69/_data/* /var/lib/docker/volumes/536c49ef1edc205778adb688460d6aaac2f9a768075ba83b621306f1e1ae96d4/_data/

#重启mongo
docker restart mongo

#检查正常后,重启应用
docker restart test_kjmon_1
docker restart kjapi
docker restart kjweb
docker restart test_kjapp_1
docker restart test_kjtcpserver_1

 

 

docker服务器空间满解决方案:??

57G        / 根目录
36G     /var/lib/docker/overlay2
8.8G    /var/lib/docker/containers 容器
2.2G    /var/lib/docker/volumes 使用卷 数据持久化挂载

看上去是/var/lib/docker/overlay2占用很大,你还没法直接删减这里的文件。这就要知道这个文件夹是干什么用的?

 

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐